微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32外部中断具体解释

STM32外部中断具体解释

时间:11-20 来源:互联网 点击:
上拉电阻输出
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 EXTI_Line3 EXTI_Line5; //选择中断线路2 3 5
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断请求,非事件请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //设置中断触发方式为上下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //外部中断使能
EXTI_Init(&EXTI_InitStructure);
}
EXTI_cfg中须要调用到的函数都在stm32f10x_exti.c。

5. 写中断响应函数
STM32不像C51单片机那样,能够用过interruptkeyword来定义中断响应函数,STM32的中断响应函数接口存在中断向量表中,是由启动代码给出的。默认的中断响应函数在stm32f10x_it.c中。因此我们须要把这个文件增加到project中来。
在这个文件里,我们发现,非常多函数都是仅仅有一个函数名,并没有函数体。我们找到EXTI2_IRQHandler()这个函数,这就是EXTI2中断响应的函数。我的目标是将LED灯点亮,所以函数体事实上非常easy:
void EXTI2_IRQHandler(void)
{
//点亮LED灯
GPIO_SetBits(GPIOD,GPIO_Pin_6);
//清空中断标志位,防止持续进入中断
EXTI_ClearITPendingBit(EXTI_Line2);
}

void EXTI3_IRQHandler(void)
{
GPIO_SetBits(GPIOD,GPIO_Pin_3);
EXTI_ClearITPendingBit(EXTI_Line3);
}

void EXTI9_5_IRQHandler(void)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);

EXTI_ClearITPendingBit(EXTI_Line5);
}
因为EXTI5-9是共用一个中断响应函数,因此全部的EXTI5 – EXTI9的响应函数都写在这个里面。

6. 写主函数
#include "stm32f10x_lib.h"

void RCC_cfg();
void IO_cfg();
void EXTI_cfg();
void NVIC_cfg();

int main()
{
RCC_cfg();
IO_cfg();
NVIC_cfg();
EXTI_cfg();

while(1);

}

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

网站地图

Top