OpenEdv-开源电子网

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

调试过程发现程序不按语法运行 人蒙了

[复制链接]

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2019-6-14
在线时间
40 小时
发表于 2025-4-10 15:19:52 | 显示全部楼层 |阅读模式
1金钱
本人调试FLASH程序,避免FLASH一直处于忙状态,程序卡死,将FLASH忙状态程序,加入了超时退出功能;
调试过程中发现无论TimeOUT是否大于0x1000,程序都会进入break 断点;
请论坛的兄弟姐妹帮忙分析下,自己分析了一下午 分析蒙了;
  1. /********************************************************************************
  2. 函数名称: SPI_FLASH_WaitForBusy
  3. 功    能: W25Q16 SPIFLASH 等待设备空闲
  4. 参    数: void
  5. 返 回 值: void
  6. 作    者:
  7. *********************************************************************************/
  8. void SPI_FLASH_WaitForBusy(void)
  9. {
  10.         uint8_t ReturnValue;
  11.         TimeOUT=0x0000;
  12.     do
  13.     {
  14.         ReturnValue = SPI_FLASH_ReadStatusRegister(W25Q_ReadStatusReg1);
  15.         ReturnValue = ReturnValue & WIP_FLAG;//1  WIP_FLAG=0x01
  16.                 TimeOUT++;
  17.                 if(TimeOUT > 0x1000)//超出100ms 直接退出
  18.                 {
  19.                         break;
  20.                 }
  21.     }
  22.     while(ReturnValue!=0);// check the BUSY bit  0x01代表flash忙 0x00代表flash空闲
  23. }
复制代码




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8604
金钱
8604
注册时间
2020-5-11
在线时间
4026 小时
发表于 2025-4-10 16:13:35 | 显示全部楼层
专治疑难杂症
回复

使用道具 举报

9

主题

251

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1360
金钱
1360
注册时间
2014-11-25
在线时间
185 小时
发表于 2025-4-10 16:27:25 | 显示全部楼层
看下break位置的汇编
回复

使用道具 举报

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2019-6-14
在线时间
40 小时
 楼主| 发表于 2025-4-11 08:37:16 | 显示全部楼层
LcwSwust 发表于 2025-4-10 16:13
TimeOUT 在哪定义的

TimeOUT定义的全局变量
回复

使用道具 举报

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2019-6-14
在线时间
40 小时
 楼主| 发表于 2025-4-11 09:34:19 | 显示全部楼层
godark 发表于 2025-4-10 16:27
看下break位置的汇编
  1.    187:                 if(TimeOUT > 0x1000)//超出100ms 直接退出
  2.    188:                 {
  3. 0x0000D9A8 4608      MOV           r0,r1
  4. 0x0000D9AA 8800      LDRH          r0,[r0,#0x00]
  5. 0x0000D9AC F5B05F80  CMP           r0,#0x1000
  6. 0x0000D9B0 DD00      BLE           0x0000D9B4
  7.    189:                         break;
  8.    190:                 }
  9.    191:     }
  10. 0x0000D9B2 E001      B             0x0000D9B8
  11.    192:     while(ReturnValue!=0);// check the BUSY bit  
  12. 0x0000D9B4 2C00      CMP           r4,#0x00
  13. 0x0000D9B6 D1EC      BNE           0x0000D992
  14.    189:                         break;
  15.    190:                 }
  16.    191:     }
  17.    192:     while(ReturnValue!=0);// check the BUSY bit  
  18. 0x0000D9B8 BF00      NOP           
  19.    193: }
复制代码
回复

使用道具 举报

14

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
583
金钱
583
注册时间
2018-11-2
在线时间
118 小时
发表于 2025-4-11 17:26:20 | 显示全部楼层
把优化关了就好了
回复

使用道具 举报

233

主题

960

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1811
金钱
1811
注册时间
2011-10-9
在线时间
229 小时
发表于 6 天前 | 显示全部楼层
本帖最后由 simms01 于 2025-4-15 11:41 编辑

if(TimeOUT > 0x1000)//超出100ms 直接退出   

改为    if(TimeOUT > = 0x1000)//超出100ms
再不行

改为  
if(TimeOUT > = 0x1000)
{
ReturnValue=0;
break;
}
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-11-9
在线时间
12 小时
发表于 4 天前 | 显示全部楼层
你的TimeOUT ++直接是在DO WIHLE里一直执行,并没有额外的延时,你能确定0x1000是有100mS?
另外正常情况下,FLASH的擦写操作根据操作类型不同,延时时间不一样,具体看数据手册。
回复

使用道具 举报

8

主题

559

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2877
金钱
2877
注册时间
2016-5-13
在线时间
182 小时
发表于 4 天前 | 显示全部楼层
本帖最后由 电脑小白 于 2025-4-18 11:30 编辑

变量声明的时候加 volatile ,比如:volatile uint16_t  timerout=0;
另外,do while之间要加一个delay_us(2);才是对的哦。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 前天 20:28 | 显示全部楼层
开优化了么?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-21 10:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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