微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32学习笔记(2):外部中断的使用

STM32学习笔记(2):外部中断的使用

时间:11-28 来源:互联网 点击:

  • GPIOD->

  • GPIOB->

    RCC_APB2Periph_AFIO, ENABLE);

    }

    设置相应的时钟所需要的RCC函数在stm32f10x_rcc.c中,所以要在工程中添加此文件。

    2.设置好相应的中断

    设置相应的中断实际上就是设置NVIC,在STM32的固件库中有一个结构体NVIC_InitTypeDef,里面有相应的标志位设置,然后再用NVIC_Init()函数进行初始化。详细代码如下:

    void NVIC_cfg()

    {

    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择中断分组2

    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQChannel;//选择中断通道2

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为0

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应式中断优先级设置为0

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断

    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;//选择中断通道3

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占式中断优先级设置为1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应式中断优先级设置为1

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断

    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;//选择中断通道5

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占式中断优先级设置为2

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//响应式中断优先级设置为2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断

    NVIC_Init(&NVIC_InitStructure);

    }

    由于有3个中断,因此根据前文所述,需要有3个bit来指定抢占优先级,所以选择第2组。又由于EXTI5-9共用一个中断响应函数,所以EXTI5选择的中断通道是EXTI9_5_IRQChannel,详细信息可以在头文件中查询得到。用到的NVIC相关的库函数在stm32f10x_nivc.c中,需要将此文件复制并添加到工程中。具体位置可以查看关于GPIO的笔记。这段代码编译起来没有任何问题,但是在链接的时候就会报错,需要把STM32F10xR.LIB加入工程中,具体位置在…KeilARMRV31LIBSTSTM32F10xR.LIB。

    3.IO口初始化

    void IO_cfg()

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//选择引脚2

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出频率最大50MHz

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//带上拉电阻输出

    GPIO_Init(GPIOE,&GPIO_InitStructure);

    GPIO_ResetBits(GPIOE,GPIO_Pin_2);//将PE.2引脚设置为低电平输出

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5; //选择引脚2 3 5

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入模式为浮空输入

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出频率最大50MHz

    GPIO_Init(GPIOC,&GPIO_InitStructure);//设置PC.2/PC.3/PC.5

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;//选择引脚3 6

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出频率最大50MHz

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//带上拉电阻输出

    GPIO_Init(GPIOD,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//选择引脚5

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出频率最大50MHz

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//带上拉电阻输出

    GPIO_Init(GPIOB,&GPIO_InitStructure);

    }

    其中连接外部中断的引脚需要设置为输入状态,而连接LED的引脚需要设置为输出状态,初始化PE.2是为了使得按键的另外一端输出低电平。GPIO中的函数在stm32f10x_gpio.c中。

    4.把相应的IO口设置为中断线路

    由于GPIO并不是专用的中断引脚,因此在用GPIO来触发外部中断的时候需要设置将GPIO相应的引脚和中断线连接起来,具体代码如下:

    void EXTI_cfg()

    {

    EXTI_InitTypeDef EXTI_InitStructure;

    //清空中断标志

    EXTI_ClearITPendingBit(EXTI_Line2);

    EXTI_ClearITPendingBit(EXTI_Line3);

    EXTI_ClearITPendingBit(EXTI_Line5);

    //选择中断管脚PC.2 PC.3 PC.5

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);

    EXTI_InitStructure.EXTI_Line = EXTI_Line2 |

  • Copyright © 2017-2020 微波EDA网 版权所有

    网站地图

    Top