你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F072芯片遇到一个字节对齐的问题

[复制链接]
huochaosuma 提问时间:2017-7-28 16:27 /
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 函数里就会死在奇数地址上。




求大神指点!!



收藏 评论4 发布时间:2017-7-28 16:27

举报

4个回答
wm20031015 回答时间:2017-7-28 17:47:38
看cortex m0的手册
huochaosuma 回答时间:2017-7-29 17:46:15
最后这个问题看汇编代码发现:
main 函数里的代码被优化掉了,但是read_platform_sn 函数里的没有被优化掉。M0不允许对奇数地址访问所以出了异常,谢谢!
huochaosuma 回答时间:2017-7-29 17:46:31

已经解决,谢谢!!
xmshao 回答时间:2017-7-31 16:06:31
本帖最后由 xmshao 于 2017-10-20 14:53 编辑

是对齐的问题。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版