sos博 发表于 2020-4-3 11:50:35

内部Flash写2个字节当标志位,用先擦除和解保护吗?

我的程序void flash_burnflag(void)
{
        uint16_t fromapp_flag = 0x0888;
uint32_t FROMAPP_ADDRESS = 0x8007FFE;

        HAL_FLASH_Unlock();//解锁Flash
       
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FROMAPP_ADDRESS, fromapp_flag);

        HAL_FLASH_Lock(); //锁住Flash
}1,上面的程序在一个全新工程,只放这个函数,成功,可以用st的下载程序读出指定内存位置为0x0888
2,但是放在我实际程序APP(实际环境是BOOT+APP)中,
实际程序APP里面有串口DMA接收中断,这个程序里除了flash_burnflag这个函数,没有flash相关操作了,
函数flash_burnflag不论在初始化位置还是串口接收中断里面执行,都不成功,为0000

请问这是为什么呢?
请问需要处理Write protection和erase吗?

yklstudent-1794 发表于 2020-4-8 08:32:22

高级会员了也有这个疑问?

tgw860910 发表于 2020-4-8 08:55:52

每次写操作之前都要先擦除

水晶之泪0517 发表于 2020-4-8 09:21:57

目标地址写之前可以读出来判断一下,如果是全FF就不用擦除,可以直接写

ldptest 发表于 2020-4-8 10:24:59

擦除原理是所有位上置“1”,
写数据是把为“0”的位清0,不能把flash中为“0”的位值“1”

butterflyspring 发表于 2020-4-10 17:12:00

同意楼上大侠们的观点,补充一点,你的程序有"BOOT+APP",推测用了写保护。所以注意写保护不要覆盖到存贮地址。
页: [1]
查看完整版本: 内部Flash写2个字节当标志位,用先擦除和解保护吗?