本文章深入探讨了基于STM32F103芯片的单片机编程技巧,并详细解析了如何利用SysTick系统定时器实现精准延时功能,适用于嵌入式开发初学者和进阶者。
学习STM32F103单片机编程中的SysTick系统定时器是一个重要的环节。这里主要关注`SysTick_Type`结构体的四个变量:为什么设置为`SysTick->CTRL=0x00000005;`可以开启计时,而设置为`SysTick->CTRL=0x00000004;`则关闭定时器。
STM32F103单片机基于ARM Cortex-M3内核设计,广泛用于嵌入式系统开发。其中的SysTick(系统滴答定时器)是Cortex-M系列处理器内置的一个重要组件,主要用于实现精确延时和实时操作系统(RTOS)任务调度的功能。
SysTick是一个24位递减计数器,在每次重置到预设初始值后会再次开始计数。这使得它成为微秒级延时的理想选择。其配置通过`SysTick_Type`结构体中的四个成员完成,包括控制和状态寄存器(CTRL)、加载寄存器(LOAD)、当前值寄存器(VAL)以及校准寄存器(CALIB)。
1. `CTRL`: 控制和状态位的32位寄存器包含多个标志:
- 位置0:COUNTFLAG,表示计数是否已到达零点。
- 位置1: CLKSOURCE, 设置为0时使用外部参考频率;设置为1则采用核心频率(内部)作为时钟源。
- 位置2: TICKINT,中断使能位。当此位设为1时,在每次计数到零后产生一个中断请求;否则不触发中断。
- 位置16:ENABLE, 控制定时器的开启与关闭。
2. `LOAD`: 设置SysTick的初始值寄存器。
3. `VAL`: 显示当前计数值或重置该值至0的操作。
4. `CALIB`: 提供系统时钟频率精度信息,通常不直接操作此寄存器。
在延时函数`delay_us`中,首先计算所需计数的次数并设置到LOAD寄存器。接着清零VAL寄存器,并将CTRL寄存器第16位设为1(即`SysTick->CTRL=0x00000005;`),启动定时器。在循环中通过检查COUNTFLAG位来判断计数是否完成,一旦计数结束则跳出循环。最后关闭定时器,将CTRL寄存器第16位置零(即设置为`SysTick->CTRL=0x00000004;`)。
延时函数的精度受系统工作频率影响,在此示例中假设使用72MHz的主频,则每计数一次代表大约13.89纳秒。因此,最大允许延迟值为72,000,000除以(72次/微秒),即约等于233毫秒。
综上所述,STM32F103的SysTick定时器通过正确配置`SysTick_Type`结构体中的寄存器来实现精确延时。实际应用中必须考虑系统频率稳定性以及计数溢出处理以确保功能准确可靠;在RTOS等复杂场景下,则可以配合中断服务例程进行任务调度管理。