1 void Systick_config(uint16_t loadvalue) 2 { 3 SysTick_Config(loadvalue); 4 5 /* Configure the SysTick handler priority */ 6 NVIC_SetPriority(SysTick_IRQn, 0x0); 7 8 } 9 volatile uint32_t i=0; 10 11 /* SystemCoreClock / 100 Setup SysTick Timer for 10 msec interrupts */
1 extern uint32_t i; 2 void SysTick_Handler(void) 3 { 4 if(i<1000) 5 { 6 i++; 7 } 8 else 9 { 10 i=0; 11 if(GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_2)) 12 { 13 Led_Turn_on_all(); 14 printf("on\r\n"); 15 } 16 else 17 { 18 Led_Turn_off_all(); 19 printf("off\r\n"); 20 } 21 } 22 23 24 }
1 * @brief Initialize and start the SysTick counter and its interrupt. 2 * 3 * @param ticks number of ticks between two interrupts 4 * @return 1 = failed, 0 = successful 5 * 6 * Initialise the system tick timer and its interrupt and start the 7 * system tick timer / counter in free running mode to generate 8 * periodical interrupts. 9 */ 10 static __INLINE uint32_t SysTick_Config(uint32_t ticks) 11 { 12 if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ 13 14 SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ 15 NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ 16 SysTick->VAL = 0; /* Load the SysTick Counter Value */ 17 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | 18 SysTick_CTRL_TICKINT_Msk | 19 SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ 20 return (0); /* Function successful */ 21 }
SysTick_Config(SystemFrequency / 10) 函数的形参就是systick重装定时器的值。
systck计数频率为每秒72000000次,所以7200000次就是1/10秒,也就是100ms。
SysTick是1个24bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源
STK_CSR, 0xE000E010 -- 控制寄存器
STK_LOAD, 0xE000E014 -- 重载寄存器
STK_VAL, 0xE000E018 -- 当前值寄存器
STK_CALRB, 0xE000E01C -- 校准值寄存器
官方库定义
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;
首先看STK_CSR控制寄存器:寄存器内有4个位t具有意义
第0位:ENABLE,Systick 使能位 (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位 (0:关闭Systick中断;1:开启Systick中断)
第2位:CLKSOURCE,Systick时钟源选择 (0:使用HCLK/8 作为Systick时钟,外部参考时钟;1:使用HCLK作为Systick时钟,内部参考时钟)
第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零
STK_LOAD 重载寄存器:
Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24位的寄存器最大计数0xFFFFFF。
STK_VAL当前值寄存器:
也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。
STK_CALRB 校准值寄存器:
这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:
位31 NOREF :1=没有外部参考时钟(STCLK 不可用)0=外部参考时钟可用
位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms
位[23:0] :Calibration value
写个systick关闭的函数,直接操作寄存器
1 void Systick_Close() 2 { 3 SysTick->CTRL=0x0; 4 }