OpenEdv-开源电子网

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

请教freertos系统中函数里的延时问题

[复制链接]

12

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2874
金钱
2874
注册时间
2020-4-30
在线时间
226 小时
发表于 2025-9-4 11:00:22 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 chen12345678 于 2025-9-4 13:15 编辑

最近接手一个项目,用的freertos系统,遇到一个问题,在任务A中有个函数B,想要在函数B里做个延时,让电机运转一段时间然后关闭。具体是启动电机后打开定时器,定时一段时间进入中断,中断中关闭电机,这套在裸机中正常运行。把这段代码移植到freertos系统却发现运行不了,电机根本不动,分步仿真后打断点倒可以实现,不能理解。想请教下各位大神,有办法解决么,freertos系统新接触的,不熟
  1. void  TIM2_Int_init(u16 arr,u16 psc)
  2. {
  3.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  4.         NVIC_InitTypeDef  NVIC_InitStructure;

  5.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


  6.         TIM_TimeBaseStructure.TIM_Period = arr;          
  7.         TIM_TimeBaseStructure.TIM_Prescaler =psc;   
  8.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  9.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  10.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  11.        
  12.        
  13.         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

  14.        
  15.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  
  16.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
  17.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  18.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  19.         NVIC_Init(&NVIC_InitStructure);


  20.         TIM_Cmd(TIM2,DISABLE);
  21.         TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
  22. }


  23. void  TIM2_IRQHandler(void)   //TIM2中断
  24. {
  25.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  26.         {
  27.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  28.                 TIM_Cmd(TIM2,DISABLE);//关闭定时器2
  29.                 TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
  30.                 if(ballflag==1)
  31.                 {
  32.                         TIM_SetCompare1(TIM5, 0);
  33.                         ballflag=0;
  34.                 }
  35.         }
  36. }


  37. void  my_delay_ms(u16 ms)
  38. {
  39.         TIM2_Int_init(7199,(ms*10)-1);
  40.         TIM_Cmd(TIM2,ENABLE);
  41.         TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);       
  42. }



  43. static void  vTaskRobCtl(void *pvParameters)
  44. {       
  45.     while(1)
  46.     {
  47.                 updatePress_1();
  48.                 updatePress_2();
  49.                 updatePress_3();       
  50.                 bldcMotorLoop()        ;       
  51.                 beep_loop();                                               
  52.                 keyScan();
  53.                 power_task_hand();                       
  54.                 SwitchLoop();                               
  55.                 alarm_loop();               
  56.                 vTaskDelay(10);//10ms
  57.     }
  58. }


  59. void  bldcMotorLoop(void)
  60. {       
  61.         if(BallStartFlag==1)//启动
  62.         {
  63.                 TIM_SetCompare1(TIM5, 1650);
  64.                 ballflag=1;
  65.                 my_delay_ms(100);               
  66.         }
  67. }
复制代码


最佳答案

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

看起来不像"中断不能正常启动",像是一启动就中断,建议利用IO翻转,示波器测一下TIM2启动到进入中断的时间.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

3452

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8877
金钱
8877
注册时间
2020-5-11
在线时间
4396 小时
发表于 2025-9-4 11:00:23 | 显示全部楼层
chen12345678 发表于 2025-9-4 15:45
这段代码用在裸机上没问题,是用了很久的
就是用在freertos系统中,出现问题,就像中断不能正常启动,像 ...

看起来不像"中断不能正常启动",像是一启动就中断,建议利用IO翻转,示波器测一下TIM2启动到进入中断的时间.
专治疑难杂症
回复

使用道具 举报

13

主题

3452

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8877
金钱
8877
注册时间
2020-5-11
在线时间
4396 小时
发表于 2025-9-4 11:39:09 | 显示全部楼层
上代码.
回复

使用道具 举报

12

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2874
金钱
2874
注册时间
2020-4-30
在线时间
226 小时
 楼主| 发表于 2025-9-4 13:17:05 | 显示全部楼层

代码已加
回复

使用道具 举报

13

主题

