|
b) 初始化函數(shù)定義:
void EXTI_Configuration(void); //定義IO中斷初始化函數(shù) c) 初始化函數(shù)調(diào)用: EXTI_Configuration();//IO中斷初始化函數(shù)調(diào)用簡(jiǎn)單應(yīng)用: d) 初始化函數(shù): void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化結(jié)構(gòu)定義 EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);//清除中斷標(biāo)志 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);//管腳選擇 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6); EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//事件選擇 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//觸發(fā)模式 EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4; //線路選擇 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//啟動(dòng)中斷 EXTI_Init(&EXTI_InitStructure);//初始化 } e) RCC初始化函數(shù)中開啟I/O時(shí)鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); GPIO初始化函數(shù)中定義輸入I/O管腳。 //IO輸入,GPIOA的4腳輸入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 f) 在NVIC的初始化函數(shù)里面增加以下代碼打開相關(guān)中斷: NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先級(jí) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應(yīng)級(jí) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //啟動(dòng) NVIC_Init(&NVIC_InitStructure); //初始化 g) 在stm32f10x_it.c文件中找到void USART1_IRQHandler函數(shù),在其中添入執(zhí)行代碼。一般最少三個(gè)步驟:先使用if語(yǔ)句判斷是發(fā)生那個(gè)中斷,然后清除中斷標(biāo)志位,最后給字符串賦值,或做其他事情。 if(EXTI_GetITStatus(EXTI_Line3) != RESET) //判斷中斷發(fā)生來(lái)源 { EXTI_ClearITPendingBit(EXTI_Line3); //清除中斷標(biāo)志 USART_SendData(USART1, 0x41); //發(fā)送字符“a” GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2)));//LED發(fā)生明暗交替 } h) 中斷注意事項(xiàng): 中斷發(fā)生后必須清除中斷位,否則會(huì)出現(xiàn)死循環(huán)不斷發(fā)生這個(gè)中斷。然后需要對(duì)中斷類型進(jìn)行判斷再執(zhí)行代碼。 使用EXTI的I/O中斷,在完成RCC與GPIO硬件設(shè)置之后需要做三件事:初始化EXTI、NVIC開中斷、編寫中斷執(zhí)行代碼。 ********************************************************************************************
我在板子上要使用PB11作為外部中斷,使用stm32f10x_stdperiphere_library 在例子程序中只找到了使用PA3 PA4的,這些線可以直接掛在EXTI3 EXTI4中斷上。 在STM32F10X的中斷向量表中,在EXTI9-5 和EXTI15-10 看來(lái)我只能用EXTI15-10了。 附上初始化程序 void ShuttleKeyInit(void){
中斷服務(wù)程序 /******************************************************************************* 中斷服務(wù)程序要力求精簡(jiǎn),不然會(huì)死機(jī)。沒搞明白是為什么。
******************************************************************************
端口上的16個(gè)外部中斷的任意一個(gè)中斷號(hào),可映射到一組引腳的任意一個(gè)(記住這里,是組中的任意一個(gè))。
舉例來(lái)說(shuō): 外部中斷號(hào)3,只可以映射到引腳PA3、PB3、PC3、PD3、PE3、PF3、PG3這一組中的任意一個(gè)(是一個(gè),不是多個(gè))引腳上,而不能映射其它引腳上。 同理,外部中斷號(hào)4,只可以映射到引腳PA4、PB4、PC4、PD4、PE4、PF4、PG4這一組中的任意一個(gè)引腳上,而不能映射其它引腳上。 另外,外部中斷只有7個(gè)處理接口,外部中斷號(hào)0~4,才具有獨(dú)立的中斷處理接口,外部中斷號(hào)5~9,共享一個(gè)中斷處理接口,外部中斷號(hào)10~15,共享一個(gè)中斷處理接口。 基于上述原因,外部中斷盡量只使用引腳號(hào)0~4,或5~9中的某一個(gè),或10~15中的某一個(gè),以簡(jiǎn)化中斷處理的編寫,同時(shí)也會(huì)縮短外部中斷的處理時(shí)間(外部中斷號(hào)5~9、10~15,如果不止對(duì)應(yīng)一個(gè)中斷號(hào),則需要在中斷處理程序來(lái)確定是哪個(gè)引腳產(chǎn)生的中斷)。 |
|
|
來(lái)自: panhaosun > 《IT學(xué)習(xí)筆記》