STM32F072芯片遇到一个字节对齐的问题
hi,大神们好:我遇到一个有点奇怪的问题, 当对flash中的地址执行读操作的时候,发现奇数地址按照2字节读会崩溃。
具体代码如下:
#define PAGE1_BASE_ADDRESS 0x0800F800
uint8_t read_platform_sn(void)
{
uint16_t agc_tmp_a = 0;
agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+0);
agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+2);
agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+3);
agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+4);
agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+5);
agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+6);
agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+7);
}
int main(void)
{
uint16_t agc_tmp = 0;
FLASH_Unlock();
agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+0);
agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+1);
agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+2);
agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+3);
agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+4);
agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+5);
agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+6);
agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+7);
read_platform_sn();
while(1)
{
;
}
}
1. main函数内 FLASH_Unlock(); 之后,然后对PAGE1_BASE_ADDRESS 开始的8个字节进行按照2字节读取,没有任何问题。
2. 进入read_platform_sn 函数里,依然对PAGE1_BASE_ADDRESS 开始的8个字节进行按照2字节读取,但是会崩溃在奇数地址上。
我发现规律是8条对FLASH的访问,在main函数里都不会死。但是放到read_platform_sn 函数里就会死在奇数地址上。
求大神指点!!
看cortex m0的手册 最后这个问题看汇编代码发现:
main 函数里的代码被优化掉了,但是read_platform_sn 函数里的没有被优化掉。M0不允许对奇数地址访问所以出了异常,谢谢! wm20031015 发表于 2017-7-28 17:47
看cortex m0的手册
已经解决,谢谢!! 本帖最后由 xmshao 于 2017-10-20 14:53 编辑
是对齐的问题。
页:
[1]