2026/4/3 5:39:59
网站建设
项目流程
建小公司网站,网站怎么做飘窗,网站建设手稿,免费炫酷企业网站源码一、滴答定时器#xff08;SysTick#xff09;概述 SysTick 是 Cortex-M 内核#xff08;如 STM32F103 用的 Cortex-M3#xff09;自带的 24 位递减定时器#xff0c;属于内核级外设#xff0c;而非 STM32 片上外设。核心用途#xff1a;
裸机开发#xff1a;实现微秒…一、滴答定时器SysTick概述SysTick 是Cortex-M 内核如 STM32F103 用的 Cortex-M3自带的24位递减定时器属于内核级外设而非 STM32 片上外设。核心用途裸机开发实现微秒 / 毫秒级精准延时RTOS 开发作为系统心跳Tick支撑任务调度、时间片轮转通用场景统计函数执行时间、实现简单定时任务。二、相关寄存器1、关键寄存器寄存器作用LOAD重装值寄存器设置计数最大值VAL当前计数值寄存器可手动清零CTRL控制 状态寄存器时钟源选择、使能、中断使能、计数完成标志CALIB校准值寄存器一般用于 RTOS 节拍校准裸机开发较少用2、CTRL 控制与状态寄存器ENABLESystick的使能位。TICKINT在使用时选择Systick是否要产生中断。若把位2设置为1则Systick在从初值倒计数到0时就会产生中断。CLKSOURCE设置为0则Systick的时钟源就是外部时钟设置为1则Systick的时钟源就是内部时钟。选择如下图3、LOAD寄存器当计数器从 LOAD 的值递减到 0 时会自动重载 LOAD 的值重新开始计数ENABLE 1。 寄存器的低24位有效。4、VAL 当前计数值寄存器读取时返回当前计数器的递减值5、CALIB 校准值寄存器主要用于 RTOS 中校准系统节拍裸机开发几乎不用。三、裸机 - 精确延时基于STM32f103 - 标准库1、寄存器配置1 选择配置寄存器延时1us后面的函数调用其就可以实现CTRL0x00000005 - 使能滴答定时器 选择 HCLK72MHz作为 SysTick 时钟源LOADHCLK72MHz -1 us需要计数 72 次VAL让定时器从LOAD的数值重新开始计数避免残留的计数值导致延时误差。/** * brief 微秒级延时 * param xus 延时时长范围0~233015 * retval 无 */ void Delay_us(uint32_t xus) { SysTick-LOAD 72 * xus; //设置定时器重装值 SysTick-VAL 0x00; //清空当前计数值 SysTick-CTRL 0x00000005; //设置时钟源为HCLK启动定时器 while(!(SysTick-CTRL 0x00010000)); //等待计数到0 SysTick-CTRL 0x00000004; //关闭定时器 }2 代码部分while(!(SysTick-CTRL 0x00010000)); CTRL的 BIT16 是COUNTFLAG计数完成标志位当 SysTick 从 LOAD 值递减到 0 时该位会自动置 1。这行代码的作用是 “循环等待直到计数完成”也就是等待延时时间到。SysTick-CTRL 0x00000004;关闭 SysTick 定时器BIT00避免定时器继续运行影响后续操作BIT2 保持 1不影响仅关闭使能。2、毫秒/秒级延时有了上面的微秒延时实现毫秒/秒就简单了只需要不停的调用微秒函数就可以了1ms延时/** * brief 毫秒级延时 * param xms 延时时长范围0~4294967295 * retval 无 */ void Delay_ms(uint32_t xms) { while(xms--) { Delay_us(1000); } }2s延时/** * brief 秒级延时 * param xs 延时时长范围0~4294967295 * retval 无 */ void Delay_s(uint32_t xs) { while(xs--) { Delay_ms(1000); } }四、使用注意滴答时钟实现的精准延时属于阻塞型延时在延时过程中CPU 会持续等待延时完成无法执行其他任务。在使用的时候要格外注意以避免延时过多导致系统故障。参考Barkley X