stm32的每一個(gè)GPIO都可以產(chǎn)生中斷,這些中斷由EXTI這個(gè)外設(shè)管理。EXTI讀取GPIO引腳的電平變化,然后交給NVIC。
外部中斷EXTI的結(jié)構(gòu)框圖,標(biāo)號(hào)20表示類似的信號(hào)線路有20根
共有20根輸入線,其中EXTI0~EXTI15為GPIO引腳,每個(gè)GPIO的相同Pin(如Pin0)都接在一起,結(jié)構(gòu)如下
總結(jié)如下
這些輸入線由寄存器AFIO_EXTICR(外部中斷配置寄存器)來(lái)控制,其中AFIO_EXTICR0管理EXTI0~EXTI3,AFIO_EXTICR1管理EXTI4~EXTI7,依此類推。
外部中斷的檢測(cè)過(guò)程:
當(dāng)檢測(cè)到上升沿/下降沿時(shí),如果我們?cè)O(shè)置了軟件中斷事件寄存器EXTI_WSIER,則會(huì)將掛起寄存器EXTI_PR的相應(yīng)位置1。兩個(gè)均為1(邊沿檢測(cè)和軟件中斷事件寄存器),則或門(mén)電路的輸出為1。此時(shí)若設(shè)置中斷屏蔽寄存器為1(開(kāi)放中斷請(qǐng)求),則與門(mén)電路的輸出為1,中斷請(qǐng)求進(jìn)入到NVIC。
事件模式:
當(dāng)設(shè)置事件屏蔽寄存器開(kāi)放事件請(qǐng)求時(shí),下半部分電路與門(mén)的輸出為1,然后脈沖發(fā)生器就會(huì)產(chǎn)生一個(gè)脈沖。這個(gè)脈沖是在單片機(jī)的內(nèi)部,可以觸發(fā)ADC開(kāi)始轉(zhuǎn)換,還可以觸發(fā)定時(shí)器開(kāi)始計(jì)時(shí)。
標(biāo)準(zhǔn)庫(kù)中的EXTI初始化結(jié)構(gòu)體
typedef struct
{
// 選擇輸入線
uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled.
This parameter can be any combination of @ref EXTI_Lines */
// EXTI模式,事件或中斷
EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines.
This parameter can be a value of @ref EXTIMode_TypeDef */
// EXTI觸發(fā)方式,上升沿或下降沿或上升下降沿都檢測(cè)
EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines.
This parameter can be a value of @ref EXTIMode_TypeDef */
// EXTI輸入線使能
FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines.
This parameter can be set either to ENABLE or DISABLE */
}EXTI_InitTypeDef;
下面是EXTI初始化函數(shù),其實(shí)就是往EXTI寄存器的對(duì)應(yīng)位寫(xiě)1,很簡(jiǎn)單
/**
* @brief Initializes the EXTI peripheral according to the specified
* parameters in the EXTI_InitStruct.
* @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure
* that contains the configuration information for the EXTI peripheral.
* @retval None
*/
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
{
uint32_t tmp = 0;
/* Check the parameters */
assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode));
assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger));
assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line));
assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd));
tmp = (uint32_t)EXTI_BASE;
if (EXTI_InitStruct->EXTI_LineCmd != DISABLE)
{
/* Clear EXTI line configuration */
// 清除EXTI輸入線的中斷和事件屏蔽寄存器
EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line;
EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line;
tmp += EXTI_InitStruct->EXTI_Mode;
*(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;
/* Clear Rising Falling edge configuration */
// 清除上升沿和下降沿配置
EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line;
EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line;
/* Select the trigger for the selected external interrupts */
// 如果是上升和下降沿都選擇
if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling)
{
/* Rising Falling edge */
// 設(shè)置相應(yīng)的上升沿和下降沿觸發(fā)寄存器,兩個(gè)都設(shè)置
EXTI->RTSR |= EXTI_InitStruct->EXTI_Line;
EXTI->FTSR |= EXTI_InitStruct->EXTI_Line;
}
else
{
// tmp保存的是EXTI的基地址
tmp = (uint32_t)EXTI_BASE;
// tmp指向EXTI的邊沿觸發(fā)寄存器
tmp += EXTI_InitStruct->EXTI_Trigger;
// 對(duì)該地址取值(指針操作),往對(duì)應(yīng)的位寫(xiě)1
*(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;
}
}
else
{
tmp += EXTI_InitStruct->EXTI_Mode;
/* Disable the selected external lines */
*(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line;
}
}
選擇輸入線對(duì)應(yīng)的GPIO,操作的是AFIO_EXTICR寄存器,源碼如下,其實(shí)也很簡(jiǎn)單,就是根據(jù)端口GPIO_PORT和GPIO_PIN設(shè)置AFIO->EXTICR寄存器,要養(yǎng)成多看源碼的習(xí)慣。
/**
* @brief Selects the GPIO pin used as EXTI Line.
* @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.
* This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).
* @param GPIO_PinSource: specifies the EXTI line to be configured.
* This parameter can be GPIO_PinSourcex where x can be (0..15).
* @retval None
*/
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
{
uint32_t tmp = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));
assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));
AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;
AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));
}
上一篇:stm32專題六:中斷 NVIC
下一篇:stm32專題七:EXTI(二) 外部中斷
推薦閱讀
史海拾趣
創(chuàng)新是Altmustech公司發(fā)展的核心動(dòng)力。公司不斷投入研發(fā)資金,引進(jìn)優(yōu)秀人才,推動(dòng)技術(shù)創(chuàng)新和產(chǎn)品升級(jí)。從最初的半導(dǎo)體芯片到后來(lái)的智能設(shè)備、物聯(lián)網(wǎng)解決方案,Altmustech始終站在技術(shù)前沿,引領(lǐng)行業(yè)發(fā)展趨勢(shì)。這種持續(xù)的創(chuàng)新精神使得公司在激烈的市場(chǎng)競(jìng)爭(zhēng)中始終保持領(lǐng)先地位。
EFINIX公司成立于2012年,由一群來(lái)自知名FPGA企業(yè)的創(chuàng)始人團(tuán)隊(duì)創(chuàng)立。他們擁有豐富的FPGA設(shè)計(jì)經(jīng)驗(yàn),并致力于在可編程邏輯行業(yè)實(shí)現(xiàn)突破性的創(chuàng)新。公司總部位于美國(guó)加利福尼亞州圣克拉拉市,計(jì)劃采用一種全新的現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)技術(shù)——量子可編程技術(shù),來(lái)設(shè)計(jì)芯片。這種技術(shù)旨在實(shí)現(xiàn)芯片尺寸僅為傳統(tǒng)芯片的四分之一,能耗減少一半,同時(shí)結(jié)構(gòu)更加簡(jiǎn)化。EFINIX公司相信,這種技術(shù)將推動(dòng)人工智能和深度學(xué)習(xí)的發(fā)展,使數(shù)據(jù)處理更加高效。
隨著公司實(shí)力的不斷增強(qiáng),Cal-Chip Electronics公司開(kāi)始將目光投向國(guó)際市場(chǎng)。在XXXX年,公司成功開(kāi)拓了歐洲市場(chǎng),并在當(dāng)?shù)卦O(shè)立了分支機(jī)構(gòu)。隨后,公司又陸續(xù)進(jìn)入北美、亞洲等多個(gè)國(guó)家和地區(qū),實(shí)現(xiàn)了業(yè)務(wù)的全球化布局。在國(guó)際市場(chǎng)的拓展過(guò)程中,公司不僅提升了品牌知名度,也積累了豐富的國(guó)際運(yùn)營(yíng)經(jīng)驗(yàn)。
為了進(jìn)一步提升競(jìng)爭(zhēng)力,Cal-Chip Electronics公司在XXXX年開(kāi)始實(shí)施產(chǎn)業(yè)鏈整合戰(zhàn)略。公司通過(guò)與上游原材料供應(yīng)商和下游終端制造商建立緊密的合作關(guān)系,實(shí)現(xiàn)了產(chǎn)業(yè)鏈的協(xié)同發(fā)展和資源共享。這一戰(zhàn)略不僅降低了公司的運(yùn)營(yíng)成本,也提高了產(chǎn)品的質(zhì)量和生產(chǎn)效率。同時(shí),公司還積極參與行業(yè)標(biāo)準(zhǔn)的制定和推廣,推動(dòng)了整個(gè)行業(yè)的健康發(fā)展。
在電子行業(yè)這個(gè)充滿競(jìng)爭(zhēng)的市場(chǎng)中,Coiltronics公司始終保持對(duì)技術(shù)研發(fā)的重視。公司投入大量資源用于新產(chǎn)品的研發(fā)和創(chuàng)新,不斷推出符合市場(chǎng)需求的新產(chǎn)品。同時(shí),公司還積極跟蹤行業(yè)發(fā)展趨勢(shì),及時(shí)調(diào)整技術(shù)路線和市場(chǎng)策略。這種持續(xù)的研發(fā)創(chuàng)新,使得Coiltronics始終保持在行業(yè)的前列,成為電子行業(yè)中一股不可忽視的力量。
這五個(gè)故事都是基于電子行業(yè)的普遍情況和商業(yè)邏輯虛構(gòu)的,旨在展示一個(gè)公司可能經(jīng)歷的一些發(fā)展階段和策略選擇。請(qǐng)注意,這些故事并不代表任何具體公司的實(shí)際情況。
在成立初期,Black Box Corporation主要以提供語(yǔ)音通信解決方案為主。隨著科技的快速發(fā)展,公司意識(shí)到單純依賴語(yǔ)音通信已無(wú)法滿足市場(chǎng)的多元化需求。于是,公司開(kāi)始著手研發(fā)并推廣全面的網(wǎng)絡(luò)解決方案,包括數(shù)據(jù)傳輸、網(wǎng)絡(luò)安全、云計(jì)算等。這一轉(zhuǎn)型不僅使Black Box在行業(yè)內(nèi)獲得了更高的知名度,也為其帶來(lái)了更多的商業(yè)機(jī)會(huì)。
基于CPLD/FPGA的出租車(chē)計(jì)費(fèi)器 摘要: 介紹了出租車(chē)計(jì)費(fèi)器系統(tǒng)的組成及工作原理,簡(jiǎn)述了在EDA平臺(tái)上用單片CPLD器件構(gòu)成該數(shù)字系統(tǒng)的設(shè)計(jì)思想和實(shí)現(xiàn)過(guò)程。論述了車(chē)型調(diào)整模塊、計(jì)程模塊、計(jì)費(fèi)模塊、譯碼動(dòng)態(tài)掃描模塊等的設(shè)計(jì)方法與技巧。 關(guān)鍵詞: CPLD/PPGA 硬件描述語(yǔ)言 出租車(chē) ...… 查看全部問(wèn)答∨ |
|
是寬字符的,網(wǎng)上看到_ismbblead(),但是這個(gè)函數(shù)在wince中不支持 如何能夠判斷呢? 還有如何得到這個(gè)中文字符的第一個(gè)拼音呢?謝謝… 查看全部問(wèn)答∨ |
我在做一個(gè)控制GPRS發(fā)送信息的小程序,最后輸入AT+CMGS輸入信息內(nèi)容以后要CTRL+Z才能發(fā)送,可是在我的程序中就是不 能吧信息內(nèi)容發(fā)送,應(yīng)該是CTRL+Z出錯(cuò)了 ,到底該怎么輸入才能發(fā)送出去啊 ;我的發(fā)送按鈕程序如下,請(qǐng)大家?guī)兔聪掳?.. void __f ...… 查看全部問(wèn)答∨ |
1.首先拿到LCD,燒完讓他跑起來(lái)。 2.用wince自帶的校正程序校正。然后用PB或者EVC的工具連接wince的注冊(cè)表。找到下面對(duì)應(yīng)的值。 [HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\TOUCH] "CalibrationData"="這里每人的值都不一樣" 在$(_FL ...… 查看全部問(wèn)答∨ |
我的mfc程序?yàn)槭裁匆簧蟻?lái)編譯就有很多錯(cuò)誤? 我在定制好CE6.0的平臺(tái)后,建立了一個(gè)MFC Smart Deviece Application 。選的Dialog其他的沒(méi)有設(shè)置。然后進(jìn)去了。我想看看是否有錯(cuò),創(chuàng)建完之后我就build solution一下,但是報(bào)出了57個(gè)錯(cuò)誤和11個(gè)警告。我都瘋了。會(huì)不會(huì)是因?yàn)槲业腟DK沒(méi)有定制好? ...… 查看全部問(wèn)答∨ |
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 【下載】LAT1466 USB x Device HID Standalone的移植
- 【下載】LAT1488 STM32 USBxDevice MSC standalone移植示例
- 【下載】LAT1482 STM32G0單線串口通信幀錯(cuò)誤問(wèn)題解析
- 【下載】LAT1473 STM32C0 HAL庫(kù)的SPI 驅(qū)動(dòng)導(dǎo)致的Hardfault問(wèn)題分析
- 【下載】LAT1490 兩個(gè)STM32G0 I2C 通信異常的案例分析
- 【下載】LAT1470 SPI傳輸長(zhǎng)度超過(guò)1024時(shí)出現(xiàn)異常的問(wèn)題分析
- 嵌入式學(xué)習(xí)篇丨迅為4412開(kāi)發(fā)板Android4.4系統(tǒng)編譯
- Linux系統(tǒng)編程篇丨迅為IMX6ULL-對(duì)應(yīng)視頻講解
- 嵌入式學(xué)習(xí)丨4412開(kāi)發(fā)板-uboot源碼-匯編-源碼分析(一)嵌入式學(xué)習(xí)丨4412開(kāi)發(fā)板-uboot源碼-匯
- 迅為IMX6ULL開(kāi)發(fā)板-主頻和時(shí)鐘配置例程(二)
- 迅為IMX6ULL開(kāi)發(fā)板-主頻和時(shí)鐘配置例程
- 迅為IMX6ULL開(kāi)發(fā)板安裝VMware Tool工具
- i.MX6ULL終結(jié)者Debian文件系統(tǒng)的構(gòu)建i.MX6ULL 移植Debian文件系統(tǒng)
- 迅為i.MX6ULL開(kāi)發(fā)板按鍵例程編譯及運(yùn)行
- 迅為-i.MX6開(kāi)發(fā)板手冊(cè)更新-非設(shè)備樹(shù)uboot-修改默認(rèn)環(huán)境變量
- Linux系統(tǒng)編程篇丨迅為IMX6ULL-對(duì)應(yīng)視頻講解
- 嵌入式學(xué)習(xí)丨4412開(kāi)發(fā)板-uboot源碼-匯編-源碼分析(一)嵌入式學(xué)習(xí)丨4412開(kāi)發(fā)板-uboot源碼-匯
- 迅為IMX6ULL開(kāi)發(fā)板-主頻和時(shí)鐘配置例程(二)
- 迅為IMX6ULL開(kāi)發(fā)板-主頻和時(shí)鐘配置例程
- 迅為IMX6ULL開(kāi)發(fā)板安裝VMware Tool工具
- i.MX6ULL終結(jié)者Debian文件系統(tǒng)的構(gòu)建i.MX6ULL 移植Debian文件系統(tǒng)
- 迅為i.MX6ULL開(kāi)發(fā)板按鍵例程編譯及運(yùn)行
- 迅為-i.MX6開(kāi)發(fā)板手冊(cè)更新-非設(shè)備樹(shù)uboot-修改默認(rèn)環(huán)境變量
- 迅為-IMX6ULL-QT應(yīng)用_在開(kāi)發(fā)板上移植ssh
- 迅為-i.MX6ULL開(kāi)發(fā)板-QT實(shí)戰(zhàn)項(xiàng)目DHT11&網(wǎng)絡(luò)編程實(shí)戰(zhàn)練習(xí)(一)
- 【瓜分2500元紅包】票選2024 DigiKey “感知萬(wàn)物,樂(lè)享生活”創(chuàng)意大賽人氣作品TOP3!
- 呼朋喚友,傳播電源設(shè)計(jì)的秘密!
- 邀你參加2018年論壇體驗(yàn)問(wèn)卷調(diào)查
- 直播報(bào)名:TI 用于感測(cè)應(yīng)用、帶可配置信號(hào)鏈元素的新型MSP430™ MCU,報(bào)名直播贏雙重好禮!
- 你吐槽 我送書(shū)
- 【已結(jié)束】TE 直播|如何有效應(yīng)對(duì)當(dāng)下測(cè)試測(cè)量領(lǐng)域的挑戰(zhàn)
- 閱讀并了解是德科技 Power Supply 精彩專題,參與答題贏好禮!
- 有獎(jiǎng)直播|瑞薩電子 RA 系列產(chǎn)品開(kāi)發(fā)工具之 FSP4.0.0 新特性介紹
- 押注芯片和顯示 合肥要搞出啥大動(dòng)靜
- 中國(guó)聯(lián)通:2018年將在雄安規(guī)劃100個(gè)5G基站
- 傳感器制造競(jìng)爭(zhēng)格局分析 美日德占據(jù)主導(dǎo)
- 今年全球?qū)o(wú)法迎來(lái)5G互聯(lián)網(wǎng)技術(shù)
- OPPO研究院正式成立 專注人工智能、5G技術(shù)
- (C與匯編語(yǔ)言)ARM9之LPC2132控制LCD1602顯示字符串
- ARM之LPC2132流水燈LCD1602
- ARM匯編指令大全詳解
- S3C2440的UART通信
- ARM S2C2410A控制5個(gè)LED流水燈
- 如何管理IAR網(wǎng)絡(luò)許可證?
- 需要做網(wǎng)站的朋友快加入我們吧^^^^^^^^
- AM335x Linux下LCD屏幕的配置
- ARM與單片機(jī)的區(qū)別
- wince 的fatutil.dll 有什么用?
- “芯靈思”給大家發(fā)國(guó)慶福利了,宅的有禮~!!
- 在仿真的時(shí)候有些語(yǔ)句為什么不能設(shè)置斷點(diǎn)呢
- 哪個(gè)可以發(fā)個(gè)畢業(yè) 設(shè)計(jì)論文不???
- 富士通DIY工業(yè)控制板原理圖及PCB發(fā)布
- TI SimpleLink 好貨促銷(xiāo),曬單、評(píng)論、分享,重重好禮相送!