时间:2024.10.26-10.27
参考资料:
《零死角玩转STM32》“SysTick--系统定时器”章节
一、学习内容
1.SysTick简介
1.1 SysTick:
系统定时器,24位,只能递减,存在于内核,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。
官方参考手册里的介绍:
系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。(系统嘀嗒校准值寄存器)
详细介绍在STM32F10xxx Cortex-M3编程手册
2.SysTick功能框图
2.1 SysTick功能框图
counter在时钟的驱动下,从reload初值开始往下递减计数到0,产生中断和置位COUNTFLAG标志。然后又从reload值开始重新递减计数,如此循环。
2.2 SysTick 寄存器
SysTick控制及状态寄存器
校准寄存器使用较少,前面三个寄存器较常用
2.3 SysTick定时时间计算
1-t:
一个计数循环(counter在时钟的驱动下,从reload初值开始往下递减计数到0)的时间,跟load和CLK有关
2-CLK:
72M或者9M,又CTRL寄存器配置
3-RELOAD:
24位,用户自己配置
公式:
TIPS:一般程序都是微秒级别的
2.4 SysTick寄存器结构体
在固件库文件:core_cm3.h中定义
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;
2.5 SysTick配置库函数
在固件库文件:core_cm3.h中定义
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//判断tick的值是否大于2^24,如果大于,则不符合规则
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
//初始化reload寄存器的值
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
//配置中断优先级,配置为1<<4-1=15,默认为最低的优先级
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
//初始化counter的值为0
SysTick->VAL = 0; /* Load the SysTick Counter Value */
//配置systick的时钟为72M
//使能中断
//使能systick定时器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
if(IRQn < 0) {
SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
else {
NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
}