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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章