新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 NVIC嵌套向量中斷控制器函數分析

        STM32 NVIC嵌套向量中斷控制器函數分析

        作者: 時間:2016-11-30 來源:網絡 收藏
        中斷管理函數
        CM3內核支持256個中斷,其中包含了16個內核中斷和240個外部中斷,并且具有256級的可編程中斷設置。但STM32并沒有使用CM3內核的全部東西,而是只用了它的一部分。STM32有76個中斷,包括16個內核中斷和60個可屏蔽中斷,具有16級可編程的中斷優先級。而我們常用的就是這60個可屏蔽中斷,所以我們就只針對這60個可屏蔽中斷進行介紹。
        在MDK內,與NVIC相關的寄存器,MDK為其定義了如下的結構體:
        typedef struct
        {
        vu32 ISER[2];
        u32 RESERVED0[30];
        vu32 ICER[2];
        u32 RSERVED1[30];
        vu32 ISPR[2];
        u32 RESERVED2[30];
        vu32 ICPR[2];
        u32 RESERVED3[30];
        vu32 IABR[2];
        u32 RESERVED4[62];
        vu32 IPR[15];
        } NVIC_TypeDef;

        ISER[2]:Interrupt set enable registers中斷使能寄存器組
        ICER[2]:interrupt clear enable registers 中斷除能寄存器組
        ISPR[2]:interrupt set pending registers 中斷掛起寄存器組
        ICPR[2]: interrupt clear pending registers 中斷解掛寄存器組
        IABR[2]:interrupt active bit registers 中斷激活標志寄存器組

        主要分析
        IPR[15]:interrupt priority registers 中斷優先級控制寄存器組




        使用函數實現中斷分組: 可選分組0--4

        MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
        {
        u32 temp,temp1; //設置中轉變量
        temp1=(~NVIC_Group)&0x07; //取后3位
        temp1<<=8; //左移8位
        temp=SCB->AIRCR; //讀取先前設置
        temp&=0x0000F8FF; //清空先前設置
        temp|=0x05FA0000; //插入密鑰
        temp|=temp1; //分組設置賦值進
        SCB->AIRCB=temp; //設置完的值賦值給中斷分組寄存器
        }
        語句解讀:

        temp1=(~NVIC_Group)&0x07; 由于
        所以組號取反與111 即得到分組所需寄存器值
        temp|=0x05FA0000;
        密鑰


        使用函數實現中斷優先級設置:
        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; //得到組內偏移地址
        IPROFFSET=IPROFFSET*8+4; //得到確切地址
        MY_NVIC_PriorityGroupConfig(NVIC_Group); //設置分組
        temp=NVIC_Preemptionpriority<<(4-NVIC_Group); // 設置搶占優先級
        temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); //設置響應優先級
        temp&=0xf; //取低4位
        if(NVIC_Channel<32) NVIC->ISER[0]|=1<else
        NVIC->ISER[1]|=1<<(NVIC_Channel-32);
        NVIC->IPR[IPRADDR]|=temp<}

        語句解讀:

        u8 IPRADDR=NVIC_Channel/4; //ISER[2]組可以設置60個中斷優先級,每組15個寄存器,每個寄存器32位 每個可中斷8位,每個寄存器可以設置4個中斷, 組地址=channel/4; //選擇中斷號組(0--3)(4--7),,,(56---59)
        u8 IPROFFSET=NVIC_Channel%4; 組內偏移地址 //選擇第幾個中斷號
        IPROFFSET=IPROFFSET*8+4; //由于每個中斷8位,只用了前4位,所以偏移4






        temp=NVIC_Preemptionpriority<<(4-NVIC_Group); //搶占優先級在左邊,根據搶占位多少進行左移
        temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); //響應優先級在右邊,根據響應位多少進行右移
        temp&=0xf; //得到分組值

        外部中斷配置函數:

        STM32的EXTI控制器支持19個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都有獨立的觸發和屏蔽設置。STM32的19個外部中斷為:
        線0~15:對應外部IO口的輸入中斷。
        線16:連接到PVD輸出。
        PVD(Programmable Voltage Detector),即可編程電壓監測器。應用于STM32ARM芯片中,作用是監視供電電壓,在供電電壓下降到給定的閥值以下時,產生一個中斷,通知軟件做緊急處理。當供電電壓又恢復到給定的閥值以上時,也會產生一個中斷,通知軟件供電恢復。
        線17:連接到RTC鬧鐘事件。 RTC是多種名詞的縮寫,如:實時時鐘(Real-Time Clock)
        線18:連接到USB喚醒事件。
        對于外部中斷EXTI控制MDK定義了如下結構體:
        typedef struct
        {
        vu32 IMR;
        vu32 EMR;
        vu32 RTSR;
        vu32 FTSR;
        vu32 SWIER;
        vu32 PR;
        } EXTI_TypeDef;


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 蕉岭县| 长汀县| 大城县| 德庆县| 台安县| 礼泉县| 庄河市| 剑川县| 宁武县| 黄山市| 鹰潭市| 广元市| 绥阳县| 望谟县| 郁南县| 五华县| 石门县| 平和县| 玉环县| 兴隆县| 江油市| 枝江市| 通化市| 宁晋县| 洛扎县| 南平市| 东乡族自治县| 石河子市| 铜鼓县| 农安县| 宜章县| 区。| 宁阳县| 纳雍县| 普兰店市| 定南县| 金川县| 子长县| 会宁县| 奉新县| 新民市|