<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM學習筆記--STM32F10X中斷

          STM學習筆記--STM32F10X中斷

          作者: 時間:2016-09-16 來源:網(wǎng)絡 收藏

            CM3支持256個,16個內(nèi)核+240個外部,并具有256級可編程中斷

          本文引用地址:http://www.ex-cimer.com/article/201609/297022.htm

            STM32支持76個中斷,16個內(nèi)核中斷+60個外部中斷,16個可編程優(yōu)先級

            16個內(nèi)核中斷:每個中斷占用地址為0X0000_0004

            

           

            60個可屏蔽中斷:其中0,1,2,3,4表示中斷編號IRQ Channels在STM32F10x_lib.h程序中體現(xiàn)

            

           

            

           

            

           

            16個中斷優(yōu)先級

            先看看嵌套中斷向量控制器的定義_map.h

            /*------------------------ Nested Vectored Interrupt Controller --------------*/

            typedef struct

            {

            vu32 ISER[2]; //Interrupt set-enable registers 2個32BITS

            u32 RESERVED0[30];

            vu32 ICER[2]; //Interrupt clear-enable registers

            u32 RSERVED1[30];

            vu32 ISPR[2]; //Interrupt set-pending registers

            u32 RESERVED2[30];

            vu32 ICPR[2]; //Interrupt clear-pending registers

            u32 RESERVED3[30];

            vu32 IABR[2]; //Interrupt active bit registers 只讀寄存器

            u32 RESERVED4[62];

            vu32 IPR[15]; //Interrupt priority registers

            } NVIC_TypeDef;

            其中vu32 IPR[15],表示Interrupt Priority Registers中斷優(yōu)先級寄存器

            表示15個32bit寄存器,每個屏蔽中斷占用8位,只用到高4位,低4位沒用到。

            每個屏蔽寄存器擁有的中斷編號為4個,即32bit/8bit=4

            IPR[0]—[31-24] [23-16] [15-8] [7-4] 對應中斷3,2,1,0

            IPR[1]—[31-24] [23-16] [15-8] [7-4] 對應中斷7,6,5,4

            IPR[2]—[31-24] [23-16] [15-8] [7-4] 對應中斷11,10,9,8

            IPR[3]—[31-24] [23-16] [15-8] [7-4] 對應中斷15,14,13,12

            IPR[4]—[31-24] [23-16] [15-8] [7-4] 對應中斷19,18,17,16

            IPR[5]—[31-24] [23-16] [15-8] [7-4] 對應中斷23,22,21,20

            IPR[6]—[31-24] [23-16] [15-8] [7-4] 對應中斷27,26,25,24

            IPR[7]—[31-24] [23-16] [15-8] [7-4] 對應中斷31,30,29,28

            IPR[8]—[31-24] [23-16] [15-8] [7-4] 對應中斷35,34,33,32

            IPR[9]—[31-24] [23-16] [15-8] [7-4] 對應中斷39,38,37,36

            IPR[10]—[31-24] [23-16] [15-8] [7-4] 對應中斷43,42,41,40

            IPR[11]—[31-24] [23-16] [15-8] [7-4] 對應中斷47,46,45,44

            IPR[12]—[31-24] [23-16] [15-8] [7-4] 對應中斷51,50,49,48

            IPR[13]—[31-24] [23-16] [15-8] [7-4] 對應中斷55,54,53,52

            IPR[14]—[31-24] [23-16] [15-8] [7-4] 對應中斷59,58,57,56

            IPR[15]—[31-24] [23-16] [15-8] [7-4] 未使用

            STM32將中斷分為5組,組數(shù)為0-5。由控制器SCB->AIRCR【10:8】寄存器控制

            

           

            例如如果AIRCR為100,則60個中斷(15個中斷優(yōu)先級寄存器)的每個中斷的高3位為搶占優(yōu)先級,低1位為響應優(yōu)先級。那么搶占優(yōu)先級可以設置7個,由000~111,而響應優(yōu)先級只能為0或者1。數(shù)值越小,表示優(yōu)先級越高,同時搶占優(yōu)先級高于響應優(yōu)先級。如果搶占優(yōu)先級與響應優(yōu)先級一致,則看哪個中斷先發(fā)生,哪個先執(zhí)行;高優(yōu)先級的搶占優(yōu)先級可以打斷正在進行的低搶占優(yōu)先級的,高響應優(yōu)先級的不能打斷低響應優(yōu)先級的中斷。

            AIRCR—應用程序中斷及復位控制寄存器,它是屬于SCB中的一個。

            //System control space memory map

            typedef struct

            {

            vuc32 CPUID;

            vu32 ICSR;

            vu32 VTOR;

            vu32 AIRCR;

            vu32 SCR;

            vu32 CCR;

            vu32 SHPR[3];

            vu32 SHCSR;

            vu32 CFSR;

            vu32 HFSR;

            vu32 DFSR;

            vu32 MMFAR;

            vu32 BFAR;

            vu32 AFSR;

            } SCB_TypeDef;

            

           

            如需修改SCB->AIRCR寄存器的值,首先得寫入訪問鑰匙0X05FA,遵循讀—改—寫的操作步驟。

            下面是設置NVIC分組函數(shù):

            //設置NVIC分組

            //NVIC_Group:NVIC分組 0~4 總共5組

            void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)

            {

            u32 temp,temp1;

            temp1=(~NVIC_Group)&0x07;//取后三位

            temp1<<=8;

            temp=SCB->AIRCR; //讀取先前的設置

            temp&=0X0000F8FF; //清空先前分組

            temp|=0X05FA0000; //寫入鑰匙

            temp|=temp1;

            SCB->AIRCR=temp; //設置分組

            }

            當NVIC_Group=0;~NVIC_Group=0X1111 1111&0X0000 0111 ,得temp1=0X0000 0111即第0組 ,0位搶占優(yōu)先級,4位相應優(yōu)先級

            當NVIC_Group=1;~NVIC_Group=0X1111 1110&0X0000 0111 ,得temp1=0X0000 0110即第1組,1位搶占優(yōu)先級,3位相應優(yōu)先級

            當NVIC_Group=2;~NVIC_Group=0X1111 1101&0X0000 0111 ,得temp1=0X0000 0101即第2組,2位搶占優(yōu)先級,2位相應優(yōu)先級

            當NVIC_Group=3;~NVIC_Group=0X1111 1100&0X0000 0111 ,得temp1=0X0000 0100即第3組,3位搶占優(yōu)先級,1位相應優(yōu)先級

            當NVIC_Group=4;~NVIC_Group=0X1111 1011&0X0000 0111 ,得temp1=0X0000 0011即第4組,4位搶占優(yōu)先級,0位相應優(yōu)先級

            temp1<<=8;從第8位開始

            接著讀改寫。先清空先前分組,temp&=0X0000F8FF; //清空先前分組,高16位為0,低16位BIT11-8,為1000。再寫入鑰匙,0X05FA0000,再寫入分組temp1,最后將temp1寫入SCB->AIRCR寄存器。

            NVIC配置理解

            NVIC初始化函數(shù)

            //設置NVIC

            //NVIC_PreemptionPriority:搶占優(yōu)先級

            //NVIC_SubPriority :響應優(yōu)先級

            //NVIC_Channel :中斷編號

            //NVIC_Group :中斷分組 0~4

            //注意優(yōu)先級不能超過設定的組的范圍!否則會有意想不到的錯誤

            //組劃分:

            //組0:0位搶占優(yōu)先級,4位響應優(yōu)先級

            //組1:1位搶占優(yōu)先級,3位響應優(yōu)先級

            //組2:2位搶占優(yōu)先級,2位響應優(yōu)先級

            //組3:3位搶占優(yōu)先級,1位響應優(yōu)先級

            //組4:4位搶占優(yōu)先級,0位響應優(yōu)先級

            //NVIC_SubPriority和NVIC_PreemptionPriority的原則是,數(shù)值越小,越優(yōu)先

            void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)

            {

            u32 temp;

            u8 IPRADDR=NVIC_Channel/4; //每組只能存4個,得到組地址

            u8 IPROFFSET=NVIC_Channel%4;//在組內(nèi)的偏移

            IPROFFSET=IPROFFSET*8+4; //得到偏移的確切位置

            MY_NVIC_PriorityGroupConfig(NVIC_Group);//設置分組

            temp=NVIC_PreemptionPriority<<(4-NVIC_Group);

            temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);

            temp&=0xf;//取低四位

            if(NVIC_Channel<32)

            {

            NVIC->ISER[0]|=1<

            }

            else

            {

            NVIC->ISER[1]|=1<<(NVIC_Channel-32);

            }

            NVIC->IPR[IPRADDR]|=temp<

            }

            (1)

            u8 IPRADDR=NVIC_Channel/4; //每組只能存4個,得到組地址

            u8 IPROFFSET=NVIC_Channel%4; //在組內(nèi)的偏移

            IPROFFSET=IPROFFSET*8+4; //得到偏移的確切位置

            對于窗口 WWDG_IPQChanel 的中斷編號為0X00,那么

            IPRADDR=0X00/4=0; //得到第0組,IPR[0]

            IPROFFSET=0X00%4=0; //在組內(nèi)的偏移為0

            IPROFFSET=0X00*8+4=4; //*8的意思是一個字節(jié),就是跳過一個中斷;+4的意思是,低4位無效

            在IPR[IPRADDR]的中斷組中,左移IPROFFSET的位置開始設置中斷分組,temp為設置好的搶占優(yōu)先級及響應優(yōu)先級。

            NVIC->IPR[IPRADDR]|=temp<

            (2)

            u32 temp;

            temp=NVIC_PreemptionPriority<<(4-NVIC_Group); //搶占優(yōu)先級設置

            temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); //相應優(yōu)先級設置

            temp&=0xf;//取低四位

            例:NVIC_Group分組為1,則為1位搶占優(yōu)先級,3位響應優(yōu)先級

            則NVIC_PreemptionPriority<<4-1

            temp|=NVIC_SubPriority&(0x0000 1111>>1)=(0000 0BBB)

            temp = (?AAA A000)|(0000 0BBB)

            = (?AAAABBB)

            那么AAAA只能是從0000-0001,BBB能從000-111剛好對應起來。

            temp&=0X0F,因為只是bit[7:4]有效。

            (3)

            if(NVIC_Channel<32)

            {

            NVIC->ISER[0]|=1<

            }

            else

            {

            NVIC->ISER[1]|=1<<(NVIC_Channel-32);

            }

            則表示對應中斷(0~59)使能,若中斷編號小于32,則響應使能中斷寄存器ISER[0],反之使能中斷寄存器ISER[1]。

            配置好NVIC后,接著配置外部中斷寄存器EXTI

            STM32的EXTI支持外部19個外部中斷/事件,具有獨立的中斷屏蔽及狀態(tài)位控制。

            線0~15對應于外部IO的輸入中斷

            線16連接到PVD

            線17連接到RTC鬧鐘事件

            線18連接到USB喚醒事件

            /*------------------------ External Interrupt/Event Controller ---------------*/

            typedef struct

            {

            vu32 IMR; //中斷屏蔽寄存器 32bits,只有前19位有效

            vu32 EMR; //事件屏蔽寄存器

            vu32 RTSR; //上升沿觸發(fā)選擇寄存器

            vu32 FTSR; //下降沿觸發(fā)選擇寄存器

            vu32 SWIER; //軟件中斷寄存器 未設置IMR及EMR時,設置1,掛起PR,在PR清除后響應的SWIER清除

            vu32 PR; //中斷掛起寄存器 1表示中斷響應,0表示未發(fā)生,向該寄存器寫1,則清除掛起位

            } EXTI_TypeDef

            注:如果使用外部IO中斷,還必須使用AFIO復用里的外部中斷配置寄存器EXTICR。高16位保留,低16位有效。STM32任何一個IO口都可以配置成中斷輸入,但是IO口的數(shù)目遠遠大于中斷線數(shù)(16個)。

            GPIOA~GPIOG[15:0]分別對應中斷線15:0,每條中斷線對應于7個IO口。

            例如:中斷線0對應于GPIOA.0,GPIOB.0,GPIOC.0,GPIOD.0,GPIOE.0,GPIOF.0,GPIOG.0

            

           

            EXTICR[0]~EXTICR[3]每個EXTICR只用到了低16位,高16位保留。

            typedef struct

            {

            vu32 EVCR;

            vu32 MAPR;

            vu32 EXTICR[4];

            } AFIO_TypeDef

            EXTICR[0] 對應于EXTI0[3:0],EXTI1[3:0],EXTI2[3:0],EXTI3[3:0]

            EXTI0[3:0] 外部中斷線0

            0000àPA[0] 0001àPB[0] 0010àPC[0] 0011àPD[0] 0100àPE[0] 0101àPF[0] 0110àPG[0]

            EXTI1[3:0] 外部中斷線1

            0000àPA[1] 0001àPB[1] 0010àPC[1] 0011àPD[1] 0100àPE[1] 0101àPF[1] 0110àPG[1]

            EXTI2[3:0] 外部中斷線2

            0000àPA[2] 0001àPB[2] 0010àPC[2] 0011àPD[2] 0100àPE[2] 0101àPF[2] 0110àPG[2]

            EXTI3[3:0] 外部中斷線3

            0000àPA[3] 0001àPB[3] 0010àPC[3] 0011àPD[3] 0100àPE[3] 0101àPF[3] 0110àPG[3]

            EXTICR[1] 對應于EXTI4[3:0],EXTI5[3:0],EXTI6[3:0],EXTI7[3:0] 外部中斷線4~7

            EXTICR[2] 對應于EXTI8[3:0],EXTI9[3:0],EXTI10[3:0],EXTI11[3:0] 外部中斷線8~11

            EXTICR[3] 對應于EXTI12[3:0],EXTI13[3:0],EXTI14[3:0],EXTI15[3:0] 外部中斷線12~15

            /////////////////////////////////////////////////////////////////

            //Ex_NVIC_Config專用定義

            #define GPIO_A 0

            #define GPIO_B 1

            #define GPIO_C 2

            #define GPIO_D 3

            #define GPIO_E 4

            #define GPIO_F 5

            #define GPIO_G 6

            #define FTIR 1 //下降沿觸發(fā)

            #define RTIR 2 //上升沿觸發(fā)

            BITx 范圍為0~15,對應于IO口的位,對于外部中斷線。

            //外部中斷配置函數(shù)

            //只針對GPIOA~G;不包括PVD,RTC和USB喚醒這三個

            //參數(shù):GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:觸發(fā)模式,1,下升沿;2,上降沿;3,任意電平觸發(fā)

            //該函數(shù)一次只能配置1個IO口,多個IO口,需多次調(diào)用

            //該函數(shù)會自動開啟對應中斷,以及屏蔽線

            void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)

            {

            u8 EXTADDR;

            u8 EXTOFFSET;

            EXTADDR=BITx/4;//得到中斷寄存器組的編號 2/4=0

            EXTOFFSET=(BITx%4)*4; (2%4)*4 = 8

            RCC->APB2ENR|=0x01;//使能io復用時鐘

            AFIO->EXTICR[EXTADDR]&=~(0x000F<

            AFIO->EXTICR[EXTADDR]|=GPIOx<

            //自動設置

            EXTI->IMR|=1<

            if(TRIM&0x01)

            {

            EXTI->FTSR|=1<

            }

            if(TRIM&0x02)

            {

            EXTI->RTSR|=1<

            }

            }

            EXTADDR=BITx/4;得到中斷寄存器的編號0~4 BITx【0~15】

            EXTOFFSET=(BITx%4)/4;得到中斷寄存器的偏移量 0,4,8,12



          關(guān)鍵詞: STM32F10X 中斷

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();