? ? ? ? 本人是大一的學(xué)生,學(xué)習(xí)了一段時(shí)間的stm32,此系列博客為個(gè)人的學(xué)習(xí)筆記,方便個(gè)人復(fù)習(xí),如有錯(cuò)誤或問題,非常非常歡迎大家來(lái)大力指正。
簡(jiǎn)單用文字說一下原理。
如果先要清楚了解建議去b站看一下keysking大佬的教程,很有趣易懂(本視頻的部分圖也來(lái)自keysking視頻中的圖片,大家如果要學(xué)習(xí)強(qiáng)烈推薦他的視頻)
當(dāng)EXTI觸發(fā)時(shí),正在運(yùn)行的代碼會(huì)暫停運(yùn)行,跳轉(zhuǎn)到中斷函數(shù)的代碼執(zhí)行,結(jié)束后返回之前停止的代碼,直到下一次中斷觸發(fā)。
外部的電平信號(hào)進(jìn)入輸入驅(qū)動(dòng)器,經(jīng)過上下拉電阻,經(jīng)過施密特觸發(fā)器,通過比較轉(zhuǎn)換將模擬電路轉(zhuǎn)化為數(shù)字電路(也可以不走觸發(fā)器之間傳到模擬輸入口)后到達(dá)片上外設(shè)或者輸入寄存器。到達(dá)外部事件/中斷控制器
進(jìn)入外部事件/中斷控制器
輸入線中其實(shí)有引腳對(duì)應(yīng)的EXTI外部中斷線,編號(hào)為相同數(shù)字的用一條線
邊緣檢測(cè)電路是幫我們配置下降沿/上升沿觸發(fā)中斷信號(hào)的 ,如果觸發(fā)產(chǎn)生一個(gè)高電平。
軟件中斷事件寄存器是可以用代碼模擬創(chuàng)造一個(gè)中斷。
或門有一個(gè)相應(yīng)中斷就輸出中斷。
后面有個(gè)與門,要兩個(gè)都產(chǎn)生相同電平才可以,所以中斷屏蔽發(fā)生器可以控制中斷的傳遞。
之后到達(dá)NVIC(嵌套向量中斷控制器)
EXTI觸發(fā),就會(huì)執(zhí)行對(duì)應(yīng)的處理函數(shù)。函數(shù)處理完要將掛起寄存器清除為0,清除中斷標(biāo)志位
中斷的優(yōu)先級(jí)
①搶占優(yōu)先級(jí)(先判斷,相同就判斷相應(yīng)優(yōu)先級(jí))
②相應(yīng)優(yōu)先級(jí)
一個(gè)中斷正在執(zhí)行,被另一個(gè)打斷,只比較搶占優(yōu)先級(jí)。
2.標(biāo)準(zhǔn)庫(kù)的代碼初始化
標(biāo)準(zhǔn)庫(kù)要AFIO選擇中斷引腳
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
這個(gè)是標(biāo)準(zhǔn)庫(kù)外部中斷的定義
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
開啟AFIO的時(shí)鐘(GPIO為通用引腳,AFIO為復(fù)用引腳,都要開啟外部時(shí)鐘)
將要輸入的引腳的模式設(shè)定為外部輸入,其他像gpio那樣配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
上面那條是開啟GPIOB pin14的外部中斷復(fù)用功能
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
這部分為EXTI外部中斷的配置
???EXTI_InitStructure.EXTI_Line=EXTI_Line14;為配置外部中斷線
? ? EXTI_InitStructure.EXTI_LineCmd=ENABLE;打開使能開關(guān)
? ? EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;選擇中斷模式(有中斷模式和事件模式)
? ? EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;觸發(fā)方式(這里是下降沿觸發(fā))
? ? EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
這里是NVIC優(yōu)先級(jí)的定義
? ?NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置優(yōu)先級(jí)分組
? ? NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//設(shè)置通道(IRQhandler)
? ? NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//通道使能
? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//設(shè)置搶占優(yōu)先級(jí)
? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//設(shè)置響應(yīng)優(yōu)先級(jí)
? ? NVIC_Init(&NVIC_InitStructure);
至此外部中斷是所有都配置好了
而中斷處理函數(shù),產(chǎn)生中斷就會(huì)執(zhí)行下面的函數(shù)
void TIM2_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line14);
}
其中?? ?EXTI_ClearITPendingBit(EXTI_Line14);//清除外部中斷14號(hào)線的中斷標(biāo)志位
3.HAL庫(kù)初始化
GPIO mode為設(shè)置觸發(fā)方式
GPIO pull up/pull down是設(shè)置端口的上下拉
然后在NVIC開啟外部中斷
配置NVIC的優(yōu)先級(jí)
較為方便,直接選數(shù)字就好,數(shù)值越小優(yōu)先級(jí)越高
生成代碼后再stm32f1xx_it.c文件中找到
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}
這個(gè)就是中斷處理函數(shù)
其中HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);//這個(gè)函數(shù)可以幫我們將掛起寄存器清除為0
在中斷函數(shù)中寫下中斷時(shí)需要執(zhí)行的代碼。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-806319.html
補(bǔ)充:如果要使用delay函數(shù),要考慮優(yōu)先級(jí)問題,要將系統(tǒng)滴答(time base:system tick timer)的優(yōu)先級(jí)調(diào)至高于中斷的優(yōu)先級(jí)delay才能實(shí)現(xiàn)延時(shí),如果低于中斷,著輪不到delay產(chǎn)生效果文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-806319.html
到了這里,關(guān)于stm32標(biāo)準(zhǔn)庫(kù)和HAL庫(kù)的對(duì)比學(xué)習(xí)3.《學(xué)習(xí)外部中斷EXIT和應(yīng)用》的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!