目录
SysTick简介
SysTick :系统定时器,24位,只能递减,存在于核,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。
SysTick功能框图讲解
递减计数器和重装载寄存器都是24位
counter(递减计数器)在时钟的驱动下,从reload初值(重装载寄存器数值)开始往下递减计数到0,产生中断和置位COUNTFLAG标志。然后又从reload值开始重新递减计数,如此循环。
SysTick相关寄存器
STK_CTRL:控制及状态寄存器
STK_LOAD:重装载数值寄存器
STK_VAL:当前数值寄存器
在固件库文件:core_cm3.h中定义
SysTick定时时间计算
t : 一个计数循环的时间,跟reload和CLK有关
CLK : 72M或者9M,由CTRL寄存器配置
RELOAD (重装载值):24位,用户自己配置
SysTick_Config()函数
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//判断ticks的值是否大于2^24,如果大于则返回1
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
//初始化reload寄存器的值
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
// 配置中断优先级,配置为15,默认为最低的优先级
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
//配置counter计数器的值
SysTick->VAL = 0;
//配置systick的时钟为72M
//使能中断
//使能systick
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0);
}
systick中断优先级
1-SysTick属于内核里面的外设,他的中断优先级跟片上的外设的中断优先级相比,哪个高?
2-systick中断优先级配置的是scb->shprx寄存器﹔而外设的中断优先级配置的是nvic->iprx,有优先级分组,有抢占优先级和子优先级的说法。
SysTick定时实验:编写一个微秒/毫秒延时函数
bsp_systick.h代码
#ifndef _BSP_SYSTICK_H
#define _BSP_SYSTICK_H
#include "stm32f10x.h"
#include "core_cm3.h"
void systick_delay_ns(unsigned int ns);
void systick_delay_us(unsigned int us);
#endif
bsp_systick.c代码
#include "bsp_systick.h"
void systick_delay_ns(unsigned int us)
{
unsigned int i;
SysTick_Config(72);
for(i=0;i<us;i++)
{
while( !((SysTick->CTRL) & (1<<16)) );//等待控制及状态寄存器的标志位
}
SysTick->CTRL = ~SysTick_CTRL_ENABLE_Msk;//失能SysTick
}
void systick_delay_us(unsigned int ms)
{
unsigned int i;
SysTick_Config(72000);
for(i=0;i<ms;i++)
{
while( !((SysTick->CTRL) & (1<<16)) );
}
SysTick->CTRL = ~SysTick_CTRL_ENABLE_Msk;//失能SysTick
}
main.c代码
#include "stm32f10x.h"
#include "led.h"
#include "bsp_systick.h"
int main(void)
{
led_init();
while(1)
{
led_G_ON();
systick_delay_us(500);
led_G_OFF();
systick_delay_us(500);
}
}