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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版