硬汉嵌入式论坛

 找回密码
 立即注册
查看: 378|回复: 3
收起左侧

[Flash] 请高手指教:H723的flash作扇区擦除后,再去读,内容还在,怎样清除cache

[复制链接]

5

主题

11

回帖

31

积分

新手上路

积分
31
发表于 2023-8-11 09:31:08 | 显示全部楼层 |阅读模式
STM32新手,在H723上用内部flash的一个sector作参数保存。读写正常,但是擦除扇区之后,再读,数据还在,但是重新启动后读,发现实际是擦除了。应该是数据被cache了。
但是在读之前调用
SCB_CleanDCache_by_Addr((uint32_t *)addr, len);
还是一样,想不通问题在哪里?请高手指教

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2023-8-11 10:38:24 | 显示全部楼层
1、HAL库需要使用比较新的版本。之前版本Flash操作有bug。
2、Flash没有SCB_CleanDCache_by_Addr操作,SCB_InvalidateICache_by_Addr,表示更新ICache数据到最新值。
回复

使用道具 举报

5

主题

11

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-8-11 11:21:32 | 显示全部楼层
多谢硬汉回复。
改用SCB_InvalidateICache_by_Addr内容也还是不刷新,代码贴出来

这个是freertos的cli命令:dump 0x080e0000 32
功能:按照uint32_t的格式打印从0x080e0000开始的32个word
BaseType_t Dump(char *pcWriteBuffer, size_t xWriteBufferLen,
                                const char *pcCommandString)
{
        BaseType_t len1, len2;
        char *str1 = FreeRTOS_CLIGetParameter(pcCommandString, 1, &len1);
        char *str2 = FreeRTOS_CLIGetParameter(pcCommandString, 2, &len2);
        if (str1 == NULL || len1 == 0 || str2 == NULL || len2 == 0)
        {
                CmdWrBuf("Parameters error\n");
        }
        else
        {
                unsigned long addr = strtoul(str1, NULL, 0);
                unsigned long len = strtoul(str2, NULL, 0);
                if (len == 0 || len > 1024)
                {
                        printf("Parameters error\n");
                }
                else
                {
                        addr &= 0xFFFFFFFC;        // 32-bit aligned
                        SCB_InvalidateICache_by_Addr((uint32_t *)addr, len);
                        PrintUint32((const uint32_t *)addr, len);
                }
        }
        return pdFALSE;
}

打印函数:
void PrintUint32(const uint32_t *_buf, int len)
{
        char bar[16 * 9 + 5 + 1];
        memset(bar, '-', sizeof(bar) - 1);
        bar[sizeof(bar) - 1] = 0;
        puts(bar);
        int lines = (len + 15) / 16;
        int index = 0;
        for (int s = 0; s < lines; s++)
        {
                printf("\r\n%03X_|", s*4);
                int slen = len - index;
                if (slen >= 16)
                {
                        slen = 16;
                }
                for (int k = 0; k < slen; k++)
                {
                        printf("%08X|", _buf[index]);
                        index++;
                }
        }
}

执行:

step 1:运行dump显示当前的内容,有三条记录,每条记录8个word
000_|55AA33CC|0001C200|00009600|00004B00|00004B00|1CC58885|FFFFFFFF|FFFFFFFF|55AA33CC|0001C200|00009600|00004B00|00004B00|1CC58885|FFFFFFFF|FFFFFFFF|
004_|55AA33CC|0001C200|00009600|00004B00|00004B00|1CC58885|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|

step2:擦除

step 3:运行dump显示当前的内容,还是有三条记录,每条记录8个word
000_|55AA33CC|0001C200|00009600|00004B00|00004B00|1CC58885|FFFFFFFF|FFFFFFFF|55AA33CC|0001C200|00009600|00004B00|00004B00|1CC58885|FFFFFFFF|FFFFFFFF|
004_|55AA33CC|0001C200|00009600|00004B00|00004B00|1CC58885|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|

step 4:复位

step 5:运行dump显示当前的内容,只有一条,每条记录8个word,因为复位后,发现flash是全FF,就把缺省设置写进去。这说明flash在step2确实被擦除了
000_|55AA33CC|0001C200|00009600|00004B00|00004B00|1CC58885|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|
004_|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|

问题在step 3,擦除之后再次打印,仍然是之前的内容,没有实际从擦除后的flash读取。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2023-8-11 11:30:00 | 显示全部楼层
具体你再查查你那边把,这个是我们的。

V7-049_内部Flash模拟EEPROM.rar (11.58 MB, 下载次数: 8)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 13:31 , Processed in 0.262992 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表