STM32 Systick定时器

本文深入解析了STM32微控制器中SysTick定时器的工作原理及其配置方法。介绍了SysTick定时器的基本结构,包括CTRL、LOAD、VAL、CALIB等寄存器的功能,并提供了初始化函数及实现微秒、毫秒级延时的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         根据原子的《STM32不完全手册》。SYSTICK 的时钟固定为HCLK 时钟的1/8,在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,
即SYSTICK定时器以9M的频率递减。SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器。SYSTICK的时钟为9M,故1us有9个计数。


SysTick->CTRL:


位段   名称      类型   复位值        描述


16  COUNTFLAG     R      0          如果在上次读本寄存器后systick已为0,则该位为1,若读该位自动清零


2   CLKSOURCE     RW     0          0:外部时钟源 1:内部时钟


1    TICKINT      RW     0           0:减到0无动作;1:减到0产生systick异常请求


0    ENABLE       RW     0           systick定时器使能位


    


SysTick-> LOAD:


位段    名称    类型     复位值       描述


23:0   RELOAD    RW        0     减到0时被重新装载的值


SysTick-> VAL:


位段    名称     类型    复位值       描述


23:0   CURRENT   RW        0      读取时返回当前倒计数的值,写则清零,同时还会清除在systick控制及状态寄存器中的COUNTFLAG 标志


SysTick-> CALIB 不常用,在这里我们也用不到,故不介绍了。


/*定时器初始化函数*/  
void Delay_Init(u8t SYSCLK) //SYSCLK为系统时钟频率除以1000000后的值,例:如果系统时钟频率为72MHz,则调用该函数时此处的实参为72  
{  
    SysTick->CTRL&=0xFFFFFFFB;  
    fac_us=SYSCLK/8;  
    fac_ms=(u16t)(fac_us*1000);       
}  
  
/*1微秒延时函数*/  
void Delay_us(u32t nus)  
{  
    u32t temp;  
    SysTick->LOAD=nus*fac_us;  
    SysTick->VAL=0x00;  
    SysTick->CTRL=0x01;  
    do  
    {  
        temp=SysTick->CTRL;  
    }  
    while(temp&0x01&&!(temp&0x10000));  
    SysTick->CTRL=0x00;  
    SysTick->VAL=0x00;     
}  
  
/*1毫秒延时函数*/  
void Delay_ms(u16t nms)  
{  
    u32t temp;  
    SysTick->LOAD=(u32t)(nms*fac_ms);  
    SysTick->VAL=0x00;  
    SysTick->CTRL=0x01;  
    do  
    {  
        temp=SysTick->CTRL;  
    }  
    while(temp&0x01&&!(temp&0x10000));  
    SysTick->CTRL=0x00;  
    SysTick->VAL=0x00;     
}  


注意:LOAD寄存器是24bit的,所以最大的定时器时间为:nms <= 0xffffff * 8 * 1000 / SYSCLK
nms单位为ms,SYSCLK单位为Hz,如果时钟是72MHz,那么nms的最大值为nms <= 0xffffff * 8 * 1000 / 72 = 1864ms
如果nms超过1864ms则定时不准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值