Systick系统定时器
介绍:systick定时器上属于CM3内核中的一个外设,内嵌在NVIC中。系统定时器是一个24位向下计数的计数器,计数器每一次计数的时间是1/SYSTICK,一般我们设置SYSTICK为72M。当重载数值寄存器的值递减到0时,系统定时器产生一次中断,以此循环。
使用范围:1.一般用于操作系统,用于产生时基,维持操作系统的心跳。
使用的寄存器:CTRL,LOAD,VAL,CALIB;
例程1:利用systick产生1s的时基。
步骤:
1.设置重载寄存器的值
2.清除当前数值寄存器的值
3.配置控制于状态寄存器
systick配置库函数:
_STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//不可能的重装载值,超出范围
if((ticks - 1UL)>SysTick_LOAD_RELOAD_Msk){
return (1UL);
}
//设置重装载寄存器
SysTick->LOAD = (uint32_t)(tiicks - 1UL);
//设置中断优先级
NVIC_SetPriority(SysTick_IRQn,(1UL<<NVIC_PRIO_BITS)-1UL);
//设置当前数值寄存器
SysTick->VAL = OUL;
//设置系统定时时钟源为AHBCLK=72M
//使能系统定时器中断
//使能定时器
SysTick->CTRL = SysTIck_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
return (OUL);
}
用固件库编程的时候我们只需要调用库函数SysTick_Config()即可,形参ticks用来设置重装载寄存器的值,最大不能超过重装载寄存器的值2^24,当重载寄存器的值递减到0的时候产生中断,然后重载寄存器的值又重新装载往下计数,以此循环。
设置中断优先级:
void NVIC_SetPriority(IRQn_Type IRQn,uin32_t priority)
{
if((int32_t) IRQ<0){
SCB->SHP[(((uint32_t)(int32_t))IRQn)&0XFUL)-4UL] = (uint8_t)((priority<<(8-_NVIC_PRIO_BITS)) &(uint32_t)0xffUL);
}
}
使用:NVIC_SetPriority(Systick_IRQn,(1UL<<_NVIC_PRIO_BITS)-1UL);
配置系统定时器的时钟(AHBCLK)为72M:
SysTick初始化函数:
void SysTick__Init(void)
{
/*systickFrequency / 1000 1ms中断一次*/
/*systickFrequency / 100000 10us中断一次*/
/*systickFrequency / 1000000 1us中断一次*/
if(SysTick_Config(SystemCoreClock / 100000)){
while(1);
}
}
这个函数决定了多长时间产生一次中断。
使能定时器和定时器中断:
函数Delay_us()中我们等待TimingDelay为0,当它为零时表示延时时间到了。所以systick每进一次中断即10us时间
SysTick中断服务函数:
void TimingDelay_Decrement(void)
{
if(TimingDelay !=0x00)
{
TimingDelay--;
}
}
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
TimingDelay的值等于延时函数中传进去的nTime的值,比如nTime=100000,则延时时间等于100000*10us = 1s。
EXTI外部中断/事件控制器
EXTI(external interrupt/event controller) 一外部中断/事件控制器,管理了控制器的20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
EXTI的功能框图:
EXTI可以分为两部分功能,一个产生中断,一个产生事件,这两个功能在硬件上就有所不同。
**中断与事件的区别:产生中断的线路的目的上把输入信号输入到NVIC,进一步会运行中断服务函数,实现功能,这样是软件级别的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级别的。
红色线路上EXTI产生中断的线路,绿色线路上EXTI产生事件的线路。
EXTI初始化结构体详解
typedef struct{
uint32_t EXTI_Line; //中断/事件线
EXTIMode_TypeDef EXTI_Mode;//EXTI模式
EXTITrigger_TypeDef EXTI_Trigger;//触发类型
FunctionalState EXTI_LineCmd;//EXTI使能
}EXTI_InitTypeDef;
1.EXTI_Line:EXTI中断/事件选择,参考上表。
2.EXTI_MODE:EXTI模式选择,可以选择是产生中断还是事件。
3.EXTI_Trigger:EXTI边沿触发事件,可以选择上升沿触发还是下降沿触发或者是边沿触发。
4.EXTI_LineCmd:控制是否使能EXTI线,可选使能EXTI线(ENABLE)或禁用(DISABLE).