
__attribute__((section(".ROM_D0"))) static const uint64_t Key_Flash[1]={0xFFFFFFFFFFFFFFFFUL}; __IO uint64_t Key_ID=0x1234567812345678; __IO uint64_t Key=*(__IO uint64_t*)Key_Flash; __HAL_FLASH_PREFETCH_BUFFER_DISABLE(); //关闭FLASH预取缓冲区 if(0xFFFFFFFFFFFFFFFFUL==Key) { HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR); HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, (uint32_t)Key_Flash, Key_ID); HAL_FLASH_Lock(); } |
STM32的上电启动过程
STM32中如何实现数据加密
STM32的I2S外设
STM32 双ADC同步注入转换模式,模块ADC2没有数据。
STM32G431 FDCAN当普通can使用,拔掉连接的can设备,为什么一直没能触发FIFO满标志?
加快STM32G473上电时间
STM32G431 flash和can为什么没有LL库?
STM32 CAN设备掉线,程序发送卡死的问题解决办法?
STM32G431FDCAN当作普通can使用的例程?
STM32G474 利用高精度HRTIM怎么捕获外部波形计算波形频率,想用STM32Cube配置工程代码,网上查了很多资料,没有看到这个用法。希望大神指导一下。
我刚才测试发现,基于常量方式写FF还有局限性,有坑~!。比方这样定义常量,然后不擦除就写,行不通。我第一个双字不是全F,后面几个都是全F,不擦的话都写不了。
如果像下面这里有,前两个双字可以写,后面的也写不了。
所以你要换个写法。
==》这个地方我要补充下。
~~~~应该是当时我误会了,没有坑的说法。 通过常量定义预留的全FF单元是后期可以改写的。我当时是因为对非FF单元做写操作出错了,导致其他地方都没法写了,是误会。后来我有测试了,只要是通过常量定义预留的全FF单元都是可以改写的。比方下图贴出的情形。【当然,基本编程规则和对齐都是要遵守的】
我刚基于G474RE开发板和现有例程,对第254页做了数据写操作,写了16个字节。

可以成功擦、写。 这里因为到第254页,我将BANK号改为BANK2了,其它都沿用现有写法。
我就是参考了TM32Cube_FW_G4_V1.6.0\Projects\NUCLEO-G474RE\Examples\FLASH\FLASH_EraseProgram这个例程,还进行了双BANK升级,写入成功,但具体到这里的程序代码,要求写入单个64位数据,就会失败,调了很长时间也没成功。区别是,这里是在程序执行BANK中写入,升级是在后备BANK中写入。
建议仔细阅读函数的说明。
TM32Cube_FW_G4_V1.6.0\Projects\NUCLEO-G474RE\Examples\FLASH\FLASH_EraseProgram
这个操作肯定是没问题的,我这边测试过了的。
你注意在调用函数时,参数别给错了,到底地址指针还是地址数据这些小细节要注意。
还有,这个例程是默认根据双BANK设计的,当地址范围超过1个bank后,它的页地址又重0开始计算的,这时基于现有例程的话,BANK号
改为FLASH_BANK_2,这个地方也要注意。
[md]那你检查下if条件到底能不能成立?再就是要写的地方是否为擦过了。
我的代码,1.没有擦除,因为要写的地址里是0xFFFFFFFFFFFFFFFF;2. 只定义了1个数据;3. 要写的地址是`0x08007bb0`在BANK1。所以才失败吗?
写之前应该擦除过的就行,不能是写过的。
如果基于常量定义双字为全F,经测试 写入是没有问题的。当然,还要注意地址的双字对齐。
2、你定义几个变量按理跟这个写没啥关系;
3、bank1 bank2都是可以写的。你的地址目前落在第15页,我基于例程稍作调整进行验证没问题。
while (Address < 0x08007bb0+16)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, DATA_64) ==HAL_OK)
{
Address = Address + 8; /* increment to next double word*/
}
else
{。。。。。。。。。。。
注意这是的bank编号是BANK1.
[md]会不会写保护,所以失败?
你通过STM32CubeProgrammer连接后看看,或者自己代码里读相关页的些保护标志位来判断。
没有任何写保护
[md]看错误代码说是要写的FLASH地址与双字不对齐,但系统分配的地址是对齐的,整不会了
呵呵 这里的flash编程遵守双字对齐是必须的了。