芯片型号是STM32L431RC,用HAL库往flash里写入一个双字无法成功。stm32l4 系列只能双字写,或者fast写(写一个ROW,另外我试了这种方式也没成功)。 代码如下: __disable_irq(); HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGAERR | FLASH_FLAG_WRPERR); FLASH_PageErase(100, FLASH_BANK_1); //stm32l431一页2048字节,100页对应0x8032000,FLASH容量256kb,也没有超 //只有bank1 ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x8032000, 0x0102030405060708); printf("errcode = %x\n", pFlash.ErrorCode); HAL_FLASH_Lock(); __enable_irq(); 实验现象是:返回错误代码0xA0,查数据手册是 PGAERR 和 PGSERR。数据手册说PGSERR是在PGAERR置位的情况下置位的,所以错误原因应该是PGAERR. 可是写入数据的地址是0x803200,是8的倍数。 有没有人知道要怎么样才能写成功? |
如果用 FLASH_PageErase 这个函数,那在后面加一句
CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB))关CR寄存器的PER位也行
是4楼给我的思路,我发现他提供的HAL包中的代码,用的擦除函数是HAL_FLASHEx_Erase,去看函数源码,
发现里面调用了FLASH_PageErase和FLASH_MassErase这两个函数(针对不同擦除方式)
在FLASH_PageErase这个函数后有CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB))
在FLASH_MassErase这个函数后有CLEAR_BIT(FLASH->CR, (FLASH_CR_MER1))
所以问题是函数用错了,导致该清零的位没有清零。
另外3楼说的,可能是您理解错了,stm32的内存控制寄存器平时是锁着的,操作内存时是要先解锁,操作完了再上锁,所以顺序是对的。
评分
查看全部评分
评分
查看全部评分
FLASH_WaitForLastOperation(FLASH_WAITETIME); //等待上次操作完成
CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
评分
查看全部评分
评分
查看全部评分