stm32外部中断(4)

stm32外部中断

工程

将01 跑马灯工程复制一份,并改名为04 外部中断。
打开文件夹中Hrd文件,并新建EXTI文件夹。
在Keil中新建两个文件并保存在EXTI文件下,命名exti.c和wxti.h。
并将exti.c添加到工程中,exti.h添加到环境变量中。(详细添加请看stm32新建工程模板)
stm32外部中断(4)
stm32外部中断(4)
stm32外部中断(4)

外部中断介绍

详细请点击此链接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 的配置信息
stm32外部中断(4)
(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)

上一篇:郑州轻工业大学OJ-zznuoj-1006


下一篇:2021-01-13