STM32嘀嗒定时器编程步骤(个人学习总结)
基本知识
SysTick 属于CM3,CM4内核芯片内部资源。一个24位的倒
计数定时器,计到0时,将从RELOAD寄存器中自
动重装载定时初值,在睡眠模式也能工作。可以产生中断。当前值减到0时,可以产生中断,并且得到重装载寄存器的值
寄存器
- CTRL SysTick控制和状态寄存器
- LOAD SysTick自动重装载除值寄存器;
- VAL SysTick当前值寄存器CALIB(一个SysTick时钟周期减1)
- SysTick 校准值寄存器(不常用)
寄存器具体的位
1.CTRL-控制和状态寄存器(SysTick_CLKSourceConfig函数可配置时钟源)
2.LOAD-重装载数值寄存器
3.VAL-当前数值寄存器
程序编写步骤(循环定时)
一、正点原子思路
1、嘀嗒定时器初始化
static u8 fac_us=0; //us延时倍乘数
static u16 fac_ms=0; //ms延时倍乘数,在ucos下,代表每个节拍的ms数
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//设置 SysTick 时钟源,此时SysTick时钟为9M,一个SysTick时钟周期为1/9M
fac_us=9;//延时1us则需要9个SysTick时钟周期
fac_ms=9000;//延时1ms则需要9000个SysTick时钟周期
// fac_us=SystemCoreClock/8000000;
// fac_ms=(u16)fac_us*1000;
}
2、微秒延时
void delay_us(unsigned int nus)
{
u32 tepm;
SysTick->LOAD=nus*fac_us;//重装载值 由初始化可以得到1us的因子
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开始计数
do
{
tepm=SysTick->CTRL;
}
while((tepm&0x01)&&!(tepm&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL=0x00; //清空计数器
}
3、毫秒延时
void delay_ms(unsigned int nms)
{
u32 tepm;
SysTick->LOAD=(u32)nms*fac_ms;//重装载值
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开始计数
do
{
tepm=SysTick->CTRL;
}
while((tepm&0x01)&&!(tepm&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL=0x00; //清空计数器
}
二、野火思路
1、微秒定时
void delay_us( __IO uint32_t us)
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000000);//重装载值为72,72M的时钟频率1us则可由72减到0(一个SysTick时钟周期减一)
for(i=0;i<us;i++)
{
// 当计数器的值减小到0的时候,CRTL寄存器的位16会置1
while( !((SysTick->CTRL)&(1<<16)) );
}
// 关闭SysTick定时器
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
2、毫秒延时
void delay_ms( __IO uint32_t ms)
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000);重装载值为72
for(i=0;i<ms;i++)
{
// 当计数器的值减小到0的时候,CRTL寄存器的位16会置1
// 当置1时,读取该位会清0
while( !((SysTick->CTRL)&(1<<16)) );
}
// 关闭SysTick定时器
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
3、SysTick_Config函数(参数设置重装载LOAD的值)
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
// reload 寄存器为24bit,最大值为2^24
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
// 配置 reload 寄存器的初始值 重转载寄存器
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
// 配置中断优先级为 1<<4-1 = 15,优先级为最低
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
// 配置 counter 计数器的值
SysTick->VAL = 0;
// 配置systick 的时钟为 72M
// 使能中断
// 使能systick
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0);
}```