STM32F407中Program Alignment Error Flag(PGAERR)含义及触发场景咨询
STM32F407 FLASH PGAERR(Program Alignment Error Flag)触发场景解析
你之前的误解核心是把「写入范围不能跨越128位行边界」当成了「单次写入数据不能超过128位」,这是完全错误的。STM32F407的Flash编程限制仅针对地址边界,和单次写入的数据大小无关——哪怕你只写1字节,只要这个写入操作的地址范围跨了128位(16字节)的行边界,就会触发PGAERR,写入直接失效。
首先明确:STM32F407的Flash以16字节(128位)为一个编程行单元,每个行的起始地址是16字节对齐的(比如0x08000000、0x08000010、0x08000020……地址末尾两位为00、10、20等16进制值)。
以下是具体触发PGAERR的场景:
- 单次写入跨16字节边界:比如从地址
0x0800000E开始写入4字节,结束地址为0x08000011——这个范围跨越了0x08000010这个128位行的边界,会立即触发PGAERR。 - 连续写入时跨边界:比如循环写入多个字节,前一次写到
0x0800000F,下一次从0x08000010开始写是合法的,但如果某次写入从0x0800000C开始写6字节(覆盖到0x08000011),就会触发错误。 - 结构体/数组批量写入地址未对齐:比如一个结构体起始地址为
0x0800000A,总大小10字节,地址范围覆盖0x0800000A到0x08000013,跨了0x08000010的边界,此时批量写入该结构体就会触发PGAERR。 - 非对齐指针写入:比如强制将
uint32_t*指针指向0x0800000E,通过该指针写入4字节数据,虽然单次写的是4字节,但地址跨了16字节边界,同样会触发错误。
总结:STM32F4的Flash编程硬件要求,每次编程操作的所有数据必须完全落在同一个16字节的行单元内,只要违反这个规则,就会触发PGAERR,写入操作不执行,同时FLASH_SR寄存器的PGAERR位被置位。
内容的提问来源于stack exchange,提问作者abdo Salm
相关产品推荐
相关产品推荐

