嵌入式技术论坛
直播中

向日葵的花季

8年用户 1186经验值
擅长:电源/新能源
私信 关注
[问答]

硬件定时器2us回调失败但3us回调成功是何原因

  使用RTT4.10 硬件为STM32F429IGT6。

  使用官方例程硬件。

  定时器修改定时器超时值,计数频率改为1m,定时器为tim14

  #define HWTIMER_DEV_NAME “timer14” /* 定时器名称 */

  rt_uint32_t freq = 1000000; /* 计数频率 */

  /* 设置定时器超时值为5s并启动定时器 */

  timeout_s.sec = 0; /* 秒 */

  timeout_s.usec = 1; /* 微秒 */

  /**

  * [url=home.php?mod=space&uid=2666770]@Brief[/url] 定时器超时回调函数

  * [url=home.php?mod=space&uid=3142012]@param[/url] None

  * @retval None

  * [url=home.php?mod=space&uid=1902110]@NOTE[/url] None

  */

  static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)

  {

  HAL_GPIO_TogglePin(DEBUG_GPIO_Port,DEBUG_Pin);

  return 0;

  }

  回调函数中翻转电平并使用逻辑分析仪查看波形没有,debug仿真查看没有进入回调函数中。

  调整为3us,得到波形。

  问一下这是为什么?是RTT系统的问题,还是硬件不支持

  另外,调整时间为5us。开了多个线程,会导致5us定时器有时候会卡顿,到30us左右。

  是不是因为切换上下文会关闭总中断的缘故?

  我这样使用定时器回调函数中进行S型加减速控制电机。使用主从定时器控制脉冲个数。

  读取脉冲个数没问题。但是发送脉冲个数偶尔会有偏差。原因就是us级定时器被打断了!!11

回帖(4)

张桂兰

2022-9-7 11:32:58
这么频繁的中断,就别用回调函数了,直接按照裸机写吧,HAL_GPIO_TogglePin(DEBUG_GPIO_Port,DEBUG_Pin);
把这句还可以修改为寄存器更快些
举报

向日葵的花季

2022-9-7 11:33:15
那就是RTT自身的问题咯?
举报

张桂兰

2022-9-7 11:33:25
刚刚也在看一个 us级别的驱动,RTOS的 systick 一般在 1ms
搞 us的东西,感觉跟 RTOS 不配
举报

向日葵的花季

2022-9-7 11:33:36
我现在发现了,是RTT的硬件定时器框架执行us级的时候执行不过来,卡了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分