STM32-(SysTick定时器,EXTI外部中断/事件控制器)

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).

猜你喜欢

转载自blog.csdn.net/qq_37272520/article/details/83313955