STM32——SysTick定时器(CubeMX配置SysTick)

SysTick是Cortex-M内核中的一个24位向下递减定时器,常用于操作系统时基和精确计数。其工作周期取决于CLKSource,如在F103中为1/72MHz。通过设置重装载寄存器,当计数到0时可触发中断。主要功能包括操作系统心跳维持和延迟计数。配置SysTick涉及系统时钟设定和SysTick寄存器的设置。关键寄存器包括CTRL、LOAD、VAL和CALIB。
摘要由CSDN通过智能技术生成

SysTick系统定时器时属于Cortex-M内核中的一个外设,内嵌在NVIC中

SysTick系统定时器含有一个计数宽度为24bit的向下递减的自动重装载计数器,计数器每计数一次的时间为1/CLKSource,一般我们设置CLKSource为系统时钟,以F103为例,CLKSource可以配置为72MHz

        计数宽度: 24bit来存储数据,可以存储2^24次方的数据

        向下递减:指的是计数器的工作模式

        工作周期:1/72MHz

当重装载数值寄存器的值递减到0的时候,SysTick系统定时器可以配置产生一次中断,以此循环往复

SysTick系统定时器时属于Cortex-M内核的外设,所以一般基于Cortex-M内核的单片机都具有这个系统定时器,这使得软件在Cortex-M单片机中可以很容易移植

SysTick定时器的功能:

(1)SysTick系统定时器可以用于操作系统,用于产生时基,维持操作系统的心跳,一般操作系统都需要一个时基,进行任务的电镀,同步等功能的实现

(2)SysTick系统定时器最常用的功能还是计数,比如用来进行微秒,毫秒延时,ui此产生特定时序

SysTick寄存器汇总

寄存器名称描述
CTRLSysTick控制及状态寄存器
LOADSysTick重装载数值寄存器
VALSysTick当前数值寄存器
CALIBSysTick校准数值寄存器

 

 CubeMX配置SysTick

1.进行系统时钟配置

 2.设置SysTick

到此,SysTick就设置完成啦

STM32CubeMX 是一款由 ST Microelectronics 开发的集成设计环境工具,它能自动创建基本的 STM32 微控制器应用,简化了系统配置、内存管理、外设初始化等功能,帮助用户快速启动项目。 ### 配置 SYsTIck 和纳秒级延时函数 在 STM32 的微处理器中,`SysTick` 是一种定时器,常用于生成周期性的中断事件,通常用于执行一些周期性任务或计数等操作。要在 STM32CubeMX 中设置 `SysTick` 及其纳秒级延时功能,可以按照以下步骤操作: #### 通过 STM32CubeMX 配置 `SysTick` 1. **打开 STM32CubeMX 并选择目标 STM32 芯片**(例如 STM32H7)以及相应的系列版本。 2. **在项目窗口中选择 `System`** 来编辑系统部分。在这里,你可以找到 `SysTick` 相关的配置选项。 3. **勾选启用 `SysTick` 定时器**。然后可以选择 `Tick` 时间长度和预分频值,这将影响每秒钟的中断次数。通常,使用默认设置即可满足需求。 4. **配置 `SysTick` 作为周期性的中断源**,这通常已经在默认设置中完成。 5. **保存配置**,完成后,STM32CubeMX 将自动生成必要的代码和配置文件。 #### 实现纳秒级延时函数 虽然 `SysTick` 提供的是毫秒级别的中断,但通过循环等待特定次数的 `SysTick` 中断,我们可以模拟出纳秒级别的时间延迟。下面是一个简单的示例代码段来演示如何使用 `SysTick` 进行纳秒级时间延迟: ```c #include "stm32h7xx_hal.h" #include "stm32h7xx_hal_msp.h" // 假定 SysTick 每次中断间隔大约为 0.001 秒 const uint32_t TICKS_PER_SECOND = 1000; uint32_t delay_ns = 1; // 延迟时间为 1 纳秒 void SystemClock_Config(void); void DelayNanoseconds(uint32_t ns); void __attribute__((interrupt("WWDG"))) WWDG_IRQHandler() { if (delay_ns > 0) { delay_ns--; } } int main() { HAL_Init(); SystemClock_Config(); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOD, ENABLE); // 初始化 GPIO 引脚 HAL_NVIC_EnableIRQ(WWDG_IRQn); // 启动 WWDG 中断 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 示例 GPIO 控制 while(1) { DelayNanoseconds(TICKS_PER_SECOND * 1000 * 1000); // 延迟 1 微秒 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); } return 0; } void DelayNanoseconds(uint32_t ns) { for (; ns > 0; ns--) { while (HAL_GetTick() % TICKS_PER_SECOND != 0) { ; } } } ``` 此代码首先设置了一个无限循环,在循环内部通过 `DelayNanoseconds()` 函数实现纳秒级的延迟。`DelayNanoseconds()` 函数通过检查当前时间是否等于一个完整的毫秒来决定是否递减延迟计数器 `ns`。 ####
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值