STM32 定时器单次延时

这几天开始准备要要利用网络上的资源,移植modbus master的library。CSDN以及Amos的论坛上都有例子。但是我想移植的例子,却是基于STM32的标准库。初略的想想,应该不算难。于是动手开始移植。但是有一个功能,却卡住了。

在Modbus里,判定帧结束,是利用时间的。这个时间,和波特率是息息相关的。一般是3.5个byte的时间。这个一般是使用一个专用的定时器来实现的。但是这个定时器,在每次接收完一个字符之后,开始运行,但是却无需周期性运行,并且该定时器,要求的精度较高,一般采用us级的分辨率。

由于参考的例子,是采用标准库写的,无法照抄,因此,只能自己写了。测试的方法大致上如下:

1. 等待某个按键按下

2. 将另一个IO口置高,并且开启timer17(看17比较简单)

3.等待按键释放

4. 在对应的定时器中断里,将置高的IO口置低。

5. 通过测量IO口的高电平持续时间,来判定程序是否执行成功。

目前利用的是STM32G070的开发板,stm32 cube配置如下:

1. Timer17,主频是48MHz,48分频,因此分辨率为1uS

并开启全局中断

主程序基本如下:

main()
{
    ......
    while (1)
   {
    /* USER CODE END WHILE */
      
      while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);
      htim17.Instance->CNT = 0;
      HAL_TIM_Base_Start(&htim17);
      Delay = htim17.Instance->CNT;
      Delay = Delay + 1000; //延时1000个计数值
      htim17.Instance->CCR1 = Delay;
      htim17.Instance->SR &= ~TIM_IT_CC1;
      htim17.Instance->DIER |= TIM_IT_CC1;
      
      while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET);

    /* USER CODE BEGIN 3 */
   }
    ......
}

void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM17)
    {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
        htim17.Instance->SR &= ~TIM_IT_CC1;
        HAL_TIM_Base_Stop(htim);
    }
}

其余的代码,基本上STM32cube基本上都完成了,直接略过即可。但是实际上,我不太喜欢ST的HAL库,繁琐,有些基本操作,还不如直接操作寄存器呢。如下图是示波器抓出来的波形。我在代码里的延时量是1000个计数值CMP=(CNT+1000),因此高电平时间,也应该在1000us左右。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值