目录
注:以下为SysTick结构体详解,与主体函数只是有一定联系,可略过。
SysTick结构体中的CTRL就是系统控制和状态寄存器(SysTick Control and Status Register):
SysTick结构体中的LOAD就是重转载数据寄存器(24位):
SysTick结构体中的CALIB就是校准数值寄存器(24位)(不常用):
SysTick_Config函数让SysTick定时器初始化过程:
2、void delay_ms(u16 nms);和delay_us(u32 nus);
笔记:
首先是对应的头文件delay.h中的函数:
#ifndef __DELAY_H
#define __DELAY_H
#include <sys.h>
void delay_init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);
#endif
可以看到只有三个函数,delay_init(u8 SYSCLK)是SysTick定时器初始化的函数,delay_ms(u16 nms)是计毫秒的,delay_us(u32 nus)是计微秒的。
在调用相关的函数之前,一定要先初始化!
关于fac_ms和fac_us,在文件一开始有这样的定义(一开始是0,后来根据实际情况改变):
static u8 fac_us=0; //us延时倍乘数
static u16 fac_ms=0; //ms延时倍乘数,在os下,代表每个节拍的ms数
这两个全局变量的作用会在第二节讲到。
1、delay_init(u8 SYSCLK);
//初始化延迟函数
//当使用OS的时候,此函数会初始化OS的时钟节拍
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void delay_init(u8 SYSCLK)
{
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
u32 reload;
#endif
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK/8; //不论是否使用OS,fac_us都需要使用
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
reload=SYSCLK/8; //每秒钟的计数次数 单位为M
reload*=1000000/delay_ostickspersec; //根据delay_ostickspersec设定溢出时间
//reload为24位寄存器,最大值:16777216,在168M下,约合0.7989s左右
fac_ms=1000/delay_ostickspersec; //代表OS可以延时的最少单位
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
SysTick->LOAD=reload; //每1/delay_ostickspersec秒中断一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
#else
fac_ms=(u16)fac_us*1000; //非OS下,代表每个ms需要的systick时钟数
#endif
}
此处将把关于UCOS相关代码忽略,后面学习:
这里出现了SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); 这个函数作用就是配置外部时钟源(下文紧接着会介绍),具体定义是:
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
加上宏定义:
#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004)
#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \

本文详细介绍了STM32的SysTick定时器初始化过程,包括delay_init、delay_ms和delay_us函数的工作原理。通过SysTick_CLKSourceConfig配置时钟源,利用SysTick_Config进行定时器初始化,并探讨了SysTick结构体中的各个寄存器。此外,还解释了如何通过SysTick实现微秒和毫秒级别的延时函数。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



