新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32學習之六

        stm32學習之六

        作者: 時間:2016-12-03 來源:網絡 收藏
        EXTI按鍵中斷:

        EXTI中斷:
        注意:
        1、EXTI中斷是一種外部中斷,需要配置相關的管理中斷器件的。
        2、如果是事件中斷,是不需要配置管理這個寄存器的。
        3、著重注意這種關系:EXTI寄存器與NVIC寄存器的關系,就是這個!!!

        寫出的程序如下:
        由于是中斷驅動,因此必須配置中斷控制器。
        首先是:
        exit.h中斷頭文件:
        #ifndef _EXIT_H
        #define _EXIT_H
        #include "stm32f10x.h"
        void NVIC_Configure(void);
        void Exit_Configure(void);

        本文引用地址:http://www.104case.com/article/201612/325176.htm


        #endif
        然后是:
        exit.c中斷程序配置信息:
        #include "exit.h"

        void NVIC_Configure()
        {

        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        NVIC_Init ( &NVIC_InitStructure);
        }

        void Exit_Configure()
        {
        EXTI_InitTypeDef EXTI_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO,ENABLE);

        NVIC_Configure();

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

        GPIO_Init(GPIOE,&GPIO_InitStructure);

        GPIO_SetBits(GPIOC,GPIO_Pin_5);


        GPIO_EXTILineConfig ( GPIO_PortSourceGPIOE, GPIO_PinSource5);
        EXTI_InitStructure.EXTI_Line=EXTI_Line5;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_Init(&EXTI_InitStructure) ;

        }


        需要特別注意幾個配置信息。

        然后是led.h:
        #ifndef _LED_H
        #define _LED_H
        #include "stm32f10x.h"

        #define ON 1
        #define OFF 0

        #define LED1(a) if (a)
        GPIO_ResetBits(GPIOC,GPIO_Pin_3);
        else
        GPIO_SetBits(GPIOC,GPIO_Pin_3)
        #define LED2(a) if (a)
        GPIO_ResetBits(GPIOC,GPIO_Pin_4);
        else
        GPIO_SetBits(GPIOC,GPIO_Pin_4)
        #define LED3(a) if (a)
        GPIO_ResetBits(GPIOC,GPIO_Pin_5);
        else
        GPIO_SetBits(GPIOC,GPIO_Pin_5)
        void LED_GPIO_Config(void);


        #endif

        接著是:led.c

        #include "led.h"
        void LED_GPIO_Config(void)
        {
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

        GPIO_Init(GPIOC,&GPIO_InitStructure);

        GPIO_SetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
        }

        然后是,中斷主函數:
        /******************** (C) COPYRIGHT 2013**************************
        * 文件名 :main.c
        * 描述 :用3.5.0版本建的工程模板。
        * 實驗平臺:野火STM32開發板
        * 庫版本 :ST3.5.0
        *
        * 作者 :wit_yuan
        * 版本 : v1.0
        * 時間 : 2013年4月27日
        **********************************************************************************/
        #include "stm32f10x.h"
        #include "led.h"
        #include "SysTick.h"
        #include "key.h"
        #include "exit.h"
        /*
        * 函數名:main
        * 描述 : 主函數
        * 輸入 :無
        * 輸出 : 無
        */
        int main(void)
        {
        LED_GPIO_Config();
        //SysTick_Init();
        //key_Init();
        Exit_Configure();
        while(1)
        {

        }

        }

        在程序執行之后,只要開啟了中斷,那么就會在按鍵按下后,觸發中斷!

        中斷服務程序如下:
        void EXTI9_5_IRQHandler(void)
        {
        if(EXTI_GetITStatus(EXTI_Line5) != RESET) //確保是否產生了EXTI Line中斷
        {
        // LED1 取反
        GPIO_WriteBit(GPIOC, GPIO_Pin_3,
        (BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3))));
        EXTI_ClearITPendingBit(EXTI_Line5); //清除中斷標志位
        }
        }


        小結:
        寫stm32的程序總體上看來是比較簡單的,但是要注意一些比較細節的東西。



        關鍵詞: stm32EXTI按鍵中斷

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 上饶市| 乐清市| 永丰县| 富裕县| 临沧市| 乐平市| 祁连县| 多伦县| 黔西县| 巧家县| 遵义县| 太白县| 通道| 资阳市| 涪陵区| 获嘉县| 雅江县| 宜良县| 开封市| 荥阳市| 务川| 黄陵县| 怀远县| 无锡市| 长武县| 高邮市| 鸡泽县| 宾阳县| 罗源县| 田东县| 左权县| 德庆县| 汉沽区| 淄博市| 左权县| 博野县| 十堰市| 榕江县| 棋牌| 大连市| 桐柏县|