当前位置:首页 > 单片机 > 单片机
[导读]SysTick时钟,俗称“嘀嗒定时器”,它能按设定的时间产生一次中断。控制工程代码中随处可见形如delay_ms()之函数。但是一直不清楚其内在机制。今天花时间研究了一下。首先还是在数据手册上看一下SysTick寄存器的配置,

SysTick时钟,俗称“嘀嗒定时器”,它能按设定的时间产生一次中断。控制工程代码中随处可见形如delay_ms()之函数。但是一直不清楚其内在机制。今天花时间研究了一下。

首先还是在数据手册上看一下SysTick寄存器的配置,如图:

寄存器说明



stm32的时钟源
选择外部时钟源时,则Systick时钟为HCLK /8
选择内核时钟源时,则Systick时钟为HCLK

延时编程原理
systick定时器是24位的递减计数器,设定初值并使能它后,它会把每个系统时钟周期计数器减1,
计数到0 时,将从RELOAD 寄存器中自动重装载定时器初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息.

延时编程步骤
1.计算出产生1us 需要多少个时钟周期 fac_us
2.计算出RELOAD寄存器的值
也就是产生相应延时所需要的时钟周期数
RELOAD=fac_us * nus
3.开启计数
4.循环检测计数到0的标志位
5.清空计数器,关闭定时器

SysTick异常配置步骤
1对CTRL/LOAD/VAL三个寄存器进行配置
2初始化SysTick使用的时钟
3清除系统当前值,装入重装值
4使能SysTick,使SysTick能响应中断

======================
库函数版
使用ST的函数库使用systick的方法,严格按照以下顺序:

1、调用SysTick_CounterCmd() – 使能SysTick计数器
2、调用SysTick_ITConfig () – 使能SysTick中断
3、调用SysTick_CLKSourceConfig() – 设置SysTick时钟源。
4、调用SysTick_SetReload() – 设置SysTick重装载值。
5、调用SysTick_ITConfig () – 使能SysTick中断
6、调用SysTick_CounterCmd() – 开启SysTick计数器

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

寄存器版
使用外部8M时钟,锁相环里出来的频率是72M,AHB预分频后是72M,
systick固定HCLK时钟的1/8,即9M,那么延时1us是9个时钟

voiddelay_init(u8SYSCLK)//系统时钟是72MHz,SYSCLK=72{SysTick->CTRL&=0xfffffffb;//bit2清0,也就是配置选择外部时钟fac_us=SYSCLK/8;//硬件8分频,fac_us得出的值是要给下面的时钟函数用的fac_ms=(u16)fac_us*1000;}voiddelay_us(u32nus)//nus假如为10us{u32temp;SysTick->LOAD=nus*fac_us;//延时10us的话就是10*9=90,装到load寄存器中SysTick->VAL=0x00;//计数器清0,因为currrent字段被手动清零时,load将自动重装到VAL中SysTick->CTRL=0x01;//配置使异常生效,也就是计数器倒数到0时将发出异常通知do{temp=SysTick->CTRL;//时间到了之后,该位将被硬件置1,但被查询后自动清0}while(temp&0x01&&!(tmep&(1<<16)));//查询SysTick->CTRL=0x00;//关闭计数器SysTick->VAL=0x00;//清空val}12345678910111213141516171819202122

最后一个while循环,判断如果Systick还在Enable的状态,并且计数器还没数到0,
就不停的循环把当前的SysTick->CTRL寄存器值写入变量temp,继续下一次判断。
当Systick被Disable或者计数器数到0了,就停止循环。

=====终=====


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式开发中,STM32的时钟系统因其灵活性和复杂性成为开发者关注的焦点。然而,看似简单的时钟配置背后,隐藏着诸多易被忽视的陷阱,轻则导致系统不稳定,重则引发硬件损坏。本文从时钟源选择、PLL配置、总线时钟分配等关键环...

关键字: STM32 时钟系统

在嵌入式系统开发中,STM32系列微控制器的内部温度传感器因其低成本、高集成度特性,广泛应用于设备自检、环境监测等场景。然而,受芯片工艺差异和电源噪声影响,其原始数据存在±1.5℃的固有误差。本文从硬件配置、校准算法、软...

关键字: STM32 温度传感器

在能源效率与智能化需求双重驱动下,AC-DC转换器的数字控制技术正经历从传统模拟方案向全数字架构的深刻变革。基于STM32微控制器的PFM(脉冲频率调制)+PWM(脉冲宽度调制)混合调制策略,结合动态电压调整(Dynam...

关键字: AC-DC STM32

当前智能家居产品需求不断增长 ,在这一背景下 ,对现有浇花装置缺陷进行了改进 ,设计出基于STM32单片机的全 自动家用浇花机器人。该设计主要由机械结构和控制系统构成 ,机械结构通过麦克纳姆轮底盘与喷洒装置的结合实现机器...

关键字: STM32 麦克纳姆轮 安全可靠 通过性强

用c++编程似乎是让你的Arduino项目起步的障碍吗?您想要一种更直观的微控制器编程方式吗?那你需要了解一下Visuino!这个图形化编程平台将复杂电子项目的创建变成了拖动和连接块的简单任务。在本文中,我们将带您完成使...

关键字: Visuino Arduino ESP32 STM32

基于STM32与LoRa技术的无线传感网络凭借其低功耗、广覆盖、抗干扰等特性,成为环境监测、工业自动化等场景的核心解决方案。然而,如何在复杂电磁环境中实现高效休眠调度与动态信道优化,成为提升网络能效与可靠性的关键挑战。本...

关键字: STM32 LoRa

在实时控制系统、高速通信协议处理及高精度数据采集等对时间敏感的应用场景中,中断响应延迟的优化直接决定了系统的可靠性与性能上限。STM32系列微控制器凭借其灵活的嵌套向量中断控制器(NVIC)、多通道直接内存访问(DMA)...

关键字: STM32 DMA

数字电源技术向高功率密度、高效率与高动态响应方向加速演进,STM32微控制器凭借其基于DSP库的算法加速能力与对LLC谐振变换器的精准控制架构,成为优化电源动态性能的核心平台。相较于传统模拟控制或通用型数字控制器,STM...

关键字: STM32 数字电源

STM32微控制器凭借其针对电机控制场景的深度优化,成为高精度、高可靠性驱动系统的核心选择。相较于通用型MCU,STM32在电机控制领域的核心优势集中体现在FOC(磁场定向控制)算法的硬件加速引擎与PWM死区时间的动态补...

关键字: STM32 电机控制

无线充电技术加速渗透消费电子与汽车电子领域,基于Qi协议的无线充电发射端开发成为智能设备能量补给的核心课题。传统模拟控制方案存在响应滞后、参数调整困难等问题,而基于STM32的数字PID控制结合FOD(Foreign O...

关键字: STM32 无线充电
关闭