目录
一.SysTick简介
1. SysTick概念
- Systick属于系统内核中的外设, 其详细使用说明和寄存器介绍都在M3权威指南手册中.
- Systick内嵌在NVIC中, 系统定时器是一个24bit的向下递减的计数器, 计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于72M。
2. Systick寄存器
- 如图蓝色标记的为SysTick中比较重要的寄存器, 对应校准数值的不常用.
二. 代码详解
1. 寄存器方式驱动
- 值得注意的是系统这里将优先级设置为15, 这里可以根据我们的分组设置来对其进行拆分, 进而判断其优先级. 假如我们分组为2, 那么Systick为(11:11即3:3)在同分组下优先级最低.
/*
核心结构体
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;
*/
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
// 不可能的重装载值,超出范围
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) {
return (1UL);
}
// 设置重装载寄存器
SysTick->LOAD = (uint32_t)(ticks - 1UL);
// 设置中断优先级
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
// 设置当前数值寄存器
SysTick->VAL = 0UL;
// 设置系统定时器的时钟源为AHBCLK=72M
// 使能系统定时器中断
// 使能定时器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0UL);
}
2. 固件库方式驱动
- 值得注意的是, 这里两个配置的先后顺序不能乱, 要先配置计数初值再配置时钟源. 否则如果先配置时钟源, 再配置初值时候内部会将时钟源重新初始化为72M.
- 多长时间进一次中断: 1/(时钟频率/计数初值). 1/(900000/720000) = 0.08s = 80ms进一次中断. 80 * 100 = 8000ms = 8s闪一次灯.
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"
int main()
{
Led_GPIO_Config();
SysTick_Config(720000); //每1s进一次中断
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
void SysTick_Handler(void)
{
static uint16_t count = 0;
count ++;
if(count >= 100)
{
LED_TOGGLE;
count = 0;
}
}
标签:__,定时器,寄存器,Systick,详解,SysTick,uint32
From: https://www.cnblogs.com/Deng-S/p/17717236.html