娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

 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]分配情況分配結果
01110: 40 位搶占優先級, 4 位響應優先級
11101: 31 位搶占優先級, 3 位響應優先級
21012: 22 位搶占優先級, 2 位響應優先級
31003: 13 位搶占優先級, 1 位響應優先級
40114: 04 位搶占優先級, 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<//使能中斷位(要清除的話,相反操作就 OK)
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<AFIO->EXTICR[EXTADDR]|=GPIOx<//自動設置
EXTI->IMR|=1<if(TRIM&0x01)EXTI->FTSR|=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)設置觸發方式。


關鍵字:STM32  外部中斷輸入 引用地址:STM32 I/O 作為外部中斷輸入

上一篇:用STM32F103RCT6的普通IO口模擬串口的實驗
下一篇:STM32 特殊功能腳設置為普通腳的方法

推薦閱讀

1、跑馬燈 IO口的設置 推挽輸出 GPIO_Mode_Out_PP 輸出高、低電平,連接數字器件(管腳負載能力強、開關速度快) led.c怎么寫?#include"led.h"void LED_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); ...
只有通過智能的自動化系統才能實現更高的生產效率,更長的機床運行時間和更多品種部件的生產。恒輪(Heller)已經找到了解決方案。 批量制造?不在恒輪! 作為恒輪的生產經理,Dr.-Ing. Peter Herrmann很清楚,即使是像恒輪這樣的公司,為了實現這些目標,也必須要打破傳統,放棄久經考驗的組裝和生產的模式。 “我們不是批量制造商——我們生產定制化...
這幾天在鼓搗stm32的rtc,先焊了一個板子(從stm家園,www.stmsky.com 弄了幾塊stmsky001pcb板),試了一下rtc顯示時間的程序,ok,興奮呀!第二天便有網友在移植rtt系統說板子上的rtc不能起振,感覺很奇怪,一樣的板子怎么可能會出現這種情況,趕忙我又試了一下我的板子,奇怪的是,昨天還好好的,今天也是不行了。不能起振了。找原因吧。于是沒有多想,...
前面程序運行,發現從Nand Flash啟動和從Nor Flash啟動表現是不一樣的。設置成Nand Flash啟動沒有問題 顯示ABCDE…設置成NOor Flash啟動則顯示AAA…這是什么原因呢?Nor啟動Nor Flash就被認為是0地址,g_Char被放在0x700后面。CPU上電后從0地址開始執行,它能讀取Nor Flash上的代碼,打印出A,當進行g_Char++的時候,寫操作操作無效,下次讀取的數...

史海拾趣

問答坊 | AI 解惑

如何合理選用傳感器

         如何合理選用傳感器     現代傳感器在原理與結構上千差萬別,如何根據具體的測量目的、測量對象以及測量環境合理地選用傳感器,是在進行某個量的測量時首先要解決的問題。當傳感器確定之 ...…

查看全部問答∨

模擬傳感器系統的抗干擾措施

一、前言      模擬傳感器的應用非常廣泛,不論是在工業、農業、國防建設,還是在日常生活、教育事業以及科學研究等領域,處處可見模擬傳感器的身影。但在模擬傳感器的設計和使用中,都有一個如何使其測量精度達到最高的問題。而眾多的 ...…

查看全部問答∨

玻璃水杯,電子表的包裝盒,汽車空氣凈化器做led燈

創意無限,只要你肯去做,水杯穿洞有點難度,需要家里電動工具齊全點就可以做,這個因該是最好看得一個,剩下的就比較簡單,電子表的包裝盒做大功率led外殼,散熱真不錯呢,至于汽車空氣凈化器不知大家見過沒,像一個滾筒的芯,里面是紙地,外面是 ...…

查看全部問答∨

Altium Designer Summer 08 集成庫 pcb封裝 sch封裝

這是Altium Designer Summer 08 集成庫 是三年用這個軟件自己做的所有封裝,里面基本上涵蓋了所有的常用元件,單片機封裝,很實用。對于單片機學習者相當的有幫助! [ 本帖最后由 water1987 于 2010-1-11 10:40 編輯 ]…

查看全部問答∨

想做GPRS數據采集,發送,應該選用什么GPRS產品?

現在想做一個加油站的加油數據采集和無線傳輸,數據采集和數據傳輸功能需要哪些設備?特別是無線數據傳輸這塊,預計采用GPRS網絡進行傳輸,不知道完成這個傳輸功能應該采用什么設備? 1.是基于GPRS網卡的二次開發? 2.直接使用GPRS DTU,這個價格 ...…

查看全部問答∨

關于51單片機的地址

我在課件上看到,STC89C52RC單片機的地址,只有80H-FFH這段地址能用程序來控制, 這就是在REG52.H頭文件中被定義了,至于00H-7EH這段是被稱為\"直接或間接尋址寄存器\", 一共分為四個區的,請問這四個區, 既然不能被程序控制,那么它是用在存放什么數據的 ...…

查看全部問答∨

內存電路接口問題(你們注意了嗎?)

昨天看了一下電路圖,發現內存(SDRAM)和2440接口有點不可思議(后來發現ATmel的ARM也是這么接的),后來仔細對比。 發現問題在LDQM,UDQM這兩個引腳,他們接到2440的四個nWBE引腳。內存資料是這么說的:Data Input/Output Mask Controls output ...…

查看全部問答∨

base在北京的基站軟件研發的朋友,請來看!

公司現在高薪誠聘bss基站高級軟件開發工程師(精通C++,兩年以上C++研發經驗,英語流利)! 工作地點:北京望京(愛立信總部) 可直接向我資訊                      &nbs ...…

查看全部問答∨

尋STM32FUSB接口電路

                                 壇子里哪位大仙兒用過STM32F通過USB接口連接計算機USB的成熟的電路圖給俺一份借鑒下,或者萬利的電路圖也行,等待 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 龙泉市| 巴南区| 铁力市| 裕民县| 永修县| 米易县| 鄂尔多斯市| 易门县| 额尔古纳市| 陇川县| 白河县| 台中市| 河曲县| 齐齐哈尔市| 通州市| 延寿县| 南通市| 铁岭县| 岢岚县| 平凉市| 米泉市| 太保市| 碌曲县| 加查县| 九龙坡区| 新乡市| 蕉岭县| 宾阳县| 遂平县| 五指山市| 临颍县| 兴国县| 苏州市| 教育| 策勒县| 泸州市| 石狮市| 固阳县| 加查县| 松溪县| 礼泉县|