OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1940|回复: 0

记读写flash sr寄存器遇到的奇葩问题

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2023-2-24
在线时间
3 小时
发表于 2023-7-11 19:34:47 | 显示全部楼层 |阅读模式
判断flash是否繁忙:
  1. int Flash_IsBusy( void )
  2. {
  3.         return FLASH0->sr & 1;
  4. }
复制代码

但是,执行到这里就卡主了,看汇编


参考正点原子的代码,获取SR的值又没问题
  1. static uint8_t stmflash_get_error_status(void)
  2. {
  3.     uint32_t res;
  4.     res = FLASH->SR;

  5.     if (res & (1 << 0))return 1;
  6.     if (res & (1 << 2))return 2;
  7.     if (res & (1 << 4))return 3;
  8.    
  9.     return 0;
  10. }
复制代码


尝试修改代码,这次正常通过:
  1. int Flash_IsBusy( void )
  2. {
  3.         return FLASH0->sr;
  4. }
复制代码


为啥呢?

根据寄存器值的变化:


是LDRB r0,[r0,#0x0C] 这行导致的

如果是直接返回sr的代码,则没有LDRB这行汇编
所以确定是这行导致的

区别在于,这行指令只取了一个字节
于是再写代码验证

        char* p = (void*)&FLASH0->sr;
        char ax = *p;


果然遇到同样的问题(ax要传给函数避免未使用而被优化)
改成int就没问题

所以,结论就是,SR寄存器不能单独访问一个字节、两个字节,要访问就是必须获取整个SR

寄存器值的变化

寄存器值的变化
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 04:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表