STM32F1xx官方資料:
《STM32中文參考手冊V10》-第9章 中斷和事件
外部中斷概述
外部中斷(EXTI),和在【STM32】NVIC中斷優先級管理(中斷向量表) 中講述的CM3內核的外部中斷不同。特指的是,在中斷向量表中的EXTI的外部中斷。STM32的每個IO都可以作為外部中斷輸入。
外部中斷線
STM32的中斷控制器支持19個外部中斷、事件請求(也就是19條外部中斷線):
線0~15:對應外部IO口的輸入中斷;
線16:連接到PVD輸出;
線17:連接到RTC鬧鐘事件;
線18:連接到USB喚醒事件。
每條外部中斷線可以獨立的配置觸發方式(上升沿、下降沿或者雙邊沿觸發)、使能/失能中斷、專用的狀態位。
但是,從上面可以看出,STM32供IO使用的中斷線只有16條,但是STM32F10x系列的IO口多達上百個,其中STM32F103ZET6有112個引腳(7組GPIO,每組16個)。那么中斷線怎么跟IO口對應呢?
從上圖可以輕易地看出來:每個GPIOx的同一編號的引腳(共7個)與一條中斷線對應。比如PA0、PB0、PC0、PD0、PE0、PF0、PG0一條中斷線。
注意一下:同一個時間,只能有一個IO口映射到同一個中斷線。也就是說,PA0和PB0不能同一時間映射到同一個中斷線,而PA0、PA1則可以同時映射,因為它們不是在同一個中斷線上。
中斷服務函數
那么是不是16個中斷線就可以分配16個中斷服務函數呢?
答案也不是。之前在【STM32】NVIC中斷優先級管理(中斷向量表) 文章中,我們介紹了中斷向量表。在中斷向量表中,IO口外部中斷在中斷向量表中只分配了7個中斷向量,也就是只能使用7個中斷服務函數。
從上圖中可以看出,外部中斷線5~9分配一個中斷向量,共用一個服務函數;外部中斷線10~15分配一個中斷向量,共用一個中斷服務函數;而中斷向量線0-4則單獨使用一個中斷服務函數。也就是說,IO口的外部中斷最多只能使用7個。
下面列舉了中斷服務函數的名稱(在啟動文件startup_stm32f10x_hd.s上):
void EXTI0_IRQHandler()
void EXTI1_IRQHandler()
void EXTI2_IRQHandler()
void EXTI3_IRQHandler()
void EXTI4_IRQHandler()
void EXTI9_5_IRQHandler()
void EXTI15_10_IRQHandler()
外部中斷相關配置寄存器
中斷屏蔽寄存器(EXTI_IMR)
作用:每一位對應著一條中斷線。清零表示屏蔽該線路上的中斷請求;置1表示打開該線路上的中斷請求。
事件屏蔽寄存器(EXTI_EMR)
作用:每一位對應著一條中斷線。清零表示屏蔽該線路上的事件請求;置1表示打開該線路上的事件請求。
上升沿觸發選擇寄存器(EXTI_RTSR)
作用:每一位對應著一條中斷線。清零表示關閉上升沿觸發中斷或事件;置1表示打開上升沿觸發中斷或事件。
下降沿觸發選擇寄存器(EXTI_FTSR)
作用:每一位對應著一條中斷線。清零表示關閉下降沿觸發中斷或事件;置1表示打開下降沿觸發中斷或事件。
軟件觸發事件寄存器(EXTI_SWIER)
作用:每一位對應著一條中斷線。當EXTIx中斷有效且SWIER=0時,向SWIER寫1將觸發中斷請求。
掛起寄存器(EXTI_PR)
作用:每一位對應著一條中斷線。如果第i個中斷觸發了,則PR位對應位自動置1;向PR位寫入1清零該位,同時清除SWIER位。
外部中斷配置相關庫函數
1個映射函數
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
作用:設置IO口與中斷線之間的映射關系。
1個初始化函數
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
作用:初始化中斷線,設置觸發方式、中斷還是事件等等。
2個標志位函數
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
作用:前者判斷中斷線中斷狀態,是否發生;后者清除中斷線上的中斷標志位。
實際上固件庫除了這兩個標志位函數之外,還提供了兩個函數來判斷外部中斷狀態和清除愛步狀態標志位的函數,分別為:
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
它們的作用和前面兩個函數的作用類似,只是在EXTI_GetITStatus()函數中,會先判斷這種中斷是否使能,使能了才去判斷中斷標志位,而EXTI_GetFlagStatus則直接判斷狀態標志位。
外部中斷一般步驟
開啟IO口時鐘,初始化IO口為輸入。調用函數:GPIO_Init();
開啟IO口復用時鐘。調用函數:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
設置IO口與中斷線的映射關系。調用函數:GPIO_EXTILineConfig();
初始化線上中斷,設置觸發條件等。調用函數:EXTI_Init();
配置中斷分組(NVIC),并使能中斷。調用函數:NVIC_Init();
編寫中斷服務函數。調用函數:EXTIx_IRQHandler();
清除中斷標志位。調用函數:EXTI_ClearITPendingBit()。
下面按照這個一般步驟來進行一個簡單的外部中斷程序:
void KEY_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置成上拉輸入
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
//初始化 WK_UP-->GPIOA.0 下拉輸入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0設置成輸入,默認下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
}
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
KEY_Init(); // 按鍵端口初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能復用功能時鐘
//GPIOE.2 中斷線以及中斷初始化配置 下降沿觸發
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line=EXTI_Line2; //KEY2
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器
//GPIOE.3 中斷線以及中斷初始化配置 下降沿觸發 //KEY1
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器
//GPIOE.4 中斷線以及中斷初始化配置 下降沿觸發 //KEY0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器
//GPIOA.0 中斷線以及中斷初始化配置 上升沿觸發 PA0 WK_UP
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按鍵WK_UP所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子優先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按鍵KEY2所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子優先級2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按鍵KEY1所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子優先級1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //使能按鍵KEY0所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子優先級0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
}
//外部中斷0服務程序
void EXTI0_IRQHandler(void)
{
delay_ms(10);//消抖
if(WK_UP==1) //WK_UP按鍵
{
BEEP=!BEEP;
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中斷標志位
}
//外部中斷2服務程序
void EXTI2_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY2==0) //按鍵KEY2
{
LED0=!LED0;
}
EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中斷標志位
}
//外部中斷3服務程序
void EXTI3_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY1==0) //按鍵KEY1
{
LED1=!LED1;
}
EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中斷標志位
}
void EXTI4_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY0==0) //按鍵KEY0
{
LED0=!LED0;
LED1=!LED1;
}
EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中斷標志位
}
EXTIX_Init函數
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE),使能復用功能時鐘,這個步驟不能省略,否則肯定會出問題。【STM32】STM32端口復用和重映射(AFIO輔助功能時鐘)
在編寫中斷處理函數的過程中,在最后一步,一定要記得清除中斷標志位。調用函數:EXTI_ClearITPendingBit()。否則下次中斷就不會發生。
上一篇:【STM32】獨立看門狗概述、寄存器、庫函數(IWDG一般步驟)
下一篇:【STM32】STM32固件庫(標準外設庫)
推薦閱讀
史海拾趣
對于恒溫箱控制器電路,網友可能會有多種問題,以下是一些常見問題及其詳細回答:
一、恒溫箱控制器電路的基本原理是什么?
回答:
恒溫箱控制器電路的基本原理是通過溫度傳感器(如熱敏電阻、熱電偶等)實時檢測恒溫箱內的溫度,并將檢測到的溫度信號轉換為電信號(如電壓或電流信號)。這個電信號隨后被送入控制器中進行處理,與預設的溫度值進行比較。如果檢測到的溫度高于或低于預設值,控制器會發出指令,通過調節加熱元件(如電熱絲、加熱管等)或制冷元件(如壓縮機、半導體制冷片等)的工作狀態,使恒溫箱內的溫度回到預設值,從而實現恒溫控制。
二、恒溫箱控制器電路常見的故障有哪些?
回答:
恒溫箱控制器電路常見的故障包括但不限于以下幾種:
- 溫度顯示異常:
- 可能原因:溫度傳感器損壞、控制器內部電路故障、顯示屏故障等。
- 解決方法:檢查并更換損壞的溫度傳感器、修復或更換控制器內部故障電路、更換顯示屏等。
- 溫度控制不準確:
- 可能原因:控制器參數設置錯誤、溫度傳感器位置不當、加熱/制冷元件故障等。
- 解決方法:重新校準控制器參數、調整溫度傳感器位置、檢查并修復加熱/制冷元件等。
- 控制器無法啟動:
- 可能原因:電源故障、控制器內部保險絲熔斷、電路板短路等。
- 解決方法:檢查電源是否正常、更換熔斷的保險絲、修復電路板短路等。
三、如何檢查恒溫箱控制器電路是否正常工作?
回答:
檢查恒溫箱控制器電路是否正常工作,可以按照以下步驟進行:
- 檢查電源:
- 確認電源插頭是否牢固插入插座,電源線是否完好無損。
- 使用萬用表測量電源電壓,確保在控制器要求的范圍內。
- 檢查溫度傳感器:
- 使用萬用表測量溫度傳感器的電阻值或電壓值,與標準值進行比較,判斷傳感器是否正常。
- 檢查傳感器與控制器之間的連接是否牢固可靠。
- 檢查控制器顯示:
- 觀察控制器顯示屏上的溫度讀數是否準確,有無異常顯示。
- 檢查加熱/制冷元件:
- 檢查加熱/制冷元件是否正常工作,可以通過觀察其工作狀態或使用萬用表測量其電流/電壓值來判斷。
- 進行功能測試:
- 設置一個預設溫度值,觀察恒溫箱是否能準確達到并保持在預設溫度。
- 如果條件允許,可以使用更精確的溫度測量設備(如高精度溫度計)對恒溫箱內的溫度進行校驗。
四、如何維護和保養恒溫箱控制器電路?
回答:
為了保持恒溫箱控制器電路的長期穩定工作,可以進行以下維護和保養工作:
- 定期清潔:
- 定期清潔恒溫箱內部和外部的灰塵和污垢,防止對控制器電路造成不良影響。
- 清潔時應斷開電源,并使用合適的清潔工具和清潔劑。
- 檢查連接:
- 定期檢查溫度傳感器、加熱/制冷元件與控制器之間的連接是否牢固可靠,如有松動應及時緊固。
- 校準參數:
- 定期對控制器進行校準,確保溫度讀數準確可靠。
- 校準時應按照控制器的使用說明書或生產廠家的建議進行操作。
- 更換老化部件:
- 對于已經老化或損壞的部件(如溫度傳感器、加熱/制冷元件等),應及時進行更換。
- 注意使用環境:
- 恒溫箱應放置在通風良好、干燥清潔的環境中,避免陽光直射和潮濕環境對控制器電路造成損害。
- 定期維護:
- 定期對恒溫箱進行全面檢查和維護,包括控制器電路、加熱/制冷系統、進出料裝置等部分。
- 維護時應按照設備的操作手冊和生產廠家提供的維護保養指導進行。
機頂盒,全稱為數字視頻變換盒,是現代家庭娛樂中不可或缺的重要設備。從廣義上講,任何與電視機連接的網絡終端設備均可視為機頂盒,其發展歷程涵蓋了從模擬頻道增補器到數字衛星、地面及有線電視機頂盒的廣泛范疇。而從狹義角度看,機頂盒特指那些具備數字處理能力的設備,如IPTV機頂盒、DVB-S衛星機頂盒、DVB-T地面機頂盒及DVB-C有線電視機頂盒等。
機頂盒的核心功能在于接收并轉換數字電視信號,使之能在傳統或智能電視上播放。它不僅能接收來自有線電纜、衛星天線及寬帶網絡的信號,還能提供電子節目指南、網頁瀏覽等增值服務。通過機頂盒,用戶能夠享受到高清乃至4K超高清的電視節目,體驗更為細膩的畫面和震撼的音效。此外,機頂盒還具備網絡交互能力,支持在線購物、觀看網絡視頻、玩游戲等多元化活動,使電視機從單向接收信息的設備轉變為智能互動終端。
隨著技術的不斷進步,機頂盒正朝著高清化、智能化方向發展。未來,機頂盒將不僅限于基本的信號接收與解碼功能,還將融入更多智能推薦、語音識別等先進技術,為用戶提供更加個性化、便捷的娛樂體驗。總之,機頂盒作為連接電視與互聯網的橋梁,正以其豐富的功能和廣泛的應用場景,不斷滿足用戶日益增長的娛樂需求。
DDC始終堅持以客戶為中心的經營理念,不斷傾聽客戶需求,為客戶提供優質的產品和服務。為了保持技術領先地位,DDC不斷投入研發,推動產品創新。同時,DDC還建立了完善的客戶服務體系,確保客戶在使用過程中能夠得到及時、有效的支持。這些舉措使得DDC在客戶中贏得了良好的口碑,為公司的發展奠定了堅實的基礎。
在追求經濟效益的同時,Elpress AB也注重可持續發展和環境保護。公司積極采用環保材料和綠色生產工藝,降低生產過程中的能耗和排放。同時,Elpress AB還積極參與環保公益活動,推動電子行業的綠色發展。這些舉措不僅體現了Elpress AB的社會責任感,也為公司的長期發展奠定了堅實的基礎。
Eurofarad公司自創立之初,就專注于電容器技術的研發。在當時,電容器市場已經相當成熟,但Eurofarad公司憑借對材料科學的深入研究,成功開發出一種新型的高性能電容器。這種電容器不僅具有更高的能量密度,而且壽命更長,穩定性更好。這一技術突破為Eurofarad公司贏得了市場的初步認可,也為公司后續的發展奠定了堅實的基礎。
隨著公司業務的不斷發展,德崧電子開始積極拓展市場。公司深入分析市場需求和行業趨勢,針對不同領域推出了具有針對性的產品和服務。例如,在汽車行業,德崧電子推出了耐高溫、耐磨損的汽車專用開關;在家電行業,公司則推出了外觀精美、功能豐富的智能開關。這些產品的推出不僅滿足了市場的多樣化需求,也為公司帶來了豐厚的回報。
我的清華紫光U盤在系統下能找到,但是打不開,不能格式化?解決方案 可以到 http://www.crsky.com/soft/4032.html 網上去下載U盤修復軟件USBboot,只要識別該U盤,應該就能修復,我的就是這樣修復好的多謝支持… 查看全部問答∨ |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 編輯 我公司是JM系列IC的一級代理商,下面是JM IC的功能型號簡介: JMicron智微科技主要產品研發方向為高速串行式連結(High Speed Serial Link)的相關技術,該技術現已廣泛應用于Serial ATA、PCI E ...… 查看全部問答∨ |
昨日與友人閑談,得知其急需一FDD接口的U盤.用于工控.遂發此貼,求助于諸位.提及FDD(即軟驅),眾皆笑曰:"淘汰久矣!"然,君不見其依然服役于眾多工控場合?隨之FPGA/RAM等先進技術之普及.待處理數據之大,昔日之1.44何以滿足?市有產品曰:仿真軟驅,價格 ...… 查看全部問答∨ |
本帖最后由 paulhyde 于 2014-9-15 08:58 編輯 概述 我們對處理速度的需求日益增長,伴隨著這種增長,用來構建單片機的晶體管尺寸則在持續減小。以更低的成本實現更高的集成度,也促進了對更小的幾何尺寸的需求。隨著尺寸的減小,晶體管擊穿電壓 ...… 查看全部問答∨ |
|
請問各位大俠,C++.net能開發硬件程序嗎,就是那種控制門口擋車桿升降的程序。 如果不能,那可以用VisualC++開發嗎? 多種語言開發的程序可不可以組成一個軟件上那? 謝謝各位。… 查看全部問答∨ |
偶然在網上看到了AMD的一個“我為三核狂”活動,整個活動的主旨都是圍繞“三核”的概念來的,網友的熱情和創意也是讓人嘆為觀止,大家下面這些有趣的作品吧。簡直是神了!大家也來欣賞一下哦 &n ...… 查看全部問答∨ |
有誰知道PROTEUS的第三方元件庫怎么添加啊,我用的是7.5sp3的版本,我把.lib文件加到元件庫里面但是還是以前那些元件,這是怎么回事啊?請大家幫幫忙!!!謝謝… 查看全部問答∨ |