打印
[开发工具]

STM32 用Systick 功能实现 us 延时

[复制链接]
205|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1、Systick介绍
CM3与CM4包含一个系统计数器SysTick,是一个24位倒计数定时器,当计数到0 时,将从RELOAD寄存器中自动重装载定时初值,只要把它在SysTick->CTRL中的使能位清除,则一直存在。寄存器介绍:



相应代码在core_cm4.h中:

/**

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

*/

typedef struct

{

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

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

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

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

} 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、代码实现
/*
Systick功能实现us延时,参数SYSCLK为系统时钟
*/
uint32_t fac_us;

void HAL_Delay_us_init(uint8_t SYSCLK)
{
     fac_us=SYSCLK;
}

void HAL_Delay_us(uint32_t nus)
{
    uint32_t ticks;
    uint32_t told,tnow,tcnt=0;
    uint32_t reload=SysTick->LOAD;
    ticks=nus*fac_us;
    told=SysTick->VAL;
    while(1)
    {
        tnow=SysTick->VAL;
        if(tnow!=told)
        {
            if(tnow<told)tcnt+=told-tnow;
            else tcnt+=reload-tnow+told;
            told=tnow;
            if(tcnt>=ticks)break;
        }
    };
}

使用特权

评论回复
板凳
AdaMaYun| | 2023-12-28 17:57 | 只看该作者
单片机基本就是使用Systick进行计时的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

269

主题

2139

帖子

4

粉丝