3452

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8877
金钱
8877
注册时间
2020-5-11
在线时间
4396 小时
发表于 2025-9-4 13:39:33 | 显示全部楼层
本帖最后由 LcwSwust 于 2025-9-4 13:46 编辑

虽然我不了解freertos,但也没看出明显的问题.
bldcMotorLoop函数是确定进入了的对吧?
也就是说"if(BallStartFlag==1)//启动"这句可能不成立?
你的代码也没看到对BallStartFlag的赋值,自行检查一下.
能否在这个if条件成立时让某个IO翻转然后示波器看一下波形?
TIM_SetCompare1(TIM5, 1650); 这句就是启动电机?
那么你的问题并不是"延时问题",而是在延时之前.
若怀疑是延时造成的问题,那你把延时注释掉啊.
专治疑难杂症
回复

使用道具 举报

12

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2874
金钱
2874
注册时间
2020-4-30
在线时间
226 小时
 楼主| 发表于 2025-9-4 14:16:25 | 显示全部楼层
本帖最后由 chen12345678 于 2025-9-4 14:51 编辑
LcwSwust 发表于 2025-9-4 13:39
虽然我不了解freertos,但也没看出明显的问题.
bldcMotorLoop函数是确定进入了的对吧?
也就是说"if(Ball ...

BallStartFlag这个标志位是显示屏下达的开关命令,跟这边的控制没关系,也就是BallStartFlag可以看作一直是为1的。

TIM_SetCompare1(TIM5, 1650); 这句就是启动电机
1.png
我仿真的时候,这个断点是启动,正常
2.png
这个断点是关闭,也正常
就是全速运行的时候,电机会极短时间启动下,然后停掉,再无反应

回复

使用道具 举报

13

主题

3452

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8877
金钱
8877
注册时间
2020-5-11
在线时间
4396 小时
发表于 2025-9-4 15:16:00 | 显示全部楼层
本帖最后由 LcwSwust 于 2025-9-4 15:18 编辑
chen12345678 发表于 2025-9-4 14:16
BallStartFlag这个标志位是显示屏下达的开关命令,跟这边的控制没关系,也就是BallStartFlag可以看作一直 ...

哦,这么看来还真是延时的问题.问题可能在于你的定时器启动时未对计数值赋值(TIM2_CNT).
还有可能my_delay_ms中定时器启动与中断允许的顺序不对.





专治疑难杂症
回复

使用道具 举报

12

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2874
金钱
2874
注册时间
2020-4-30
在线时间
226 小时
 楼主| 发表于 2025-9-4 15:45:19 | 显示全部楼层
LcwSwust 发表于 2025-9-4 15:16
哦,这么看来还真是延时的问题.问题可能在于你的定时器启动时未对计数值赋值(TIM2_CNT).
还有可能my_dela ...

这段代码用在裸机上没问题,是用了很久的
就是用在freertos系统中,出现问题,就像中断不能正常启动,像被打断一样
回复

使用道具 举报

12

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2874
金钱
2874
注册时间
2020-4-30
在线时间
226 小时
 楼主| 发表于 2025-9-7 13:41:44 | 显示全部楼层
本帖最后由 chen12345678 于 2025-9-7 13:43 编辑
LcwSwust 发表于 2025-9-4 16:05
看起来不像"中断不能正常启动",像是一启动就中断,建议利用IO翻转,示波器测一下TIM2启动到进入中断的时间. ...

问题找到了,是任务调用的太快了,本次定时才开始,下次任务又执行了,定时器重新初始化了,看上去就像中断了,实际上还没进到中断。感谢大神提供思路。
回复

使用道具 举报

13

主题

3452

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8877
金钱
8877
注册时间
2020-5-11
在线时间
4396 小时
发表于 2025-9-7 14:42:44 | 显示全部楼层
chen12345678 发表于 2025-9-7 13:41
问题找到了,是任务调用的太快了,本次定时才开始,下次任务又执行了,定时器重新初始化了,看上去就像中 ...

解决了就好
专治疑难杂症
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-9-23 14:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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