STM32_SysTick

本文详细介绍了如何在STM32微控制器上初始化滴答定时器,包括配置频率、中断处理函数和使用宏定义实现不同单位的延时功能。重点展示了通过SysTick定时器实现精确的微秒级延迟,以及简化延时函数的编写。

初始化滴答定时器

void SysTick_Init(void)
{
    /* SystemFrequency / 1000    1ms中断一次
     * SystemFrequency / 1000000 1us中断一次
     */
//  if (SysTick_Config(SystemFrequency / 1000000)){ // ST3.0.0库版本
    if (SysTick_Config(SystemCoreClock / 1000000)){ // ST3.5.0库版本
        while (1);    /*返回1说明装载的值超过 SysTick_LOAD_RELOAD_Msk 而出错进入这里的死循环,
                        这里的这个最大值是 0xFFFFFFul = 2^24 = 16777216 */
    } 
    //关闭滴答定时器,使用时再开启
    SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
  • 下面是用到的宏定义。
#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 Reload Register Definitions */
#define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */
#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */

延时程序

定义静态全局变量和延时函数

static __IO u32 TimingDelay;
void Delay_us(__IO u32 nTime)
{ 
    TimingDelay = nTime;     
    //使能滴答定时器
    SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;
    while(TimingDelay != 0);
}

SysTick中断函数SysTick_Handler()

//在stm32f10x_it.c中
#include "bsp_systick.h"      //包含要用到的头文件
void SysTick_Handler(void)    //修改SysTick_Handler()函数
{
    TimingDelay_Decrement();  //这里添加了一句函数调用
}

SysTick中断函数调用的函数

void TimingDelay_Decrement(void)
{
    if (TimingDelay != 0x00){ 
        TimingDelay--;        //每次SysTick中断就自减1,直到为0
    }
}

使用宏定义写出不同单位的延时函数

#define Delay_ms(x) Delay_us(1000*x)         //单位ms
#define Delay_s(x)  Delay_us(1000000*x)      //单位s
### STM32 SysTick_Handler 的使用与实现 在STM32嵌入式系统中,SysTick_Handler 是用于处理 Cortex-M 内核中的 SysTick 定时器中断的函数。该定时器是一个 24 位递减计数器,通常被用来生成精确的时间延迟或作为操作系统的时钟节拍(tick)[^1]。 #### SysTick_Handler 的基本用途 - **时间延迟**:通过配置 SysTick 定时器,在不使用阻塞循环的情况下实现高精度延时。 - **系统节拍**:为实时操作系统(RTOS)提供周期性中断,用于任务调度、时间管理等。 - **性能监控**:可用于测量代码执行时间或调试目的。 #### SysTick_Handler 的初始化 为了启用 SysTick_Handler,需要配置 SysTick 定时器的重载值、选择时钟源,并使能中断。以下是一个典型的初始化代码示例: ```c void SysTick_Init(void) { // 设置 SysTick 时钟源为系统时钟(HCLK) SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; // 设置重载值以产生 1ms 中断(假设系统时钟为 72MHz) SysTick->LOAD = (72000 - 1); // 72,000 ticks = 1ms at 72 MHz // 清除当前计数值 SysTick->VAL = 0; // 使能 SysTick 中断和定时器 SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; } ``` #### 实现 SysTick_Handler 函数 当 SysTick 定时器递减到零时,会触发一次中断,并调用 `SysTick_Handler` 函数。用户可以在该函数中添加自己的逻辑,例如更新全局时间变量或触发任务调度。 ```c volatile uint32_t system_time_ms = 0; void SysTick_Handler(void) { system_time_ms++; // 每毫秒递增一次 } ``` #### 使用示例:获取毫秒级时间戳 一旦 SysTick 初始化并运行,可以通过读取 `system_time_ms` 获取自系统启动以来经过的毫秒数,从而实现非阻塞延时或其他功能。 ```c void delay_ms(uint32_t ms) { uint32_t start = system_time_ms; while ((system_time_ms - start) < ms); } ``` #### 注意事项 - 确保在调用 `SysTick_Init()` 之前系统时钟已正确配置。 - 若使用 RTOS(如 FreeRTOS),SysTick 可能已经被其占用,不应再自行修改。 - 在低功耗应用中,若进入深度睡眠模式(如待机模式),SysTick 定时器可能会停止工作,需根据需求重新配置唤醒机制[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值