STM32中 嘀嗒定时器中 SysTick_CTRL_ENABLE的含义说明

本文详细解析了STM32中滴答定时器的开启与关闭操作,通过具体的寄存器位操作实现定时器的使能与禁用。介绍了SysTick_CTRL_ENABLE_Msk宏定义的作用及其实现原理,深入理解STM32定时器的工作机制。

1、使能滴答定时器

SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk

关闭滴答定时器

SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk

 

2、宏定义的说明

#define SysTick_CTRL_ENABLE_Pos             0                                                                                /*!< SysTick CTRL: ENABLE Position */
#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */

对于SysTick_CTRL_ENABLE_Pos,其中Pos应该是position的缩写,也就是位置,在文件定义位置为0;

对于SysTick_CTRL_ENABLE_Msk,1ul << SysTick_CTRL_ENABLE_Pos,意思就是将1左移0位,为0000 0000 0000 0001;其中的1ul说明这个常量1是unsigned long,32bit的数据,因为stm32寄存器是32位的。根据SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk可知,替换后为SysTick->CTRL |= 1 <<0, 相当于把CTRL最低位置1,也就是打开SysTick定时器。

#include "sys_tick.h" // 记录系统的时间 计时器 // __IO = volatile static __IO u32 sysTickCnt; // 系统定时器初始化 void SysTick_Init(void){ // STM32F103系统内核的时钟频率是72MHZ // SystemCoreClock = SYSCLK_FREQ_72MHz = 72000000 // SysTick_Config 函数里面传入的是计数为多少的时候产生一次系统中断 // 1s中断一次 -> SystemCoreClock / 1 // 1ms中断一次 -> SystemCoreClock / 1000, 1s分成1000个时间片段, 每个片段是1ms // 1us中断一次 -> SystemCoreClock / 1000000 // 这里设置为1ms中断一次 if(SysTick_Config(SystemCoreClock / 1000)){ // 捕获异常 while(1); } // 关闭嘀嗒定时器 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; } // 等待计时完成 void SysTick_Wait(){ // 定时器使能 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 等待直到计时器变为0 while (sysTickCnt > 0); // 定时器失能 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; } // 延时us void SysTick_DelayUs(__IO u32 nTime){ // 设置时钟中断为us级 SysTick_Config(SystemCoreClock / 1000000); sysTickCnt = nTime; // 等待计时完成 SysTick_Wait(); // 重新设置系统中断为ms级 SysTick_Config(SystemCoreClock / 1000); // 定时器失能 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; } // 延时ms void SysTick_DelayMs(__IO u32 nTime){ sysTickCnt = nTime; SysTick_Wait(); } // 延时s void SysTick_DelayS(__IO u32 nTime){ SysTick_DelayMs(nTime * 1000); } // 设置倒计时(非阻塞式) void SysTick_CountdownBegin(__IO u32 nTime){ // 这里设置为1ms中断一次 sysTickCnt = nTime; // 定时器使能 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; } // 撤销倒计时 void SysTick_CountdownCancel(void){ // 重置嘀嗒计时器的计数值 sysTickCnt = 0; // systick 定时器失能 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; } // 判断倒计时是否超时 uint8_t SysTick_CountdownIsTimeout(void){ return sysTickCnt == 0; } // 设置系统定时器中断的回调函数 void SysTick_Handler(void) { if(sysTickCnt > 0){ sysTickCnt--; }else{ sysTickCnt = 0; } } 怎么改
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值