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

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

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

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定时器。

<think>好的,我现在需要帮助用户了解如何在STM32中使用SysTick嘀嗒定时器进行计时。首先,我得回顾一下相关的知识,确保自己理解正确,然后按照用户的要求一步步解释清楚。 首先,用户提到了几个引用资料,我需要结合这些资料来构建答案。引用3提到SysTick是CM3内核的外设,24位递减计数器,可以用于延时或操作系统定时中断。引用4和5则涉及具体的代码示例和时钟配置。 用户的问题是如何实现计时,所以需要分步骤说明配置方法,可能还需要示例代码。根据引用4,初始化需要设置时钟源,计算基准值,然后编写延时函数。引用5提到时钟源的选择和计数周期的计算,比如使用内部时钟168MHz时,1us对应168个脉冲。 接下来,我应该按照系统级指令的要求,使用中文回答,结构清晰,正确使用LaTeX格式的行内和独立公式。同时生成相关问题,并在引用处添加标识。 首先,要解释SysTick的基本原理,比如24位递减计数器,时钟源的选择(AHB或AHB/8)。然后,配置步骤:选择时钟源、重装载值、启动定时器。需要提到重装载值的计算公式,比如ReloadVal = (时钟频率 / 分频系数) × 时间。例如,1ms的延时,如果时钟是168MHz,分频为8,那么ReloadVal = (168MHz /8) * 1ms = 21000。 然后,代码示例部分,需要展示初始化函数Delay_Init,其中计算基准数,并配置SysTick。接着是Delay_us和Delay_ms函数,设置重装载值,等待计数完成。这部分要确保语法正确,可能还需要解释关键点,比如查询CTRL寄存器的标志位。 还要注意引用来源,比如在配置步骤中引用3和5,代码部分引用4。同时,用户可能想知道如何验证定时准确性,或者如何处理溢出情况,这些可以作为相关问题。 现在,检查是否有遗漏:是否覆盖了所有必要步骤,公式是否正确,代码是否符合STM32的标准库,引用是否正确标注。例如,引用5提到1us对应168个脉冲,这可能是在分频为1的情况下,而如果分频为8,则每微秒的脉冲数为21M/8=2.1M?需要确认计算是否正确。 另外,用户可能需要知道如何选择时钟源,这部分在代码中通过SysTick_CLKSourceConfig函数设置,引用4中提到使用CPU时钟源。需要明确说明分频系数对计时的影啊,比如选择不同的时钟源会影响计时的精度和最大延时时间。 最后,生成相关问题,比如如何计算最大延时时间,如何提高精度,在RTOS中的应用等,这些能帮助用户进一步学习。</think>### STM32嘀嗒定时器(SysTick)计时实现方法 #### 一、SysTick基本原理 SysTick是Cortex-M内核的24位递减计数器,时钟源可选择$AHB$总线时钟或$AHB/8$[^3]。计算公式: $$ \text{ReloadVal} = \frac{\text{SYSCLK(Hz)}}{\text{分频系数}} \times \text{时间(s)} $$ 例如: - 使用168MHz系统时钟,分频系数8 - 1ms定时需设置:$ReloadVal = \frac{168 \times 10^6}{8} \times 0.001 = 21000$ #### 二、配置步骤 1. **时钟源选择**:通过`SysTick_CLKSourceConfig()`选择时钟源(AHB或AHB/8)[^4] 2. **重装载值计算**:根据目标时间计算`LOAD`寄存器值[^5] 3. **启动定时器**:使能计数器并等待标志位 #### 三、代码实现示例 ```c // 初始化SysTick定时器 void Delay_Init(uint32_t SYSCLK) { // 选择外部时钟源(AHB时钟) SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); // 计算1us和1ms的基准计数 fac_us = SYSCLK / 8; // 分频系数为8时的单位时间脉冲数 fac_ms = fac_us * 1000; } // 微秒级延时 void Delay_us(uint32_t nus) { SysTick->LOAD = nus * fac_us; // 设置重装载值 SysTick->VAL = 0x00; // 清空计数器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 启动定时器 while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待计数完成 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭定时器 } // 毫秒级延时 void Delay_ms(uint16_t nms) { while(nms--) { Delay_us(1000); // 调用微秒延时实现毫秒级 } } ``` #### 四、关键说明 1. **最大延时计算**:24位计数器最大值为$2^{24}-1$,在168MHz/8分频时最大延时约$ \frac{2^{24}}{21 \times 10^6} \approx 0.8s$[^5] 2. **精度验证**:可通过示波器测量GPIO翻转周期验证定时准确性 3. **低功耗优化**:在`Delay_us()`函数中可加入`WFI`指令进入睡眠模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值