1. 程式人生 > >STM32-(SysTick定時器,EXTI外部中斷/事件控制器)

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