新闻中心

EEPW首页>嵌入式系统>设计应用> STM32学习笔记(2):外部中断的使用

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

作者: 时间:2016-11-28 来源:网络 收藏

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 | 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单片机那样,可以用过interrupt关键字来定义中断响应函数,STM32的中断响应函数接口存在中断向量表中,是由启动代码给出的。默认的中断响应函数在stm32f10x_it.c中。因此我们需要把这个文件加入到工程中来。

在这个文件中,我们发现,很多函数都是只有一个函数名,并没有函数体。我们找到EXTI2_IRQHandler()这个函数,这就是EXTI2中断响应的函数。我的目标是将LED灯点亮,所以函数体其实很简单:

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);

}

main函数前是函数声明,main函数函数体中都是调用初始化配置函数,然后进入死循环,等待中断响应。

由于文中牵涉到很多库函数,我们可以通过查找库函数说明文档来了解相应的函数有些什么作用,在《ARM®-based 32-bit MCU STM32F101xx and STM32F103xx firmware library》中。网上也有中文版的说明文档可供参考。


上一页 1 2 下一页

评论


技术专区

关闭