[开发工具] STM32 用Systick 功能实现 us 延时

[复制链接]
406|2
 楼主| 中国龙芯CDX 发表于 2023-12-23 15:38 | 显示全部楼层 |阅读模式
1、Systick介绍
CM3与CM4包含一个系统计数器SysTick,是一个24位倒计数定时器,当计数到0 时,将从RELOAD寄存器中自动重装载定时初值,只要把它在SysTick->CTRL中的使能位清除,则一直存在。寄存器介绍:

1.png

相应代码在core_cm4.h中:

  1. /**

  2.   \brief  Structure type to access the System Timer (SysTick).

  3. */

  4. typedef struct

  5. {

  6.   __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */

  7.   __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */

  8.   __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */

  9.   __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */

  10. } SysTick_Type;

SysTick控制及状态寄存器(0xE000_E010): 该寄存器第0位:表示SysTick使能位,0表示关;1表示开;SysTick_CTRL_ENABLE_Mask;第1位:表示SysTIck中断使能位,0-表示关闭中断;1-打开中断;SysTick_CTRL_TICKINT_Mask

第2位:表示时钟源选择位,0,表示HCLK/8;1表示HCLK作为时钟源;SysTick_CTRL_SOURCE_Mask;
第16位:表示计数比较标志,如果上次读取本寄存器,计算到了0,则该位置1,如果读取该位,该位将自动清零。SysTick的LOAD寄存器:为递减计数,是24位寄存器,最大值为0xFFFFFF;SysTick的VAL寄存器:24位寄存器,读取时返回当前计数值,写它则使其清零,同时会清零CTRL寄存器中的COUNTFLAG标志。

 楼主| 中国龙芯CDX 发表于 2023-12-23 15:38 | 显示全部楼层
2、代码实现
  1. /*
  2. Systick功能实现us延时,参数SYSCLK为系统时钟
  3. */
  4. uint32_t fac_us;

  5. void HAL_Delay_us_init(uint8_t SYSCLK)
  6. {
  7.      fac_us=SYSCLK;
  8. }

  9. void HAL_Delay_us(uint32_t nus)
  10. {
  11.     uint32_t ticks;
  12.     uint32_t told,tnow,tcnt=0;
  13.     uint32_t reload=SysTick->LOAD;
  14.     ticks=nus*fac_us;
  15.     told=SysTick->VAL;
  16.     while(1)
  17.     {
  18.         tnow=SysTick->VAL;
  19.         if(tnow!=told)
  20.         {
  21.             if(tnow<told)tcnt+=told-tnow;
  22.             else tcnt+=reload-tnow+told;
  23.             told=tnow;
  24.             if(tcnt>=ticks)break;
  25.         }
  26.     };
  27. }

AdaMaYun 发表于 2023-12-28 17:57 | 显示全部楼层
单片机基本就是使用Systick进行计时的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

342

主题

2725

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部