找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 22127|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32事件 中斷事件 中斷的詳解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:98618 發(fā)表于 2015-12-8 03:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
凡從事過(guò)ST MCU應(yīng)用開(kāi)發(fā)的人往往會(huì)遇到事件、中斷事件 中斷三個(gè)概念或術(shù)語(yǔ)。這三個(gè)概念彼此關(guān)聯(lián),有時(shí)會(huì)讓人有點(diǎn)混淆或犯迷糊。

先拿一件生活中的事情打比方對(duì)上述三個(gè)概念做個(gè)基本的粗略理解,之后再分享一個(gè)STM32 GPIO外部中斷配置案例。


比如一老師在教室里給學(xué)生們上課。課堂上的學(xué)生可能做出各種行為動(dòng)作,比方做筆記、打哈氣、翻書(shū)包、講小話等,我們把這些行為統(tǒng)稱為事件,其中有些行為老師往往只是視而不見(jiàn),繼續(xù)他的上課;而有些行為可能導(dǎo)致老師的上課中止,比方講小話,并對(duì)學(xué)生的相關(guān)行為予以警告、批評(píng)或糾正等,然后繼續(xù)上課。我們把老師因?yàn)閷W(xué)生的某些行為而中止授課,并產(chǎn)生后續(xù)動(dòng)作,之后接著上課的這個(gè)過(guò)程理解為中斷或中斷響應(yīng)。我們把可能導(dǎo)致老師上課中斷的學(xué)生行為理解為中斷事件。

結(jié)合上面的比方,不難理解中斷事件是一種可以導(dǎo)致中斷發(fā)生的事件,中斷則是因?yàn)橹袛嗍录陌l(fā)生而導(dǎo)致的后續(xù)行為過(guò)程。事件與中斷事件是包含關(guān)系,即事件可分為中斷事件或非中斷事件。而中斷事件與中斷之間屬于前后關(guān)聯(lián)的因果關(guān)系,雖有關(guān)聯(lián),但二者在時(shí)序上、行為上并不一樣。

結(jié)合具體的ST MCU運(yùn)行過(guò)程,其中會(huì)有許多各種各樣的事件,比方管腳電平變化、計(jì)數(shù)器溢出、DMA空、FIFO非空、AD轉(zhuǎn)換結(jié)束、超時(shí)、外設(shè)使能、初始化等等,其中有些事件是不會(huì)導(dǎo)致中斷產(chǎn)生的,比方外設(shè)使能或部分初始化動(dòng)作是不會(huì)導(dǎo)致中斷發(fā)生的,有些事件就可能導(dǎo)致中斷發(fā)生,比方計(jì)數(shù)器溢出,AD轉(zhuǎn)換結(jié)束等,這些就是中斷事件。當(dāng)然這些中斷事件最終能否觸發(fā)后續(xù)中斷,得看是否開(kāi)啟了該中斷事件的中斷使能,相關(guān)中斷矢量控制器【NVIC】是否配置,最終讓CPU內(nèi)核參與進(jìn)來(lái),并完成后續(xù)的中斷服務(wù)動(dòng)作。

不妨借助STM32 MCU的GPIO的外部事件與中斷控制器的框圖來(lái)理解上述概念。


從上圖可以看出,不論外部電平變化成為中斷事件還是非中斷事件,綠色方框部分都是一樣的,即具有相同的觸發(fā)源。差別就在后面。一般性事件要變?yōu)橹袛嗍录糜邢嚓P(guān)中斷使能位的允許。中斷事件再向CPU激活相關(guān)中斷請(qǐng)求,在NVIC配置相應(yīng)中斷矢量后,CPU便參與進(jìn)行后續(xù)的中斷響應(yīng)服務(wù)【如保存現(xiàn)場(chǎng)、執(zhí)行中斷服務(wù)程序、恢復(fù)現(xiàn)場(chǎng)并返回】,而非中斷事件就沒(méi)有中斷事件后續(xù)的流程,只是有些硬件觸發(fā)信號(hào)或標(biāo)志的產(chǎn)生。當(dāng)然非中斷事件的形成也是可控的。


既然一個(gè)可以觸發(fā)中斷的事件可能被配置中斷事件或非中斷事件,那么在相關(guān)事件的觸發(fā)配置時(shí)就出現(xiàn)兩種可能,即允許產(chǎn)生中斷或禁止產(chǎn)生中斷。于是乎,ST MCU參考手冊(cè)里在談到事件的觸發(fā)方式時(shí)就引出了事件模式中斷模式兩個(gè)概念。


比方STM32的GPIO口的電平跳變基本都是可以觸發(fā)外部中斷的。但在具體配置時(shí),可以根據(jù)需要來(lái)決定啟用還是禁用相關(guān)腳的中斷功能,從而選擇不同的事件觸發(fā)方式,即事件模式和中斷模式。如果不希望電平跳變事件觸發(fā)中斷,就配置為事件模式,反之,配置為中斷模式。


好,我們一起來(lái)看看一個(gè)具體的案例。

