前言
一个学习STM32的小白~ 有错误评论区或私信指出~
提示:以下是本篇文章正文内容,下面案例可供参考
1.SysTick定时器
SysTick:24位系统定时器,只能递减,存在于内核嵌套在NVIC中。所有的Cortex-M中都有这个系统定时器。
重装载值reload递减,当递减到0会触发中断并且会有 置位countflag标志,VAL表示当前值。然后reload继续从预设值开始递减,周而复始。
2.SysTick定时时间计算
- ①T:一个计数循环的时间,跟reload和CLK有关
- ②CLK :72M或者9 M,由CTRL寄存器配置
- ③reload:24位,用户自己配置
T=reload (1/CLK)
CLK=72M, 1us =(72)(1/ 72 000 000)
CLK= 72M, 1ms = (72 000 )* (1/ 72 000 000)
时间单位换算: 1s =1000ms = 1000 000 us = 1000 000 000 ns
3.结构体和库函数
typedef struct
IO uint32_t CTRL; //控制及状态寄存器
IO uint32 t LOAD; //重装载寄存器
1O uint32_t VAL; //重装载寄存器
I uint32_t CALIB; //校准寄存器
SysTick_Type;
static INLINE uint32 _t SysTick Config(uint32_t ticks)
if(ticks > SysTick_LOAD_RELOAD_Msk) return (1); //判断reload的值是否大于最大值2^24SysTick->LOAD =(ticks & SysTick_LOAD_RELOAD_Msk)-1;//配置reload寄存器的初值
NVIC_SetPriority (SysTick_IRQn, (1<< NVIC_PRIO_BITS)-1);//配置中断优先级1<<4-1=16-1=15
SysTick->VAL =0; //配置count的值
SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk| //配置system时钟为 72MSysTick_CTRL_TICKINT_Msk //使能中断
SysTick_CTRL_ENABLE_Msk; //使能systick
return (0);
}
4.SysTick中断优先级
- systick中断优先级配置的是scb->shprx寄存器
- 外设中断优先级配置的是nvic->iprx寄存器
有优先级分组
①STM32的外设(内核还是片上)都是使用4个二进制来表示中断优先级
②中断优先级的分组对内核和外设同样适用,只需要将中断优先级的四个位按外设优先级来分组即可,人为的进行分出抢占优先级和子优先级。例举:
1<<4-1=16-1=15 (1111)
前面两位表示抢占优先级 后面两位表示子优先级
33
5.SysTick应用
编写延时函数
void delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000);
for(i = 0; i<ms ; i++)
{
while(!((SysTick->CTRL)&(1<<16)));
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void delay_us(uint32_t ms)
{
uint32_t i;
SysTick_Config(72);
for(i = 0; i<ms ; i++)
{
while((!(SysTick->CTRL)&(1<<16)));
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}