ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

stm32外部中断(4)

2021-05-29 19:04:14  阅读:291  来源: 互联网

标签:NVIC 中断 stm32 外部 Init InitStruct GPIO EXTI


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)

标签:NVIC,中断,stm32,外部,Init,InitStruct,GPIO,EXTI
来源: https://blog.csdn.net/qq_48764574/article/details/117389043

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有