stm32外部中断
工程
将01 跑马灯工程复制一份,并改名为04 外部中断。
打开文件夹中Hrd文件,并新建EXTI文件夹。
在Keil中新建两个文件并保存在EXTI文件下,命名exti.c和wxti.h。
并将exti.c添加到工程中,exti.h添加到环境变量中。(详细添加请看stm32新建工程模板)
外部中断介绍
详细请点击此链接stm32外部中断介绍
函数介绍
RCC_APB2PeriphClockCmd()
函数原型
void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph,FunctionalState NewState)
使能IO口时钟,不同的IO组,调用的时钟使能函数不一样。
详细请看此链接:stm32时钟系统
GPIO_EXTILineConfig()
函数原形
void GPIO_EXTILineConfig(u8 GPIO_PortSource, u8 GPIO_PinSource)
功能描述: 选择 GPIO 管脚用作外部中断线路
输入参数 1: GPIO_PortSource: 选择用作外部中断线源的 GPIO 端口
输入参数 2 :GPIO_PinSource:待设置的外部中断线路,该参数可以取 GPIO_PinSourcex(x 可以是 0-15)
EXTI_Init()
函数原形
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
功能描述: 根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器
输入参数: EXTI_InitStruct:指向结构 EXTI_InitTypeDef 的指针,包含了外设 EXTI 的配置信息
(1)EXTI_Line:选择待使能或者失能的外部线路 外部中断线0~~18
(2)EXTI_Mode:设置被使能线路的模式 事件触发 or 中断触发
(3)EXTI_Trigger:设置被使能线路的触发边沿 下降沿 or 上升沿 or 上升沿和下降沿
(4)EXTI_LineCmd:用来定义选中线路的新状态
NVIC_Init()
详细请看此链接
stm32中断优先级NVIC
EXTIx_IRQHandler
此函数为外部中断服务函数,当发生中断时,就会执行此函数的内容。
要使用哪个外部中断,x就为相应的数字。
如:使用外部中断1,则函数为EXTI1_IRQHandler()
此函数一般在startup_stm32f10x_hd.s(启动文件)里查找
完整代码
exti.h
#ifndef __EXIT_H
#define __EXIT_H
void EXTIX_Init(void);
#endif
exti.c
#include"exti.h"
#include"Led.h"
#include"Key.h"
#include"delay.h"
void EXTIX_Init()
{
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
Key_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启IO口复用时钟,外部中断,需要使能 AFIO 时钟
//GPIOC.5
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);//设置IO口与中断线的映射关系,端口和端口号,例如PC.5
EXTI_InitStruct.EXTI_Line = EXTI_Line5; //指定要配置的中断线
EXTI_InitStruct.EXTI_LineCmd = ENABLE; //使能 or 失能
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //模式:事件 or 中断
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_Init(&EXTI_InitStruct);//初始化线上中断,设置触发条件等
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn; //中断通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//子优先级
NVIC_Init(&NVIC_InitStruct);//配置中断分组(NVIC),并使能中断
}
//编写中断服务函数
void EXTI9_5_IRQHandler(void)
{
static u8 KeySates = 1;
if(KeySates == 1 && KEY0 == 0)
{
delay_ms(10);
KeySates = 0;
if(KEY0 == 0)
LED0 =! LED0;
}
else if(KEY0)
KeySates = 1;
EXTI_ClearITPendingBit(EXTI_Line5);//清除EXTI5线路挂起位 有:则会执行一次中断;无:则会一直执行
}
实验步骤
(1)初始化IO口为输入。
GPIO_Init();
(2)开启IO口复用时钟。
RCC_APB2PeriphClockCmd();
(3)设置IO口与中断线的映射关系。
void GPIO_EXTILineConfig();
(4)初始化外部中断。
EXTI_Init();
(5)配置中断分组(NVIC)。
NVIC_Init();
(6) 编写中断服务函数。
EXTIx_IRQHandler();
(7)清除中断标志位
EXTI_ClearITPendingBit();
其他资源
stm32 新建工程模板
stm32 跑马灯(01)
stm32 按键点灯(02)
stm32 串口(3)