试图写入闪存以存储某些配置。我使用的是一个STM32F446ze,其中我想使用最后的16 an扇区作为存储。
当我擦除VOLTAGE_RANGE_3
扇区时,我指定了。VOLTAGE_RANGE_3
映射到:
#define FLASH_VOLTAGE_RANGE_3 0x00000002U /*!< Device operating range: 2.7V to 3.6V */
当我使用FLASH_TYPEPROGRAM_WORD
写闪存时,我收到了一个错误。错误是HAL_FLASH_ERROR_PGP
。阅读参考手册,我读到,这与使用错误的并行/电压级别有关。
从参考手册上我可以读到
此外,在参考手册中,我可以读到:
编程错误:不允许将数据编程到跨越128位行边界的Flash内存中。在这种情况下,不执行写操作,并且在FLASH_SR寄存器中设置程序对齐错误标志(PGAERR)。写访问类型(字节、半字、字或双字)必须对应所选择的并行性类型(x8、x16、x32或x64)。如果不执行,则不执行写入操作,并在FLASH_SR寄存器中设置程序并行错误标志(PGPERR)。
所以我想:
但是,这一行给了我一个错误(在解锁闪存之后)。
uint32_t sizeOfStorageType = ....; // Some uint I want to write to flash as test
HAL_StatusTypeDef flashStatus = HAL_FLASH_Program(TYPEPROGRAM_WORD, address++, (uint64_t) sizeOfStorageType);
auto err= HAL_FLASH_GetError(); // err == 4 == HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag
while (flashStatus != HAL_OK)
{
}
但是当我开始写字节的时候,它会变的很好。
uint8_t *arr = (uint8_t*) &sizeOfStorageType;
HAL_StatusTypeDef flashStatus;
for (uint8_t i=0; i<4; i++)
{
flashStatus = HAL_FLASH_Program(TYPEPROGRAM_BYTE, address++, (uint64_t) *(arr+i));
while (flashStatus != HAL_OK)
{
}
}
我的问题:
TYPEPROGRAM
?因此,擦除后,我只能写字节,或,半字,或,字,或双字?VOLTAGE_RANGE_3
擦除发布于 2021-06-27 12:50:58
这看起来像是一个数据对齐错误,但是不--参考手册中提到的与128位闪存行相关的错误。这个词可能只与双字书写有关,与你的情况无关。
如果您想一次编程4个字节,那么您的address
需要对齐字,这意味着它需要被4整除。此外,address
不是一个uint32_t*
(指针),它是一个原始uint32_t
,因此address++
将它增加1,而不是4。据我所知,Cortex M4核心会将总线上未对齐的访问自动转换为多个较小大小的对齐访问,但这违反了闪存并行规则。
顺便说一句,只要正确对齐,执行字节、半字和字写的混合操作是完全有效的。另外,与F0、F1和F3系列的flash硬件不同,您可以尝试覆盖以前编写的位置,而不会导致错误。0->1位更改被忽略.
https://stackoverflow.com/questions/68151043
复制相似问题