一,系统定时器的介绍
1.系统定时器是24位定时器,且只能递减
2.原理:重装载寄存器里面的重装载值reload递减,,当递减到0会触发中断,并且会有 置位countflag标志,VAL表示当前值(即递减过程中的那个值)。
然后reload继续从预设值开始递减,周而复始,循环往复。
使用系统定时器不用delay函数的原因:delay函数执行的时候会占用CPU的内存
主要通过设置 reload的值,来设置时间是多长
二、系统定时器的基本配置
(一)结构体
//在core_co3.h里面
typedef struct
{
__IO uint32_t CTRL; //控制及状态寄存器
__IO uint32_t LOAD; //重装载寄存器 ,反映reload值
__IO uint32_t VAL; //重装载寄存器 ,反映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重装载值,执行return(1)退出*/
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* 配置reload值 */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 配置中断优先级 1<<4 -1 =16-1=15【在固件库中 #define __NVIC_PRIO_BITS 4 ;定义了这个为4,所以是左移4位】*/
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | /*配置system时钟为 72M*/
SysTick_CTRL_TICKINT_Msk | /*使能中断*/
SysTick_CTRL_ENABLE_Msk; /*使能systick*/
return (0);
}
SysTick定时器 属于内核的外设,
没有抢占优先级以及子优先级的概念通过判断“IRQn”的值来配置寄存器
①STM32的外设(内核还是片上)都是使用4个二进制来表示中断优先级
②中断优先级的分组对内核和外设同样适用,只需要将中断优先级的四个位按外设优先级来分组即可,人为的进行分出抢占优先级和子优先级。
例举:1<<4 -1=16 -1= 15 (1 1 1 1 )
前面两位表示抢占优先级 后面两位表示子优先级
3 (1 1) 3 (1 1)
void ms_delay(uint16_t ms)
{
uint32_t i;
SysTick_Config(72000); /*调用库函数,设置72000时,计数一次是1ms*/
for(i=0;i<=ms;i++)
{
while(!(SysTick->CTRL)&(1<<16)); /*重置CTRL,让定时器从设定的值再计数一次*/
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; /*使能取反=失能*/
}
/* SysTick->CTRL 是16位数,将1左移16位 就是全是 0.....0,再相与 */