目录
1.系统定时器-SysTick
SysTick:24位系统定时器,只能递减,存在于内核嵌套在NVIC中。所有的Cortex-M中都有这个系统定时器。
重装载值reload递减,当递减到0会触发中断并且会有置位countflag标志,VAL表示当前值。然后reload继续从预设值开始递减,周而复始。
2.SysTick定时时间的计算
- T:一个计数循环的时间,跟reload 和CLK有关;
- CLK:72M或者9M,由CTRL寄存器配置;
- reload:24位,用户自己配置;
T = relaod * (1/CLK)
CLK = 72MHZ. 1us = (72) * (1 / 72 000 000)
CLK = 72MHZ. 1ms = (72 000) * (1 / 72 000 000)
时间单位换算:1s = 1000ms = 1000 000us = 1000 000 000ns
3.SysTick结构体
typedef struct
{
__IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register */
__IO uint32_t LOAD; /*!< Offset: 0x04 SysTick Reload Value Register */
__IO uint32_t VAL; /*!< Offset: 0x08 SysTick Current Value Register */
__I uint32_t CALIB; /*!< Offset: 0x0C SysTick Calibration Register */
} SysTick_Type;
4.SysTick固件库函数
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);//判断reload的值是否大于最大值2^24
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;//配置reload寄存器的初值
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //配置中断优先级
SysTick->VAL = 0; //配置count的值
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | //配置system时钟为72M
SysTick_CTRL_TICKINT_Msk | //使能中断
SysTick_CTRL_ENABLE_Msk; //使能systick
return (0);
5.SysTick中断优先级
- system tick 属于内核的外设,它的中断优先级与片上外设的中断优先级相比谁高?依据是什么?
- systick中断优先级配置的是scb -> shprx 寄存器,外设中断优先级配置的是nvic -> iprx 寄存器,有优先级分组
- STM32的外设(内核还是片上)都是使用4个二进制来表示中断优先级
- 中断优先级的分组对内和和外设同样适用,只需要将中断优先级的四个位按外设优先级来分组即可,人为的进行分出抢占优先级和子优先级。例举: 1<<4-1 = 16 - 1 = 15 (1 1 1 1) 前面的两位表示抢占优先级,后面的两位表示子优先级 3 3