如何实现Delay_us和Delay_ms延时(SysTick定时器)

SysTick定时器(System Tick Timer)是ARM Cortex-M内核中自带的一个24位递减计数器,通常用于产生系统节拍中断,为操作系统提供时基或用于一般性定时功能。它具有以下特点和用途:

一、SysTick的介绍

1. SysTick的主要用途(计时)

操作系统心跳时基:在实时操作系统(RTOS)中,SysTick通常用于产生周期性中断,作为系统节拍,触发任务切换和延时计时等功能。

精确延时:在裸机开发中,SysTick可用于实现精确延时,适合对时间敏感的应用场景。

通用计时器:在没有其他通用计时器的情况下,SysTick可以用作简单的通用定时器。

2. SysTick的工作原理

SysTick定时器是一个24位的递减计数器,在装载寄存器(LOAD寄存器)中设置初始计数值后,定时器以固定频率递减计数。当计数到零时会产生一次中断,并重新装载计数值,开始新一轮计时。

SysTick可以选择系统时钟(HCLK)或HCLK的1/8作为时钟源。

3. SysTick定时器的寄存器

CTRL(控制和状态寄存器:用于配置启用/禁用SysTick定时器、中断、时钟

下面是基于 MM32G0001 单片机使用 SysTick 实现 `delay_us` 函数的一个简单示例代码。此代码假设系统时钟已经配置好,并且 SysTick 的时钟源为系统时钟。 ```c #include "sys.h" // 包含单片机相关的头文件 // 定义延迟函数 delay_us (单位:微秒) void delay_us(uint32_t us) { uint32_t reload_value = SystemCoreClock / 1000000; // 根据系统时钟计算每微妙需要的计数值 if(reload_value == 0) { // 防止除零错误 return; } SysTick->LOAD = reload_value - 1; // 设置重装载值 SysTick->VAL = 0x00; // 清空当前计数寄存器 SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; for(uint32_t i = 0; i < us; i++) { while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待一次计数完成标志位 SysTick->VAL = 0x00; // 恢复初值 } SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭定时器 } int main(void){ SystemInit(); // 初始化系统时钟 while(1){ delay_us(50); // 延迟50us作为测试 } } ``` ### 解释说明: 1. **SystemCoreClock**:表示系统的主频(单位 Hz),这个变量通常由 HAL 库或标准外设库初始化并设置。 2. **SysTick 配置步骤**: - 计算每个微秒对应的重加载值 (`reload_value`) 并写入到 `SysTick->LOAD` 寄存器中。 - 将当前计数器清零 (`SysTick->VAL = 0x00`)。 - 启动 SysTick 控制器 (`SysTick->CTRL |= ...`)。 3. 循环等待每次中断完成后进入下一轮延时操作,直至满足指定微秒数量为止。 请注意,在实际应用前需检查是否已正确定义了宏及相关硬件资源如 `SysTick`.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值