OpenEdv-开源电子网

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

cubeide程序仿真直接全速运行不能运行,单步执行进main函数后全速能运行

[复制链接]

30

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2018-2-9
在线时间
117 小时
发表于 2023-2-14 09:18:05 | 显示全部楼层 |阅读模式
10金钱
昨天用cubeide写程序出现一个奇怪问题,加了一个tm1640的数码管驱动程序之后(要用到一个定时器),然后下载进板子,数码管不亮,485也读不出数据,然后就仿真,从一开始就全速运行,还是不亮,然后从头单步执行,一步步进main函数,数码管亮了,485也恢复了,这是什么原因导致的呢,大概率是最后加的这个定时器捣乱,但想不明白为什么,因为我之前就已经有一个定时器在给modbus工作了,也没有死机啊

最佳答案

查看完整内容[请看2#楼]

昨天把us函数改成for循环了,网上复制了一段还是用的__NOP,然后就不死机了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2018-2-9
在线时间
117 小时
 楼主| 发表于 2023-2-14 09:18:06 | 显示全部楼层
阿侑kevin 发表于 2023-2-15 15:09
我用的V6的编译器,空指令不是nop了,空指令容易被编译器优化掉

昨天把us函数改成for循环了,网上复制了一段还是用的__NOP,然后就不死机了
  1. /*
  2. for循环实现延时us
  3. */
  4. void for_delay_us(uint32_t nus)
  5. {
  6. uint32_t Delay = nus * 168/4;
  7. do
  8. {
  9.   __NOP();
  10. }
  11. while (Delay --);
  12. }
复制代码
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2023-2-14 10:21:25 | 显示全部楼层
帮顶           
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-2-14 10:44:28 | 显示全部楼层
把TM1640部分先屏蔽再试一下,一步步定位问题
回复

使用道具 举报

30

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2018-2-9
在线时间
117 小时
 楼主| 发表于 2023-2-14 16:35:47 | 显示全部楼层
阿侑kevin 发表于 2023-2-14 10:44
把TM1640部分先屏蔽再试一下,一步步定位问题

好,晚上回去试下
回复

使用道具 举报

30

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2018-2-9
在线时间
117 小时
 楼主| 发表于 2023-2-14 19:46:36 | 显示全部楼层
阿侑kevin 发表于 2023-2-14 10:44
把TM1640部分先屏蔽再试一下,一步步定位问题

定时器1的初始化没有屏蔽,屏蔽了1640的初始化和向1640写数据的代码,就能正常运行了,1640相关程序如下:
  1. void delay_us(uint16_t us)
  2. {
  3.         uint16_t differ=0xffff-us-5;


  4.         HAL_TIM_Base_Start(&htim1);
  5.         __HAL_TIM_SetCounter(&htim1,differ);
  6.         while(differ < 0xffff-5)
  7.         {
  8.                 differ = __HAL_TIM_GetCounter(&htim1);
  9.         }
  10.         HAL_TIM_Base_Stop(&htim1);

  11. }
  12. void delay_ms(uint16_t nms)
  13. {
  14. uint32_t temp;
  15. SysTick->LOAD = 9000*nms;
  16. SysTick->VAL=0X00;//清空计数器
  17. SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
  18. do
  19. {
  20.   temp=SysTick->CTRL;//读取当前倒计数值
  21. }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
  22.     SysTick->CTRL=0x00; //关闭计数器
  23.     SysTick->VAL =0X00; //清空计数器
  24. }

  25. void TM1640_Start(void)
  26. {
  27.         CLK_H;
  28.         DIO_H;
  29.         delay_us(10);
  30.         DIO_L;
  31.         delay_us(10);
  32.         CLK_L;
  33.         delay_us(10);
  34. }


  35. //void I2Cask(void) //ACK??
  36. //{
  37. //unsigned char timeout = 1;
  38. //CLK_H;
  39. //Delay_5us(5);
  40. //CLK_L;
  41. //while((DIO)&&(timeout<=100))
  42. //{
  43. //  timeout++;
  44. //}
  45. //Delay_5us(5);
  46. //CLK_L;
  47. //}


  48. void TM1640_Stop(void)
  49. {
  50.         DIO_L;
  51.         CLK_H;
  52.         delay_us(10);
  53.         DIO_H;
  54.         delay_us(10);
  55. }

  56. void TM1640_Write_Byte(uint8_t date)
  57. {
  58.         uint8_t i;
  59.         uint8_t Temp;
  60.         Temp=date;
  61.         CLK_L;
  62.         DIO_L;
  63.         for(i=0;i<8;i++)
  64.         {
  65.                 CLK_L;
  66.                 delay_us(2);
  67.                 if(Temp&0x01)
  68.                 {
  69.                         DIO_H;
  70.                         delay_us(10);
  71.                 }
  72.                 else
  73.                 {
  74.                         DIO_L;
  75.                         delay_us(10);
  76.                 }
  77.                 CLK_H;
  78.                 delay_us(1);
  79.                 Temp = Temp >> 1;
  80.         }
  81.         CLK_L;
  82.         DIO_L;
  83. }

  84. void Write_Com(uint8_t date)//发送命令字
  85. {
  86.         TM1640_Start();
  87.         TM1640_Write_Byte(date);
  88.         TM1640_Stop();
  89. }

  90. void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址写入数据
  91. {
  92.         Write_Com(0x44);
  93.         TM1640_Start();
  94.         TM1640_Write_Byte(0xc0|add);
  95.         TM1640_Write_Byte(DATA);
  96.         TM1640_Stop();
  97. }




  98. void cls_TM1640(void)//清屏函数
  99. {
  100.         unsigned char i;
  101.         Write_Com(0x40);//连续地址模式
  102.         TM1640_Start();
  103.         TM1640_Write_Byte(0xc0);
  104.         for(i=0;i<16;i++)
  105.                 TM1640_Write_Byte(0x00);
  106.         TM1640_Stop();
  107. }


  108. void init_TM1640(void)
  109. {
  110.         cls_TM1640();
  111.         Write_Com(0x8f);//亮度
  112. }
复制代码
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-2-15 10:25:26 | 显示全部楼层
ccciron 发表于 2023-2-14 19:46
定时器1的初始化没有屏蔽,屏蔽了1640的初始化和向1640写数据的代码,就能正常运行了,1640相关程序如下 ...

你用定时器和systick做硬延时还不如直接for做计数循环
回复

使用道具 举报

30

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2018-2-9
在线时间
117 小时
 楼主| 发表于 2023-2-15 11:23:18 | 显示全部楼层
阿侑kevin 发表于 2023-2-15 10:25
你用定时器和systick做硬延时还不如直接for做计数循环

行,我下午改一下试试,对了,HAL库里有空操作指令nop么
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-2-15 15:09:45 | 显示全部楼层
ccciron 发表于 2023-2-15 11:23
行,我下午改一下试试,对了,HAL库里有空操作指令nop么

我用的V6的编译器,空指令不是nop了,空指令容易被编译器优化掉
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 15:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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