STM32CubeMx开发之路—使用SysTick实现微妙延时函数delay_us()


运行环境

  • Windows10
  • STM32CubeMX Version 5.4.0
  • Keil5(MDK5) Version 5.28.0.0
  • 硬件开发板 F103RB-NUCLEO

简介

本例程主要讲解如何使用STM32在不用定时器的情况下使用微秒延时函数.


STM32CubeMx基本配置

基础配置过程请参考 STM32CubeMx开发之路—配置第一个项目


使用printf功能

重定向printf的过程请参考 STM32CubeMx开发之路—3发送USART数据和printf重定向

CubeMX配置

查看时钟树

  • CubeMX不需要什么特别的配置, 只需要查看一下时钟树就行了, 而且在代码中也有专门的接口调用, 这儿大家了解一下, 由下图可知, 系统的时钟为72M HZ.

代码修改

  • 本节的微秒延时主要是通过不断获取系统时间来实现的
  • main.c文件中添加如下函数代码
/**
 * @bieaf 微秒延时函数
 * @detail 注意:由于指令执行需要时间, 实际的延时精度约为1微秒
 *
 * @param unsigned int Delay 延时的微秒
 */
void delay_us(unsigned int Delay)
{
    uint32_t tickstart = SysTick->VAL;                            ///<获取当前tick
    uint32_t tickNum = 0;
    uint32_t tickMax = SysTick->LOAD + 1;
    uint32_t delay_usvalue = (tickMax / 1000) * Delay;            ///<计算一共需要延时的tick
    while(1)
    {
        uint32_t cur_tick = SysTick->VAL;
        if (cur_tick > tickstart)                                 ///<进行了一次重载
        {
            tickNum = tickstart + (tickMax - cur_tick);
        }
        else                                                      ///<未进行过重载
        {
            tickNum = tickstart - cur_tick;
        }

        if (tickNum > delay_usvalue)                              ///<达到延时的tick数
        {
            return;
        }
    }
}

  • 在主函数main()中添加如下测试函数
while (1)
{
  static unsigned int start_time = 0;
  static unsigned int end_time = 0;
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */


  start_time = SysTick->VAL;    ///<延时前获取tick
  delay_us(10);                 ///<延时
  end_time = SysTick->VAL;      ///<延时后获取tick

  printf("delay time tick is %d\r\n", start_time - end_time); ///打印输出
  HAL_Delay(1000);
}
/* USER CODE END 3 */

  • 结果分析, 如下图所示:
  • 我们延时的时间为10us, 会发现tick相差的是756,是不是我们的延时函数错了呢?
  • 进一步分析, 系统时钟是72M HZ的, 也就是说1s系统时钟走72M次, 也就是说1us走72次
  • 10us的时间应该走72 * 10 = 720次,而我们测试的结果为756次, 多了36次约为0.5us
  • 这些时间是哪儿多出来的呢?
  • 如果你使用过汇编, 你可能就知道, 进出函数的跳转指令, 取指令, 读指令, …等各种指令需要时间的,多出来的时间就是那些时间造成的误差.
  • 有没有办法消除这些误差?
  • 办法是有的, 不过这和系统相关, 可以经过多次测试, 在延时函数里面减去多的这些时间误差, 这儿不详细说明, 一般对于要用的微秒延时的像软件IIC这样的功能, 这些误差是没有影响的,大可放心使用.

源代码获取

源码已放到码云 ! ! ! ( 请点击文首链接进入仓库 )


  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iot 小胡

从未指望过会有人打赏...

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值