初学stm32-Systick滴答时钟定时

STM32的Systick定时器是一种24位倒计时定时器,常用于延时和实时系统心跳。在STM32+UCOS系统中,Systick作为心跳时钟。它有4个寄存器,时钟源通常为HCLK的1/8。通过SysTick_CLKSourceConfig()设置时钟源,并使用SysTick_Config()初始化和开启中断。延迟功能可以通过封装的delay.c函数实现。
摘要由CSDN通过智能技术生成

滴答定时器概述

  • Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如uCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做uCOS心跳时钟。
  • Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
    SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
    Systick中断的优先级也可以设置
  • 一共4个Systick寄存器
    CTRL------------->SysTick 控制和状态寄存器
    LOAD------------->SysTick 自动重装载除值寄存器
    VAL----------------> SysTick 当前值寄存器
    CALIB ------------> SysTick 校准值寄存器

对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8,内核时钟是 HCLK时钟配置函数:SysTick_CLKSourceConfig();
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

滴答定时器相关函数

  • SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
    这一句把SysTick的时钟选择外部时钟, 这里需要注意的是: SysTick 的时钟源自 HCLK 的 8 分频, 假设我们外部晶振为 8M,然后倍频到 168M,那么SysTick 的时钟即为 21Mhz,也就是 SysTick 的计数器 VAL 每减 1,就代表时间过了1/21us 。

  • SysTick_CLKSourceConfig(); //Systick时钟源选择 misc.c文件中

  • SysTick_Config(uint32_t ticks); //初始化systick,时钟为HCLK,并开启中断
    //core_cm3.h/core_cm4.h文件中

  • void SysTick_Handler(void);//Systick中断服务函数

滴答定时器实现延时

#include "stm32f4xx.h"
#include "led.h"

static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{
    
	TimingDelay = nTime;
	while(TimingDelay != 0)
好的,我可以为您解答关于STM32系统滴答定时器systick)应用的问题。 系统滴答定时器systick)是STM32中一个非常重要的计时器,它是一个24位的递减计数器,每当计数器减为0时,会触发一个中断。它通常用于操作系统的时间片轮转、延时函数的实现等。 在STM32中,我们可以通过如下代码使能系统滴答定时器: ```c // 使能系统滴答定时器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; ``` 然后,我们可以通过如下代码设置系统滴答定时器时钟和计数器值: ```c // 设置系统滴答定时器时钟和计数器值 SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; // 使用处理器时钟作为时钟 SysTick->LOAD = SystemCoreClock / 1000 - 1; // 设置计数器值为1ms ``` 在这段代码中,我们将系统滴答定时器时钟设置为处理器时钟,每次计数器减1代表1个处理器时钟周期的时间。然后我们将计数器的初值设置为`SystemCoreClock / 1000 - 1`,这里的`1000`代表我们希望系统滴答定时器每1ms中断一次。 最后,我们需要在中断服务函数中处理系统滴答定时器中断: ```c void SysTick_Handler(void) { // 处理系统滴答定时器中断 } ``` 在中断服务函数中,我们可以编写自己的代码来处理系统滴答定时器中断。例如,可以实现一个简单的延时函数: ```c void delay_ms(uint32_t ms) { uint32_t i; for (i = 0; i < ms; i++) { while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待计数器减为0 } } ``` 这个函数可以让程序在执行到它的时候暂停一段时间,等待系统滴答定时器中断触发一定次数后再继续执行。 希望这些代码可以帮助您更好地理解STM32系统滴答定时器的应用。如果您还有其他问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值