新手上路
- 积分
- 23
- 金钱
- 23
- 注册时间
- 2023-2-24
- 在线时间
- 3 小时
|
判断flash是否繁忙:
- int Flash_IsBusy( void )
- {
- return FLASH0->sr & 1;
- }
复制代码
但是,执行到这里就卡主了,看汇编
参考正点原子的代码,获取SR的值又没问题
- static uint8_t stmflash_get_error_status(void)
- {
- uint32_t res;
- res = FLASH->SR;
- if (res & (1 << 0))return 1;
- if (res & (1 << 2))return 2;
- if (res & (1 << 4))return 3;
-
- return 0;
- }
复制代码
尝试修改代码,这次正常通过:
- int Flash_IsBusy( void )
- {
- return FLASH0->sr;
- }
复制代码
为啥呢?
根据寄存器值的变化:
是LDRB r0,[r0,#0x0C] 这行导致的
如果是直接返回sr的代码,则没有LDRB这行汇编
所以确定是这行导致的
区别在于,这行指令只取了一个字节
于是再写代码验证
char* p = (void*)&FLASH0->sr;
char ax = *p;
果然遇到同样的问题(ax要传给函数避免未使用而被优化)
改成int就没问题
所以,结论就是,SR寄存器不能单独访问一个字节、两个字节,要访问就是必须获取整个SR
|
-
寄存器值的变化
|