I/O口作為外部中斷。general purpose input and output
STM32 的每個 IO口都可以作為中斷輸入,要把 IO口作為外部中斷輸入,
有以下幾個步驟:
1) 初始化 IO 口為輸入。
這一步設置你要作為外部中斷輸入的 IO 口的狀態,可以設置為上拉/下拉輸入,也可以設
置為浮空輸入,但浮空的時候外部一定要帶上拉,或者下拉電阻。否則可能導致中斷不停的觸
發。在干擾較大的地方,就算使用了上拉/下拉,也建議使用外部上拉/下拉電阻,這樣可以一
定程度防止外部干擾帶來的影響。
2) 開啟 IO 口復用時鐘,設置 IO 口與中斷線的映射關系。
STM32 的 IO 口與中斷線的對應關系需要配置外部中斷配置寄存器 EXTICR,這樣我們要
先開啟復用時鐘,然后配置 IO 口與中斷線的對應關系。才能把外部中斷與中斷線連接起來。
3) 開啟與該 IO 口相對的線上中斷/事件,設置觸發條件。
這一步,我們要配置中斷產生的條件, STM32 可以配置成上升沿觸發,下降沿觸發,或者
任意電平變化觸發,但是不能配置成高電平觸發和低電平觸發。這里根據自己的實際情況來配
置,同時要開啟中斷線上的中斷。這里需要注意的是:如果使用外部中斷,并設置該中斷的 EMR
位的話,會引起軟件仿真不能跳到中斷,而硬件上是可以的。而不設置 EMR,軟件仿真就可以
進入中斷服務函數,并且硬件上也是可以的。建議不要配置 EMR 位。
4) 配置中斷分組(NVIC),并使能中斷。
這一步,我們就是配置中斷的分組,以及使能,對 STM32 的中斷來說,只有配置了 NVIC
的設置,并開啟才能被執行,否則是不會執行到中斷服務函數里面去的。關于 NVIC 的詳細介
紹,請參考 5.2.6 節。
5) 編寫中斷服務函數。
這是中斷設置的最后一步,中斷服務函數,是必不可少的,如果在代碼里面開啟了中斷,
但是沒編寫中斷服務函數,就可能引起硬件錯誤,從而導致程序崩潰!所以在開啟了某個中斷
后,一定要記得為該中斷編寫服務函數。在中斷服務函數里面編寫你要執行的中斷后的操作。
與 NVIC 相關的寄存器, MDK 為其定義了如下的結構體:
typedef struct
{
__IO uint32_t ISER[8]; //中斷使能寄存器組 Interrupt Set-Enable Registers
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; //中斷除能寄存器組
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; //中斷掛起控制寄存器組
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; //中斷解掛控制寄存器組
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; //中斷激活標志位寄存器組
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; //中斷優先級控制寄存器組
uint32_t RESERVED5[644];
__O uint32_t STIR; //軟件觸發中斷寄存器組
} NVIC_Type;
ISER[8]: ISER 全稱是: Interrupt Set-Enable Registers, 每1 bit 代表一個中斷,總共有32×8=256個中斷,你要使能某個中斷,必須設置相應的 ISER 位為 1,使該中斷被使能(這里僅僅是使能,還要配合中斷分組、屏蔽、 IO 口映射等設置才算是一個完整的中斷設置)。
ICER[8]:全稱是: Interrupt Clear-Enable Registers, 該寄存器組與 ISER[8] 的作用恰好相反,是用來清除某個中斷的使能的。 如果想清除一個中斷,不是在對應bit寫0,而應該在對應位置寫1。寫0是無效的。
ISPR[8]:全稱是: Interrupt Set-Pending Registers ,每個位對應的中斷和 ISER 是一樣的。通過置 1,可以將正在進行的中斷掛起,而執行同級或更高級別的中斷。寫 0 是無效的。
ICPR[8]:全稱是: Interrupt Clear-Pending Registers ,通過設置 1,可以將掛起的中斷取消掛起操作。寫 0 無效。
IABR[8]:全稱是: Interrupt Active Bit Registers,是一個中斷激活標志位寄存器組。對應位所代表的中斷和 ISER 一樣,如果為 1,則表示該位所對應的中斷正在被執行。這是一個只讀寄存器,通過它可以知道當前在執行的中斷是哪一個。在中斷執行完了由硬件自動清零。
IP[240]:全稱是: Interrupt Priority Registers, 是一個中斷優先級控制的寄存器組。這個寄存器組相當重要! STM32 的中斷分組與這個寄存器組密切相關。 IP 寄存器組由 240 個 8bit 的寄存器組成,每個可屏蔽中斷占用 8bit,這樣總共可以表示 240 個可屏蔽中斷。 而 STM32 只用到了其中的 68 個。 IP[67]~IP[0]分別對應中斷 67~0。 而每個可屏蔽中斷占用的 8bit 并沒有全部使用,而是 只用了高 4 位。這 4 位,又分為搶占優先級和子優先級。搶占優先級在前,子優先級在后。而這兩個優先級各占幾個位又要根據 SCB->AIRCR 中的中斷分組設置來決定。搶占優先級的級別高于響應優先級。而數值越小所代表的優先級就越高。
STM32 的 5 個分組是通過設置 SCB->AIRCR 的 BIT[10:8]來實現的,而 SCB->AIRCR 的修改需要通過在高 16 位寫入 0X05FA 這個密鑰才能修改的,故在設置 AIRCR 之前,應該把密鑰加入到要寫入的內容的高 16 位,以保證能正常的寫入 AIRCR。在修改 AIRCR 的時候,我們一般采用讀->改->寫的步驟,來實現不改變 AIRCR 原來的其他設置。
這里簡單介紹一下 STM32 的中斷分組: STM32 將中斷分為 5 個組,組 0~4。該分組的設
置是由 SCB->AIRCR 寄存器的 bit10~8 來定義的。具體的分配關系如表 5.2.6.1 所示:
組 | AIRCR[10: 8] | bit[7: 4]分配情況 | 分配結果 |
0 | 111 | 0: 4 | 0 位搶占優先級, 4 位響應優先級 |
1 | 110 | 1: 3 | 1 位搶占優先級, 3 位響應優先級 |
2 | 101 | 2: 2 | 2 位搶占優先級, 2 位響應優先級 |
3 | 100 | 3: 1 | 3 位搶占優先級, 1 位響應優先級 |
4 | 011 | 4: 0 | 4 位搶占優先級, 0 位響應優先級 |
表 5.2.6.1 AIRCR 中斷分組設置表
//設置 NVIC
//NVIC_PreemptionPriority: 搶占優先級
//NVIC_SubPriority : 響應優先級
//NVIC_Channel : 中斷編號
//NVIC_Group : 中斷分組 0~4
//注意優先級不能超過設定的組的范圍!否則會有意想不到的錯誤
//組劃分:
//組 0: 0 位搶占優先級, 4 位響應優先級
//組 1: 1 位搶占優先級, 3 位響應優先級
//組 2: 2 位搶占優先級, 2 位響應優先級
//組 3: 3 位搶占優先級, 1 位響應優先級
//組 4: 4 位搶占優先級, 0 位響應優先級
//NVIC_SubPriority 和 NVIC_PreemptionPriority 的原則是, 數值越小, 越優先
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
{
u32 temp;
MY_NVIC_PriorityGroupConfig(NVIC_Group);//設置分組
temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf; //取低四位
NVIC->ISER[NVIC_Channel/32]|=(1<
NVIC->IP[NVIC_Channel]|=temp<<4; //設置響應優先級和搶斷優先級
}
NVIC配置總結:
1) SCB->AIRCR 決定搶占優先級的位數,設置怎么解釋IP(interrupt priority)分組。其實這個分組的設置在每個系統里面只要設置一次就夠了,設置多次,則是以最后的那一次為準。整個系統的優先級分組格式都一樣。
2) ISER 使能對應的中斷管腳,
3)設置優先級。
IP[channel] 決定具體的搶占優先級和子優先級。
IP和SCB->AIRCR 一起決定中斷的優先級。
IABR 自讀,顯示當前正在執行的中斷時那個管腳的中斷。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
以上是對NVIC的管理和配置,下面說明一下外不中斷的配置。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
STM32F103 的 EXTI 控制器支持 19 個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都有獨立的觸發和屏蔽設置。 STM32F103 的 19 個外部中斷為:
線 0~15:對應外部 IO 口的輸入中斷。
線 16:連接到 PVD 輸出。
線 17:連接到 RTC 鬧鐘事件。
線 18:連接到 USB 喚醒事件。
對于外部中斷 EXTI 控制 MDK 定義了如下結構體:
typedef struct
{
__IO uint32_t IMR; //interrupt mask register
__IO uint32_t EMR; //event mask register
__IO uint32_t RTSR; //rising trigger selection register
__IO uint32_t FTSR; //falling trigger selection register
__IO uint32_t SWIER; //software interrupt event register
__IO uint32_t PR; //pending register
} EXTI_TypeDef;
IMR:中斷屏蔽寄存器。這是一個 32 寄存器。但是只有前 19 位有效(19個外部中斷)。當位 x 設置為 1 時,則開啟這個線上的中斷,否則關閉該線上的中斷。
EMR:事件屏蔽寄存器,同 IMR,只是該寄存器是針對事件的屏蔽和開啟。
RTSR:上升沿觸發選擇寄存器。該寄存器同 IMR,也是一個 32 為的寄存器,只有前 19位有效。位 x 對應線 x 上的上升沿觸發,如果設置為 1,則是允許上升沿觸發中斷/事件。否則,不允許。
FTSR:下降沿觸發選擇寄存器。同 RTSR,不過這個寄存器是設置下降沿的。下降沿和上升沿可以被同時設置,這樣就變成了任意電平觸發了。
SWIER:軟件中斷事件寄存器。通過向該寄存器的位 x 寫入 1,在未設置 IMR 和 EMR 的時候,將設置 PR 中相應位掛起。如果設置了 IMR 和 EMR 時將產生一次中斷。被設置的 SWIER位,將會在 PR 中的對應位清除后清除。
PR:掛起寄存器。當外部中斷線上發生了選擇的邊沿事件,該寄存器的對應位會被置為 1。0:表示對應線上沒有發生觸發請求。通過向該寄存器的對應位寫入 1 可以清除該位。在中斷服務函數里面經常會要向該寄存器的對應位寫 1 來清除中斷請求 。
通過以上配置就可以正常設置外部中斷了,但是外部 IO 口的中斷,還需要一個寄存器配置,也就是 IO 復用里的外部中斷配置寄存器 EXTICR。這是因為 STM32 任何一個 IO 口都可以配置成中斷輸入口,但是 IO 口的數目遠大于中斷線數(16 個)。于是 STM32 就這樣設計,GPIOA~GPIOG 的[15:0]分別對應中斷線 15~0。
這樣每個中斷線對應了最多 7 個 IO 口,以中斷線 0為例:它對應了 GPIOA.0、 GPIOB.0、 GPIOC.0、 GPIOD.0、 GPIOE.0、 GPIOF.0、 GPIOG.0。而中斷線每次只能連接到 1個 IO口上,這樣就需要 EXTICR來決定對應的中斷線配置到哪個 GPIO上了。
EXTICR 在 AFIO 的結構體中定義,如下:
typedef struct
{
__IO uint32_t EVCR;
__IO uint32_t MAPR;
__IO uint32_t EXTICR[4];
} AFIO_TypeDef;
-------
EXTICR1
EXTICR2 對應EXTI4,EXTI5,EXTI6,EXTI7。
EXTICR3 對應EXTI8,EXTI9,EXTI10,EXTI11。
EXTICR4 對應EXTI12,EXTI13,EXTI14,EXTI15。
映射GPIOX_K 管腳。
例如,EXTI11,配置外部中斷管腳11,通過對EXTIX[3:0]的設置分別設置為GPIOA ~ GPIOG 。
//外部中斷配置函數
//只針對 GPIOA~G;不包括 PVD, RTC 和 USB 喚醒這三個
//參數: GPIOx: 0~6, 代表 GPIOA~G;
//BITx: 需要使能的位;
//TRIM: 觸發模式, 1, 下升沿; 2, 上降沿;3,任意電平觸發
//該函數一次只能配置 1 個 IO 口, 多個 IO 口, 需多次調用
//該函數會自動開啟對應中斷, 以及屏蔽線
void Ex_NVIC_Config(u8 GPIOx, u8 BITx, u8 TRIM)
{
u8 EXTADDR;
u8 EXTOFFSET;
EXTADDR=BITx/4; //得到中斷寄存器組的編號
EXTOFFSET=(BITx%4)*4;//得到中斷寄存器組內的偏移
RCC->APB2ENR|=0x01; //enable AFIO clock
AFIO->EXTICR[EXTADDR]&=~(0x000F<
EXTI->IMR|=1<
if(TRIM&0x02)EXTI->RTSR|=1<
Ex_NVIC_Config 完全是按照我們之前的分析來編寫的,首先根據 GPIOx 的位得到中斷寄存器組的編號,即 EXTICR 的編號,在 EXTICR 里面配置中斷線應該配置到 GPIOx 的哪個位。然后使能該位的中斷及事件,最后配置觸發方式。這樣就完成了外部中斷的配置了。
NVIC配置總結:
1) SCB->AIRCR 決定搶占優先級的位數,設置怎么解釋IP(interrupt priority)分組。其實這個分組的設置在每個系統里面只要設置一次就夠了,設置多次,則是以最后的那一次為準。整個系統的優先級分組格式都一樣。
2) ISER 使能對應的中斷bit,
3)設置優先級。
IP[channel] 決定具體的搶占優先級和子優先級。
IP和SCB->AIRCR 一起決定中斷的優先級。
IABR 自讀,顯示當前正在執行的中斷時那個管腳的中斷。
外部中斷配置總結:
1) EXTI.BITx 映射到 GPIOx.BITx,通過AFIO_EXTICRn。
2)開啟外部中斷線。
3)設置觸發方式。
上一篇:用STM32F103RCT6的普通IO口模擬串口的實驗
下一篇:STM32 特殊功能腳設置為普通腳的方法
推薦閱讀
史海拾趣
隨著無線通信技術的快速發展,明波通信緊跟時代步伐,不斷投入研發力量,在無線/移動通信領域取得了重大技術突破。公司成功開發出了一系列大規模集成電路(IP/ASIC)及相關控制軟件,不僅提高了通信效率和質量,也贏得了國內外客戶的廣泛認可。這一時期的明波通信,已經成為國內通信行業的佼佼者。
隨著國內市場的日益飽和,明波通信開始將目光投向全球市場。公司先后在日本東京和江蘇常州設立了子公司,通過技術合作和市場拓展,進一步鞏固了公司在全球通信領域的地位。同時,明波通信也積極參與國際技術交流和合作,不斷提升自身的技術水平和創新能力。這一系列的國際化戰略舉措,為明波通信的未來發展奠定了堅實的基礎。
以上五個故事都是基于明波通信在電子行業中的發展歷程和公開資料進行的概括性描述。雖然無法涵蓋所有細節和具體事件,但希望能夠展現出明波通信在創業、技術創新、市場拓展和國際化等方面的努力和成就。
DCCOM公司自創立之初,就注重技術創新和研發投入。在成立初期,公司研發團隊成功開發出一種具有高性能和低功耗特點的電子元件,這一創新技術迅速贏得了市場的認可。隨著技術的不斷迭代和升級,DCCOM逐漸在電子元件市場上占據了一席之地。
靜芯微電子在發展過程中,持續投入研發資源,不斷推動技術創新。公司成功研發出芯片級TVS器件,并在國內首次開發成功在人體模型(HBM)下抗靜電強度高于30KV的關鍵技術和器件。這一技術突破不僅提升了產品的性能,還進一步鞏固了靜芯微電子在ESD/TVS領域的領先地位。同時,公司還積極申請和積累專利,目前已擁有多項發明專利、實用新型專利和集成電路布圖登記等知識產權成果。
在電子行業的激烈競爭中,Elpac公司憑借其在電源管理領域的技術革新,逐漸嶄露頭角。公司創始人李明在創辦之初就堅信,只有不斷創新才能在市場中立足。他帶領團隊深入研究市場需求,不斷推出具有創新性的電源管理產品。其中,一款高效節能的電源轉換器在市場上引起了廣泛關注,其出色的性能和穩定性贏得了客戶的青睞。隨著產品的熱銷,Elpac公司逐漸在電子行業中建立了自己的品牌地位。
在1968年,電子行業正迎來一場技術革新。在這個充滿機遇的時代,CML Microcircuits公司應運而生。初創時期的CML專注于研發單芯片解決方案,而不是傳統的標準組件組合。這一創新理念使CML在行業中脫穎而出。公司的第一個產品——頻率敏感開關,憑借其卓越的性能和可靠性,迅速贏得了市場的認可。這款產品不僅銷售了30多年,而且至今仍在某些應用中發揮著關鍵作用。
一、前言 模擬傳感器的應用非常廣泛,不論是在工業、農業、國防建設,還是在日常生活、教育事業以及科學研究等領域,處處可見模擬傳感器的身影。但在模擬傳感器的設計和使用中,都有一個如何使其測量精度達到最高的問題。而眾多的 ...… 查看全部問答∨ |
|
創意無限,只要你肯去做,水杯穿洞有點難度,需要家里電動工具齊全點就可以做,這個因該是最好看得一個,剩下的就比較簡單,電子表的包裝盒做大功率led外殼,散熱真不錯呢,至于汽車空氣凈化器不知大家見過沒,像一個滾筒的芯,里面是紙地,外面是 ...… 查看全部問答∨ |
Altium Designer Summer 08 集成庫 pcb封裝 sch封裝 這是Altium Designer Summer 08 集成庫 是三年用這個軟件自己做的所有封裝,里面基本上涵蓋了所有的常用元件,單片機封裝,很實用。對于單片機學習者相當的有幫助! [ 本帖最后由 water1987 于 2010-1-11 10:40 編輯 ]… 查看全部問答∨ |
現在想做一個加油站的加油數據采集和無線傳輸,數據采集和數據傳輸功能需要哪些設備?特別是無線數據傳輸這塊,預計采用GPRS網絡進行傳輸,不知道完成這個傳輸功能應該采用什么設備? 1.是基于GPRS網卡的二次開發? 2.直接使用GPRS DTU,這個價格 ...… 查看全部問答∨ |
我在課件上看到,STC89C52RC單片機的地址,只有80H-FFH這段地址能用程序來控制, 這就是在REG52.H頭文件中被定義了,至于00H-7EH這段是被稱為\"直接或間接尋址寄存器\", 一共分為四個區的,請問這四個區, 既然不能被程序控制,那么它是用在存放什么數據的 ...… 查看全部問答∨ |
昨天看了一下電路圖,發現內存(SDRAM)和2440接口有點不可思議(后來發現ATmel的ARM也是這么接的),后來仔細對比。 發現問題在LDQM,UDQM這兩個引腳,他們接到2440的四個nWBE引腳。內存資料是這么說的:Data Input/Output Mask Controls output ...… 查看全部問答∨ |
公司現在高薪誠聘bss基站高級軟件開發工程師(精通C++,兩年以上C++研發經驗,英語流利)! 工作地點:北京望京(愛立信總部) 可直接向我資訊 &nbs ...… 查看全部問答∨ |
STM32驅動彩屏液晶的問題,8位還是16位?。。。?/a> 求教一個問題,我在寫彩屏液晶的程序的時候,有16為驅動的程序有8位驅動的程序。有時候都能用,但有時候會就不能用,求分析哈。 TFT彩屏IC:9320 or 9325 接口聲明: #define DATAOUT(x) GPIOB->ODR=x; //數據輸出 #define DATAOUTH(x) GPIOB-> ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 芯原超低能耗NPU可為移動端大語言模型推理提供超40 TOPS算力
- 芯原AI-ISP芯片定制方案助力客戶智能手機量產出貨
- AI加持,安森美一站式服務推動助聽器市場持續進步
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- 如何為您的應用選擇光傳感器
- Samtec新型農業漫談系列二 | 垂直農業案列分享
- Samtec應用科普 | C-V2X技術在汽車領域的應用
- 尼得科運動&能源事業本部在印度卡納塔克邦胡布利舉行新工廠竣工儀式
- 貿澤開售Qorvo適用于5G和mMIMO應用的新型QPA9822線性5G高增益/高驅動放大器
- 邊緣計算網關工業物聯網應用:空壓機遠程運維監控管理