如何把网站做的和别人一样,wordpress 占比,律师网络推广,杭州义牛网络技术有限公司SysTick#xff0c;全称System Tick Timer#xff0c;是Cortex-M microcontrollers内核中提供的一个简单而有效的系统定时器#xff0c;设计用来给操作系统提供时间基准#xff0c;或用于生成周期性的中断。STM32系列微控制器#xff0c;作为基于ARM Cortex-M内核的设备全称System Tick Timer是Cortex-M microcontrollers内核中提供的一个简单而有效的系统定时器设计用来给操作系统提供时间基准或用于生成周期性的中断。STM32系列微控制器作为基于ARM Cortex-M内核的设备也内置了这一功能模块。 主要特点
24位递减计数器SysTick是一个24位自动重载的递减计数器达到0时计数器会自动重新装载预设的值并且可以产生一个可选的中断。 灵活的时钟源选择SysTick定时器可以选择内核时钟processor clock或内核时钟的1/8作为其时钟源。这给了开发者根据实际需求选择时钟速度的灵活性。 简单易用对于简单的延时生成、操作系统的节拍(timer tick) 或任何需要定时的任务SysTick提供了一个简单而有效的解决方案而不需要复杂的定时器配置。 固定的中断优先级SysTick的中断优先级是在Cortex-M内核中固定的这意味着开发者不能改变它。这为操作系统的设计提供了一定的便利因为SysTick通常被用作系统的心跳或时间管理。 无需外部硬件与其他外部或外围定时器不同SysTick是内核内置功能不需要其他外部硬件可以保持系统的精简。 实现延时
开发者经常利用SysTick实现毫秒级的延时功能这是通过配置SysTick的重载值LOAD寄存器并启用SysTick定时器和它的中断来实现的。每次SysTick定时器到达零SysTick定时器会重新装载预设的值并且可以触发中断如果已经启用。在中断服务程序ISR中可以执行相关的周期任务或标记一个周期的结束。 使用场景
操作系统节拍实时操作系统RTOS常用SysTick定时器作为系统的基础节拍源用于任务调度、时间管理等。程序延时在不需要精确时间管理的应用中SysTick可以用来实现简易的延时功能例如等待硬件准备好或实现非阻塞延迟。时间测量SysTick也可以用于程序执行时间的测量从而帮助开发者优化代码。
总之SysTick是Cortex-M系列微控制器中非常实用的功能对于需要精确时间管理或操作系统支持的应用来说尤其重要。 如何初始化systick定时器
为了初始化SysTick定时器通常需要设置定时器的重载值选择时钟源并可选地使能SysTick中断。以下步骤展示了如何在裸机编程中初始化SysTick定时器不依赖特定的硬件抽象层HAL或类似库
步骤1: 选择SysTick时钟源
SysTick定时器可以选择使用核心时钟或核心时钟的1/8作为其时钟源。这个设置通过SysTick控制和状态寄存器SysTick CTRL中的CLKSOURCE位来控制。一般情况下我们通常使用核心时钟为SysTick定时器提供时钟以达到更高的时间精度。
SysTick-CTRL | SysTick_CTRL_CLKSOURCE_Msk;
步骤2: 设置重载值Reload Value
SysTick的重载值决定了定时器计数到0所需要的时钟周期数。这个值根据定时器所需的时间间隔来计算并设置在SysTick重载值寄存器SysTick LOAD中。重载值计算公式如下假设您要设置的定时时间是time_ms毫秒。
uint32_t reloadValue (SystemCoreClock / 1000) * time_ms - 1;
SysTick-LOAD reloadValue;
这里SystemCoreClock变量表示系统的核心时钟频率它需要根据实际的系统核心时钟进行设
步骤3: 使能SysTick定时器和中断可选
使能SysTick定时器选择是否使能中断。如果需要定时器到0时产生中断还需要使能SysTick中断。
SysTick-CTRL | SysTick_CTRL_TICKINT_Msk; // 使能SysTick中断
SysTick-VAL 0; // 清空计数器
SysTick-CTRL | SysTick_CTRL_ENABLE_Msk; // 启动SysTick定时器
步骤4: 实现SysTick_Handler中断服务例程如果使能了中断
如果你使能了SysTick中断你需要实现SysTick_Handler()中断服务例程ISR来处理中断。这个函数在SysTick计数到0时被调用。
void SysTick_Handler(void) {// 处理中断。例如更新定时器标志执行定时任务等。
}
以上就是初始化SysTick定时器的基本步骤。这个过程允许你根据需要配置SysTick定时器来实现周期性的任务调度或生成准确的延时。
如何计算SysTick定时器的重载值
计算SysTick定时器的重载值需要知道你想要定时器溢出的时间间隔以及定时器的时钟频率。以下是计算过程 确定时钟频率 主时钟频率 (SystemCoreClock): 如果你选择的是处理器的核心时钟通常情况下。分频后的时钟频率: 如果你选择的是分频后的时钟频率例如核心时钟频率的1/8。 计算时间间隔对应的时钟周期数 根据定时器的时间间隔以及定时器的时钟频率计算出所需的时钟周期数。如果定时器的时间间隔是T秒定时器的时钟频率是f_clock赫兹则对应的时钟周期数N可用以下公式计算 N T * f_clock 例如如果你需要1毫秒的时间间隔并且SysTick的时钟频率是SystemCoreClock则 N 0.001 * SystemCoreClock 计算重载值 SysTick是一个24位的递减到零计数器计数从重载值开始并每个时钟周期递减一直到0。因此重载值应是计数周期数减1。如果重载值设为R R N - 1 这是因为从R递减到0正好是R 1个计数周期。 考虑24位计数器的最大值 由于SysTick是24位的其最大计数值是0xFFFFFF即16,777,215。所以要确保计算得出的R不要超出这个范围。
示例
假设
核心时钟频率 SystemCoreClock 72 MHz
需要的定时器周期 T 1 ms0.001秒
计算周期数 N 为
N 0.001 * 72 MHz 72,000
你可以将这个值写入SysTick加载值寄存器LOAD来设置定时器每1毫秒溢出一次。
代码实现将类似于
SysTick-LOAD (uint32_t)(N - 1);
SysTick-VAL 0x0; // 清空计数器
SysTick-CTRL SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; // 使能定时器
确保你选择对的时钟源核心时钟或核心时钟的1/8因为这将直接影响上面的计算。如果你决定使用分频后的时钟源你需要在计算时将 SystemCoreClock 替换为 SystemCoreClock / 8。 如何使用systick实现delay功能
要使用SysTick定时器实现延时delay功能你需要设置SysTick以适当的速率递减并在递减到零时进行等待或触发中断。下面是实现delay功能的基本步骤不使用中断而是使用轮询的方式。
轮询方式实现
首先你需要正确配置SysTick定时器包括选择时钟源设置重载值等。
配置SysTick重载值: 计算并设置SysTick重载值以匹配你需要的延时长度。例如如果你的核心时钟是72MHz你想要延时1毫秒
uint32_t ticks SystemCoreClock / 1000;
SysTick-LOAD ticks - 1;
SysTick-VAL 0; // 清除当前值及计数器
SysTick-CTRL SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; // 选择核心时钟并启动
实现delay函数: 编写一个延时函数该函数重复地加载重载值并等待SysTick递减到零
void delay_ms(uint32_t ms) {// 计算重载值假设已经减去1且 SysTick-LOAD 直接可以使用uint32_t ticks (SystemCoreClock / 1000) * ms;SysTick-LOAD (uint32_t)(ticks - 1UL);SysTick-VAL 0UL; // 清除计数器// 等待计时器倒数到0while ((SysTick-CTRL SysTick_CTRL_COUNTFLAG_Msk) 0) {// 该位在倒数到0时会设置此处空循环直到满足该条件}
}
使用以上delay_ms()函数可以实现毫秒延时。请注意这里SysTick是设置了一次并等待它完成。如果延时时间长你可以设置SysTick只延时1毫秒然后在循环中多次调用该延时函数。 注意事项
使用该轮询方法实现delay将阻塞CPU执行直到延时完成确保在使用前SysTick 定时器尚未被操作系统或其它库使用在多任务或中断驱动的环境中使用SysTick的方式可能会影响系统中断的响应性能上述示例假设SystemCoreClock已定义并且与实际的系统核心时钟同步。在实际项目中SystemCoreClock往往是由系统初始化代码更新的全局变量它通常在启动文件进行赋值。如果需要长时间延时确保重载值乘以延时毫秒数不会超过SysTick定时器的最大值。
对于具有实时操作系统RTOS的系统最好利用操作系统提供的延时函数因为这些函数更加精准且不会影响操作系统的性能。