某工程師做了一塊STM32F407的工程樣板,利用ST官方推出的STM32配置工具STM32CubeMx做MCU基本管腳和外設(shè)的軟硬件配置并生成相關(guān)代碼。令他郁悶的是,竟然在做某GPIO做按鍵中斷時(shí)卡殼了,發(fā)現(xiàn)不論怎么按鍵就是不進(jìn)中斷程序。

經(jīng)溝通了解,他用到的的那個(gè)GPIO是個(gè)很普通的腳,并非什么特別功能腳。按鍵電路也很常規(guī)簡(jiǎn)單。順便看了下的相關(guān)配置代碼?吹狡銰PIO初始化代碼時(shí),發(fā)現(xiàn)有關(guān)GPIO模式的地方有問(wèn)題,也就是如下紅色標(biāo)注的代碼行的地方。

void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

/* GPIO Ports Clock Enable */

__GPIOE_CLK_ENABLE();

/*Configure GPIO pin : PE2 */

GPIO_InitStruct.Pin = GPIO_PIN_2;

GPIO_InitStruct.Mode = GPIO_MODE_EVT_FALLING;

GPIO_InitStruct.Pull = GPIO_PULLUP;

HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

/* EXTI interrupt init*/

HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(EXTI2_IRQn);

}

紅色語(yǔ)句代碼是將該GPIO配置為下降沿觸發(fā)的事件模式了,而不是中斷模式。在利用STM32CubeMx對(duì)GPIO管腳進(jìn)行模式配置時(shí)往往有很多選項(xiàng),這些選項(xiàng)又可分為2大類(lèi)。分別是中斷模式和事件模式!緄nterrupt mode / event mode】


既然配置成了事件模式,按鍵自然沒(méi)法觸發(fā)中斷及相關(guān)服務(wù)程序。讓其修改為中斷模式,即將上面配置修改為下面語(yǔ)句后即OK.

GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;


在STM32相關(guān)參考手冊(cè)里,涉及中斷【INTERRUPT】和事件【EVENT】二詞表述的地方比較多,加上這兩個(gè)詞的含義比較寬泛。手冊(cè)里可能會(huì)用interrupt或interrupt event表述同一東西,或者說(shuō)interrup泛指中斷事件及后續(xù)中斷響應(yīng)全過(guò)程。比方類(lèi)似下面語(yǔ)句的地方:




有時(shí)用Interrupt event明確出來(lái)。比方下面表格中提到interrupt event.



總之,不管手冊(cè)上怎么寫(xiě),不必拘泥于字詞符號(hào),結(jié)合上下文弄清怎么回事就好。

凡從事過(guò)ST MCU應(yīng)用開(kāi)發(fā)的人往往會(huì)遇到事件中斷事件 中斷三個(gè)概念或術(shù)語(yǔ)。這三個(gè)概念彼此關(guān)聯(lián),有時(shí)會(huì)讓人有點(diǎn)混淆或犯迷糊。

先拿一件生活中的事情打比方對(duì)上述三個(gè)概念做個(gè)基本的粗略理解,之后再分享一個(gè)STM32 GPIO外部中斷配置案例。


比如一老師在教室里給學(xué)生們上課。課堂上的學(xué)生可能做出各種行為動(dòng)作,比方做筆記、打哈氣、翻書(shū)包、講小話等,我們把這些行為統(tǒng)稱為事件,其中有些行為老師往往只是視而不見(jiàn),繼續(xù)他的上課;而有些行為可能導(dǎo)致老師的上課中止,比方講小話,并對(duì)學(xué)生的相關(guān)行為予以警告、批評(píng)或糾正等,然后繼續(xù)上課。我們把老師因?yàn)閷W(xué)生的某些行為而中止授課,并產(chǎn)生后續(xù)動(dòng)作,之后接著上課的這個(gè)過(guò)程理解為中斷或中斷響應(yīng)。我們把可能導(dǎo)致老師上課中斷的學(xué)生行為理解為中斷事件。

結(jié)合上面的比方,不難理解中斷事件是一種可以導(dǎo)致中斷發(fā)生的事件,中斷則是因?yàn)橹袛嗍录陌l(fā)生而導(dǎo)致的后續(xù)行為過(guò)程。事件與中斷事件是包含關(guān)系,即事件可分為中斷事件或非中斷事件。而中斷事件與中斷之間屬于前后關(guān)聯(lián)的因果關(guān)系,雖有關(guān)聯(lián),但二者在時(shí)序上、行為上并不一樣。

結(jié)合具體的ST MCU運(yùn)行過(guò)程,其中會(huì)有許多各種各樣的事件,比方管腳電平變化、計(jì)數(shù)器溢出、DMA空、FIFO非空、AD轉(zhuǎn)換結(jié)束、超時(shí)、外設(shè)使能、初始化等等,其中有些事件是不會(huì)導(dǎo)致中斷產(chǎn)生的,比方外設(shè)使能或部分初始化動(dòng)作是不會(huì)導(dǎo)致中斷發(fā)生的,有些事件就可能導(dǎo)致中斷發(fā)生,比方計(jì)數(shù)器溢出,AD轉(zhuǎn)換結(jié)束等,這些就是中斷事件。當(dāng)然這些中斷事件最終能否觸發(fā)后續(xù)中斷,得看是否開(kāi)啟了該中斷事件的中斷使能,相關(guān)中斷矢量控制器【NVIC】是否配置,最終讓CPU內(nèi)核參與進(jìn)來(lái),并完成后續(xù)的中斷服務(wù)動(dòng)作。

