當前位置:網站首頁>快樂寒假 22/01/20

快樂寒假 22/01/20

2022-01-27 21:10:43 我不喝忘情水

()EXTI外設 中斷

static void EXTI_NVIC_Config(void)  //加上static說明這個函數只能bsp_exti.c調用
	
	{	
		NVIC_InitTypeDef NVIC_InitStruct;
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置NVIC為優先級組1
		
		NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//配置中斷源為按鍵1
		NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//配置搶占優先級為1
		NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//配置響應(子)優先級為1
		NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能中斷通道
		NVIC_Init(&NVIC_InitStruct);
}


void EXIT_Key_Config(void)
{
		GPIO_InitTypeDef	GPIO_InitStruct;
		EXTI_InitTypeDef	EXTI_InitStruct;
	
	//配置中斷優先級
		EXTI_NVIC_Config();
			/* In order open led */
	//初始化GPIO
		RCC_APB2PeriphClockCmd(EXIT_Key1_GPIO_CLK, ENABLE);//開啟按鍵GPIOA的時鐘
	
		GPIO_InitStruct.GPIO_Pin = EXIT_Key1_GPIO_PIN;		//選擇按鍵用到的GPIO
		GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //配置浮空輸入
		//GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(EXIT_Key1_GPIO_PORT, &GPIO_InitStruct);
	
	//初始化EXTI
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //開啟按鍵GPIOA時鐘
		GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//選擇EXTI的信號源
		EXTI_InitStruct.EXTI_Line = EXTI_Line0;//選擇EXTI的信號源
	
		EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //模式為中斷
	
		EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;  //上昇沿中斷
		
		EXTI_InitStruct.EXTI_LineCmd = ENABLE; //使能中斷

		EXTI_Init(&EXTI_InitStruct); //取地址
	
}

先寫個按鍵中斷函數,在裏面我們先初始化GPIO:開啟GPIO的時鐘,選擇按鍵所在的GPIO,之後配置用的是哪個口,例如按鍵1用的是PA0,則為GPIOB裏的,找到對應的寄存器,對第0比特的電平變化即為控制按鍵電平輸入的變化,IO模式設置為浮空輸入,輸入可以不用管速度,之後對結構體所在函數取地址。

 

然後初始化EXTI,就要開啟EXTI的時鐘,就是GPIOA口的時鐘,之後我們要配置EXTI,選擇中斷信號源,因為我們要控制的按鍵1在PA0,而輸入源為PA0,則選擇中斷線選擇EXTI0。模式為中斷模式,因為按鍵采用的是上昇沿觸發電平,所以采用上昇沿中斷,之後使能,然後取地址結構體。

 到此為止,只是配置好要用的,具體的中斷還沒配置,我們需要配置中斷等級,它分為搶占優先級和子優先級(響應優先級),優先看搶占優先級,且級數越低優先級越高、

而配置優先級,就是配置NVIC(提供中斷的控制器)(Nested vectoredinterrupt controller,即嵌套向量中斷控制器),我們直接用固件庫裏的優先級結構體NVIC_InitTypeDef 。 其中,NVIC可以用其中的寄存器八比特錶達,八比特錶達即可以配置2^8=256中中斷,但是實際上用不了那麼多,所以st公司只用高四比特錶達,低四比特取零,這樣2^4=16,只能錶示16級中斷嵌套。分為5組。用了大哥的圖,我們設置成組1,之後配置中斷源為按鍵1,配置搶占優先級和子優先級,之後使能中斷通道,然後取地址結構體。當我們配完NVIC之後,我們就要編寫中斷函數,就是我們中斷這個進程之後要幹什麼,再之後寫入主函數

int main(){
	LED_GPIO_Config();
	EXIT_Key_Config();
	
}

版權聲明
本文為[我不喝忘情水]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201272110434530.html