__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和MCP2515通信
求助:PMSM电机编码器线数(分辨率)为80000线,超过MCSDK5.4.8软件所能设置的最大线数65535,请问如何解决
STM32G473VET6同时使用6个片上放大器(OPAMP)的PGA加外部偏置模式,引脚位置让差分信号走线分离,信号有无较大影响?
STM32 SPI从机用DMA方式实现全双工,数据传输过程中出错。
STM32G4 CAN无法检测到bus-off状态?
电能变换
数字电源-G474(三项维也纳):MCU两处外部时钟源设置为 经过运放检测三项电流信号的A B C相的疑问。
stm32g474 板卡偶发flash的某块代码区被擦除
L99H92 的驱动问题?
STM32的H5/U5系列处理器内置运放支持负压运算吗?比如输入-1V,放大倍数为2时输出-2V
我刚才测试发现,基于常量方式写FF还有局限性,有坑~!。比方这样定义常量,然后不擦除就写,行不通。我第一个双字不是全F,后面几个都是全F,不擦的话都写不了。
如果像下面这里有,前两个双字可以写,后面的也写不了。
所以你要换个写法。
==》这个地方我要补充下。
~~~~应该是当时我误会了,没有坑的说法。 通过常量定义预留的全FF单元是后期可以改写的。我当时是因为对非FF单元做写操作出错了,导致其他地方都没法写了,是误会。后来我有测试了,只要是通过常量定义预留的全FF单元都是可以改写的。比方下图贴出的情形。【当然,基本编程规则和对齐都是要遵守的】
我刚基于G474RE开发板和现有例程,对第254页做了数据写操作,写了16个字节。
![image.png](data/attachment/forum/202408/02/111301f2v3xipsu48bqqic.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300
"image.png")
可以成功擦、写。 这里因为到第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编程遵守双字对齐是必须的了。