不妨借助STM32 MCU的GPIO的外部事件與中斷控制器的框圖來(lái)理解上述概念。


從上圖可以看出,不論外部電平變化成為中斷事件還是非中斷事件,綠色方框部分都是一樣的,即具有相同的觸發(fā)源。差別就在后面。一般性事件要變?yōu)橹袛嗍录,得有相關(guān)中斷使能位的允許。中斷事件再向CPU激活相關(guān)中斷請(qǐng)求,在NVIC配置相應(yīng)中斷矢量后,CPU便參與進(jìn)行后續(xù)的中斷響應(yīng)服務(wù)【如保存現(xiàn)場(chǎng)、執(zhí)行中斷服務(wù)程序、恢復(fù)現(xiàn)場(chǎng)并返回】,而非中斷事件就沒(méi)有中斷事件后續(xù)的流程,只是有些硬件觸發(fā)信號(hào)或標(biāo)志的產(chǎn)生。當(dāng)然非中斷事件的形成也是可控的。


既然一個(gè)可以觸發(fā)中斷的事件可能被配置中斷事件或非中斷事件,那么在相關(guān)事件的觸發(fā)配置時(shí)就出現(xiàn)兩種可能,即允許產(chǎn)生中斷或禁止產(chǎn)生中斷。于是乎,ST MCU參考手冊(cè)里在談到事件的觸發(fā)方式時(shí)就引出了事件模式中斷模式兩個(gè)概念。


比方STM32的GPIO口的電平跳變基本都是可以觸發(fā)外部中斷的。但在具體配置時(shí),可以根據(jù)需要來(lái)決定啟用還是禁用相關(guān)腳的中斷功能,從而選擇不同的事件觸發(fā)方式,即事件模式和中斷模式。如果不希望電平跳變事件觸發(fā)中斷,就配置為事件模式,反之,配置為中斷模式。


好,我們一起來(lái)看看一個(gè)具體的案例。

某工程師做了一塊STM32F407的工程樣板,利用ST官方推出的STM32配置工具STM32CubeMx做MCU基本管腳和外設(shè)的軟硬件配置并生成相關(guān)代碼。令他郁悶的是,竟然在做某GPIO做按鍵中斷時(shí)卡殼了,發(fā)現(xiàn)不論怎么按鍵就是不進(jìn)中斷程序。

經(jīng)溝通了解,他用到的的那個(gè)GPIO是個(gè)很普通的腳,并非什么特別功能腳。按鍵電路也很常規(guī)簡(jiǎn)單。順便看了下的相關(guān)配置代碼?吹狡銰PIO初始化代碼時(shí),發(fā)現(xiàn)有關(guān)GPIO模式的地方有問(wèn)題,也就是如下紅色標(biāo)注的代碼行的地方。

void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

/* GPIO Ports Clock Enable */

__GPIOE_CLK_ENABLE();

/*Configure GPIO pin : PE2 */

GPIO_InitStruct.Pin = GPIO_PIN_2;

GPIO_InitStruct.Mode = GPIO_MODE_EVT_FALLING;

GPIO_InitStruct.Pull = GPIO_PULLUP;

HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

/* EXTI interrupt init*/

HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(EXTI2_IRQn);

}

紅色語(yǔ)句代碼是將該GPIO配置為下降沿觸發(fā)的事件模式了,而不是中斷模式。在利用STM32CubeMx對(duì)GPIO管腳進(jìn)行模式配置時(shí)往往有很多選項(xiàng),這些選項(xiàng)又可分為2大類(lèi)。分別是中斷模式和事件模式!緄nterrupt mode / event mode】


既然配置成了事件模式,按鍵自然沒(méi)法觸發(fā)中斷及相關(guān)服務(wù)程序。讓其修改為中斷模式,即將上面配置修改為下面語(yǔ)句后即OK.

GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;


在STM32相關(guān)參考手冊(cè)里,涉及中斷【INTERRUPT】和事件【EVENT】二詞表述的地方比較多,加上這兩個(gè)詞的含義比較寬泛。手冊(cè)里可能會(huì)用interrupt或interrupt event表述同一東西,或者說(shuō)interrup泛指中斷事件及后續(xù)中斷響應(yīng)全過(guò)程。比方類(lèi)似下面語(yǔ)句的地方:




有時(shí)用Interrupt event明確出來(lái)。比方下面表格中提到interrupt event.



總之,不管手冊(cè)上怎么寫(xiě),不必拘泥于字詞符號(hào),結(jié)合上下文弄清怎么回事就好。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表