中斷原理圖
很多情況可以產(chǎn)生中斷,開發(fā)者可以在CubeMx中NVIC選單、通訊模塊選單處配置。請(qǐng)自行探索;部分中斷有關(guān)的內(nèi)容在模塊講解時(shí)·將會(huì)提到。
※啟用中斷后,注意在System Core->NVIC->Code Generation中勾選生成IRQ Handler和 Select for init Sequence Ordering。
※生成的中斷函數(shù)定義在stm32fxxx_it.h和stm32fxxx_it.c中,向函數(shù)中填要執(zhí)行的代碼即可。
對(duì)于外部中斷的事件分配,多個(gè)引腳將被分配到中斷事件(具體可以參考文檔),若需要區(qū)分則須在中斷程序內(nèi)寫判斷。判斷方式之后給到
配置引腳外部中斷的方式:
①在引腳圖上選中需要配置的引腳,選擇中斷功能(如圖)
②在NVIC選單中使能中斷
③在NVIC->Code Generation中勾選生成IRQ Handler和 Select for init Sequence
勾選Select for init Sequence是個(gè)人習(xí)慣,這樣可以在main.c中生成獨(dú)立初始化函數(shù)
④在GPIO->GPIO配置中斷模式(如圖)
可以配置上/下拉電阻(上拉、下拉、浮空)和中斷觸發(fā)模式。
⑤生成代碼。(stm32fxxx_it.c中,配置為Interrupt Mode)
void EXTI15_10_IRQHandler(void)
{
/* USER CODE BEGIN EXTI15_10_IRQn 0 */
/* USER CODE END EXTI15_10_IRQn 0 */
/* USER CODE BEGIN EXTI15_10_IRQn 1 */
/* USER CODE END EXTI15_10_IRQn 1 */
}
外部觸發(fā)類型與中斷處理:
一、觸發(fā)類型
上升沿觸發(fā)、下降沿觸發(fā)、上升/下降沿觸發(fā)(電平變化觸發(fā))
二、中斷處理※
分為中斷模式(Interrupt Mode) 和 事件模式(Event Mode) 兩種
中斷模式即為普通中斷,其概念不多解釋。配置成中斷模式時(shí),stm32fxxx_it庫(kù)中會(huì)自動(dòng)生成中斷句柄函數(shù)。
※ 事件模式 。(很少用)
參考本文最前面提供的中斷原理圖。在配置為事件模式時(shí),中斷信號(hào)將傳輸給圖中的Pulse Generator而非中斷控制器。
雖然中斷和事件的硬件信號(hào)產(chǎn)生源相同,但是配置為事件時(shí)將不會(huì)發(fā)生掛起,也就是說(shuō)事件過(guò)程不需CPU的參與,可以與主程序并行: 事件機(jī)制提供了一個(gè)完全由硬件自動(dòng)完成的觸發(fā)到產(chǎn)生結(jié)果的通道,不要軟件的參與,降低了CPU的負(fù)荷,節(jié)省了中斷資源,提高了響應(yīng)速度(硬件總快于軟件)。
※事件模式雖然有優(yōu)勢(shì),但在實(shí)際工程中幾乎不會(huì)有人使用。不講了。之后的代碼默認(rèn)使用中斷模式配置。
配置外部中斷需要三步: 1.配置GPIO與中斷線(Input Line)連接 2.中斷線配置 3.中斷向量配置
結(jié)合代碼:
Pin:PC13
Mode:Interrupt; Rising edge Trigger detection
Pull: Floating
在gpio.c :
/*連接引腳與中斷線(EXTICRn)*/
LL_GPIO_AF_SetEXTISource(LL_GPIO_AF_EXTI_PORTC, LL_GPIO_AF_EXTI_LINE13);
/*配置中斷線*/
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_13; //配置觸發(fā)源的連接
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
LL_EXTI_Init(&EXTI_InitStruct);
/*引腳GPIO設(shè)置*/
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_13, LL_GPIO_MODE_FLOATING);
/* EXTI interrupt init*/
NVIC_SetPriority(EXTI15_10_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),1, 0));
NVIC_EnableIRQ(EXTI15_10_IRQn);
※關(guān)于LL_EXTI_LINE_x:
x代表的是中斷線;中斷線(LINEx) 是中斷信號(hào)的輸入硬件。
Line連接GPIO,例如LINE13可接PA13、PB13、PC13....??梢詫⒁_與中斷線理解為短接。中斷線同時(shí)只能連接一個(gè)引腳(LINEx只能連接PAx,PBx,PCx,PDx...其一)。 來(lái)自Input Line的信號(hào)輸入觸發(fā)中斷程序的調(diào)用
※中斷程序結(jié)束時(shí)別忘清除中斷位掛起位
LL API分析:
Input Line引腳輸入配置
stm32fxxx_ll_gpio.h中:
/**/
__STATIC_INLINE void LL_GPIO_AF_SetEXTISource(uint32_t Port, uint32_t Line);/*
使能中斷引腳 Pnx;通過(guò)此函數(shù)將使引腳連接相應(yīng)的EXTI_LINE_x。
@param Port =LL_GPIO_AF_EXTI_PORTn
@param Line =LL_GPIO_AF_EXTI_LINEx
※每次只能配置一個(gè)引腳 Pnx; Pnx 將連接EXTI_LINE_x
*/
__STATIC_INLINE uint32_t LL_GPIO_AF_GetEXTISource(uint32_t Line);/*
返回連接在EXTI_LINEx上的引腳信息(端口號(hào))。
@param Line =LL_GPIO_AF_GPIO_LINEx
@retval:
LL_GPIO_AF_GPIO_PORTn
*/
EXTI_LINE配置結(jié)構(gòu)體LL_EXTI_InitTypeDef
typedef struct
{
uint32_t Line_0_31;/*
EXTI_LINE選擇; Line_0_31= LL_EXTI_LINE_x
*/
FunctionalState LineCommand; /*
使能位。LineCommand= ENABLE
*/
uint8_t Mode;/*
模式選擇; Mode= LL_EXTI_MODE_IT 中斷模式
LL_EXTI_MODE_EVENT 事件模式
LL_EXTI_MODE_IT_EVENT 中斷&事件模式
*/
uint8_t Trigger;/*
觸發(fā)模式選擇; Trigger = LL_EXTI_TRIGGER_NONE 無(wú)觸發(fā)
LL_EXTI_TRIGGER_RISING 上升沿觸發(fā)
LL_EXTI_TRIGGER_FALLING 下降沿觸發(fā)
LL_EXTI_TRIGGER_RISING_FALLING 上升/下降均觸發(fā)
*/
} LL_EXTI_InitTypeDef;
初始化函數(shù)LL_EXTI_Init()
ErrorStatus LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct)/*
初始化并啟用中斷EXTI_LINEx。操作成功返回SUCCESS
*/
重設(shè)中斷結(jié)構(gòu)體
void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct)
{
EXTI_InitStruct- >Line_0_31 = LL_EXTI_LINE_NONE;
EXTI_InitStruct- >LineCommand = DISABLE;
EXTI_InitStruct- >Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct- >Trigger = LL_EXTI_TRIGGER_FALLING;
}
?
軟件中斷觸發(fā)函數(shù)(模擬外部觸發(fā))
__STATIC_INLINE void LL_EXTI_GenerateSWI_0_31(uint32_t ExtiLine)
{//ExtiLine = LL_EXTI_LINE_x;觸發(fā)Line_x對(duì)應(yīng)的中斷處理函數(shù);效果與外部觸發(fā)相同
SET_BIT(EXTI- >SWIER, ExtiLine);
}//軟件觸發(fā)寄存器SWIER改變可以通過(guò)清零掛起位PR清除
中斷線判斷函數(shù):
__STATIC_INLINE uint32_t LL_EXTI_IsActiveFlag_0_31(uint32_t ExtiLine);/*
@param ExtiLine =LL_EXTI_LINE_x
當(dāng)ExtiLine是引發(fā)中斷函數(shù)的中斷線時(shí),返回值為!RESET ;反之返回值RESET (=0)*/
掛起位清除函數(shù):
清除函數(shù)掛起位,使能下一次中斷喚起
__STATIC_INLINE void LL_EXTI_ClearFlag_0_31(uint32_t ExtiLine);/*
@param ExtiLine =LL_EXTI_LINE_x
清除中斷掛起位;若中斷是由軟件模擬外部觸發(fā)實(shí)現(xiàn)的,清除時(shí)一并將SWIER位清除
*/
使用案例
void EXTI15_10_IRQHandler(void)
{
LL_mDelay(10);//按鍵消抖,防止多次觸發(fā)(一置位PR即可能再次觸發(fā))
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_13) != RESET)//當(dāng)中斷由EXTI_LINE_13引起
{
/* USER CODE BEGIN LL_EXTI_LINE_13 */
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_13); //清除標(biāo)志位
LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_15); //翻轉(zhuǎn)LED
/* USER CODE END LL_EXTI_LINE_13 */
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_15) != RESET)//當(dāng)中斷由EXTI_LINE_15引起
{
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_15); //清除標(biāo)志位
}
}
-
下拉電阻
+關(guān)注
關(guān)注
4文章
147瀏覽量
20524 -
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52051 -
中斷控制器
+關(guān)注
關(guān)注
0文章
59瀏覽量
9452 -
串口中斷
+關(guān)注
關(guān)注
0文章
64瀏覽量
13882 -
stm32f1
+關(guān)注
關(guān)注
1文章
56瀏覽量
12199
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論