17_外部中断实验

2023-11-08

目录

外部中断概述

外部中断的一般配置步骤:

硬件连接图:

实验源码:

中途遇到问题printf打印中文乱码:


外部中断概述

STM32F1的每个IO口都可以作为外部中断输入。

STM32F1的中断控制器支持19个外部中断/事件请求:

线0~15:对应外部IO口的输入中断。

线16:连接到PVD输出。

线17:连接到RTC闹钟事件。

线18:连接到USB换醒事件。

每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。

STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,所以这里是用到了映射例如EXTI0能触发它的是GPIOA.0,GPIOB.0,GPIOC.0...等,EXTI1能触发它的是GPIOA.1,GPIOB.1,GPIOC....等。注意每一个时间只有一个IO口能映射到EXTIX里。

 IO口外部中断在中断向量表中之分配了7个中断向量,也就是只能使用7个中断服务函数图 缺了EXTI0

从表中可以看出,外部中断线5~9分配一个中断向量,共用一个服务函数外部中断线10~15分配一个中断向量,共用一个中断服务函数。 

中断函数列表:

EXTI0_IRQHandler

EXTI1_IRQHandler

EXTI2_IRQHandler

EXTI3_IRQHandler

EXTI4_IRQHandler

EXTI9_5_IRQHandler

EXTI15_10_IRQHandler

外部中断常用库函数

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

//设置IO口与中断线的映射关系

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

//初始中断线:触发方式等

void ITStatus EXTI_GetITStatus(uint32_ EXTI_Line);

//判断中断状态,是否发生

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

//清除中断线上的中断标志位

外部中断的一般配置步骤:

1.初始化IO口为输入

GPIO_Init();

2.开启IO口复用时钟

RCC_APB2PeriClockCmd(RCC_APB2Periph_AFIO,ENABLE);

3.设置IO口与中断线的映射关系

Void GPIO_EXTILineConfig();

4.初始化线上中断,设置触发条件等。

EXTI_Init();

5.配置中断分组(NVIC),并使能中断。

NVIC_Init();

6.编写中断服务函数。

EXTIx_IRQHandle();

7.清除中断标志位

EXTI_ClearITPendingBit();

硬件连接图:

实验源码:

实验用的是KEY0 因为一端是接地所以初始化为上拉输入(芯片内部接的是正极)

/*!
	\brief		RCC配置
	\param[in]	none
	\param[out]	none
	\retval 	none
*/
void Rcc_config(void)
{	
	
	/*使能GPIOA时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	/*使能GPIOE时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

	/*使能复用外设时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	/*使能UART1时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

}






/*!
	\brief		GPIO初始化函数
	\param[in]	none
	\param[out]	none
	\retval 	none
*/
void Gpio_Init(void)
{	
	/*GPIO结构体*/
	GPIO_InitTypeDef GPIO_InitTypeDefstruct;
	
	/*KEY2结构体配置*/
	GPIO_InitTypeDefstruct.GPIO_Mode  = GPIO_Mode_IPU; 					   //上拉输入 没按下默认是高电平
	GPIO_InitTypeDefstruct.GPIO_Pin   = GPIO_Pin_4;  //引脚选择
	/*初始化GPIOE Pin2 3 4*/ 
	GPIO_Init(GPIOE,&GPIO_InitTypeDefstruct); 
	
	
	/*UART1发送引脚配置*/
	GPIO_InitTypeDefstruct.GPIO_Mode  = GPIO_Mode_AF_PP;//推挽复用输出
	GPIO_InitTypeDefstruct.GPIO_Pin   = GPIO_Pin_9;
	GPIO_InitTypeDefstruct.GPIO_Speed =	GPIO_Speed_10MHz;
	/*写入结构体到GPIOA*/
	GPIO_Init(GPIOA,&GPIO_InitTypeDefstruct);
	
	/*UART1接收引脚配置*/
	GPIO_InitTypeDefstruct.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_InitTypeDefstruct.GPIO_Pin   = GPIO_Pin_10;
	GPIO_InitTypeDefstruct.GPIO_Speed =	GPIO_Speed_10MHz;
	/*写入结构体到GPIOA*/	
	GPIO_Init(GPIOA,&GPIO_InitTypeDefstruct);
	
		
}




/*!
	\brief		UART1初始化
	\param[in]	none
	\param[out]	none
	\retval 	none
*/

void Uart1_Init(u32 bound)
{
	/*UART结构体*/
	USART_InitTypeDef USART_InitTypeDefstruct;
	/*NVIC结构体*/
	NVIC_InitTypeDef NVIC_InitTypeDefstruct;
	
	/*UART结构体配置*/
	USART_InitTypeDefstruct.USART_BaudRate = bound; //波特率
	USART_InitTypeDefstruct.USART_HardwareFlowControl =USART_HardwareFlowControl_None; //不使用硬件流
	USART_InitTypeDefstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//发送接收使能
	USART_InitTypeDefstruct.USART_Parity = USART_Parity_No; //不使用奇偶校验
	USART_InitTypeDefstruct.USART_StopBits = USART_StopBits_1; //1个停止位
	USART_InitTypeDefstruct.USART_WordLength = USART_WordLength_8b; //8个数据位
	/*写入USART1*/
	USART_Init(USART1,&USART_InitTypeDefstruct);
	
	/*使能串口1*/
	USART_Cmd(USART1,ENABLE);

	/*中断配置*/
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //UART1接收缓冲区非空中断,接收中断
	
	NVIC_InitTypeDefstruct.NVIC_IRQChannel=  USART1_IRQn; //USART1中断通道
	NVIC_InitTypeDefstruct.NVIC_IRQChannelCmd = ENABLE;  //使能USART1中断
	NVIC_InitTypeDefstruct.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级
	NVIC_InitTypeDefstruct.NVIC_IRQChannelSubPriority = 1;//子优先级
	
	/*写入NVIC中*/
	NVIC_Init(&NVIC_InitTypeDefstruct);
}





/*!
	\brief		UART1中断服务函数
	\param[in]	none
	\param[out]	none
	\retval 	none
*/

void USART1_IRQHandler(void)
{
	uint8_t Receive;
	/*接收数据*/
	Receive = USART_ReceiveData(USART1);

	printf("UART1中断,值为:%x\r\n",Receive);


}
	


/*!
	\brief		EXTI初始化
	\param[in]	none
	\param[out]	none
	\retval 	none
*/
void EXTIX_Init(void)
{	
	/*EXTI结构体*/
	EXTI_InitTypeDef EXTI_InitStuct;
	/*NVIC结构体*/
	NVIC_InitTypeDef NVIC_InitTypeDefstruct;
	/*映射IO口到EXTI线上*/
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
	
	
	/*触发方式设置*/
	EXTI_InitStuct.EXTI_Line = EXTI_Line4;//EXTI4
	EXTI_InitStuct.EXTI_LineCmd = ENABLE; //使能
	EXTI_InitStuct.EXTI_Mode = EXTI_Mode_Interrupt;  //中断模式
	EXTI_InitStuct.EXTI_Trigger = EXTI_Trigger_Falling; //下降验触发 按键按下是低电平
	/*触发方式写入*/
	EXTI_Init(&EXTI_InitStuct);
	
	
	/*中断配置*/
	NVIC_InitTypeDefstruct.NVIC_IRQChannel=  EXTI4_IRQn; //EXTI4中断通道
	NVIC_InitTypeDefstruct.NVIC_IRQChannelCmd = ENABLE;  //使能EXTI4中断
	NVIC_InitTypeDefstruct.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
	NVIC_InitTypeDefstruct.NVIC_IRQChannelSubPriority = 1;//子优先级
	
	/*写入NVIC中*/
	NVIC_Init(&NVIC_InitTypeDefstruct);

}





/*!
\brief		EXTI4中断服务函数
	\param[in]	none
	\param[out]	none
	\retval 	none
*/

void EXTI4_IRQHandler(void)
{
	/*消抖处理*/
	delay_ms(10);
	
	/*读取GPIOE.4电平低是按下*/
	if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0)
	{
		printf("外部中断触发,KEY0按下\r\n");//提示语句
		
	}

	/*清除EXTI4中断标志位*/
	EXTI_ClearITPendingBit(EXTI_Line4);
}





 int main(void)
 {	
     
	 /*配置系统中断分组为2位抢占2位响应*/
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	 /*Rcc初始化*/	 
	 Rcc_config();
	 /*GPIO初始化*/
	 Gpio_Init();
	 /*UART1初始化*/
	 Uart1_Init(9600);
	 /*EXTI初始化*/
	 EXTIX_Init();

	/*死循环*/ 
	 while(1){
		 
	 };
	
 }

 中途遇到问题printf打印中文乱码:

1.排除是否波特率太高

2.查看用到printf.c文件是否使用的是UTF-8编码,使用UTF-8编码会出现中文乱码解决办法如下博客

USART串口printf重定向中文乱码_洛尘~~的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

17_外部中断实验 的相关文章

随机推荐

  • 可逆去噪网络(CVPR2021):Invertible Denoising Network: A Light Solution for Real Noise Removal

    paper github Abstract Invertible networks have various benefits for image denoising since they are lightweight informati
  • 区块链TRC20(波厂)从零开发JAVA(一)

    区块链TRC20 波厂 从零开发JAVA 一 大家好 我是广东靓仔 专业从事java八年开发 区块链开发经验五年 今天教大家从零开始教大家TRC20开发 后续会发布源码提供给大家参考 后续更多区块链交流 请下方留意我会一一查看 欢迎大家多多
  • HDFS副本放置策略

    前言 前一篇文章中刚刚分析完HDFS的异构存储以及相关的存储类型选择策略 浏览量还是不少的 说明大家对于HDFS的异构存储方面的功能还是很感兴趣的 但是其实一个文件Block块从最初的产生到最后的落盘 存储类型选择策略只是其中1步 因为存储
  • java 对应sql驱动版本_有关sqlserver的 jdbc驱动版本整理

    原标题 有关sqlserver的 jdbc驱动版本整理 皕杰报表创建sqlserver数据库的时候 需要加载sqlserver jdbc驱动 有些时候你需要了解不同版本的sqlserver的 jdbc驱动是哪个 1 Microsoft JD
  • 知识图谱简介及应用

    知识图谱由谷歌最早提出提升其搜索质量 在当前的人工智能大数据时代 知识图谱作为重要的知识表示方式之一 为机器语言认知提供了丰富的背景知识 使得机器对人类自然语言的理解更加精确 知识图谱本质上是语义网络 semantic network 的知
  • 最详细的python安装教程,小白建议收藏

    python安装是学习pyhon第一步 很多刚入门小白不清楚如何安装python 今天我来带大家完成python安装与配置 跟着我一步步来 很简单 你肯定能完成 咱们先一起来看看今天的主要内容 1 安装Python 2 编写第一个 Hell
  • emacs下类似Visual Assist 的工具:cscope(代码中穿梭)

    先前在VC6中都用习惯了那个小助手Visual Assist ctr g就到了函数定义 在emacs下当然也想用这个功能 在网上搜了下 经过试验感觉蛮好用的 1 首先到 http cscope sourceforge net 下载 csco
  • 「一体化信息建设」,江苏人社如何完成数据安全管控(建设篇)

    2019 年 江苏省人社厅正式启动全省人社一体化信息平台建设项目 省人社一体化信息平台基于全省统一的人社业务标准 规范 流程和数据体系 以群众需求为导向 以省集中建设为重点 以云平台架构为基础 采用人社部 LEAF6 2 中台架构 目标建设
  • 百度高级搜索语法

    方法一 嫌麻烦或记不住的话可以采用这种方法 在百度首页直接点击右上角的 设置 高级搜索 在弹出的对话框中按提示填入搜索信息 方法二 采用高级语法进行搜索 具体语法如下 intitle 搜索范围限定在网页标题 网页标题通常是对网页内容提纲挈领
  • C# 读取数据库中时间,毫秒丢失的情况总结

    if row AddDate null row AddDate ToString model AddDate DateTime Parse row AddDate ToString 用动软直接生成以上代码会发现在读取日期时精度丢失毫秒 比如
  • 数据结构与算法基础知识整理

    目录 1 数据结构 8种数据结构 2 排序 8种排序 3 查找 7种查找 4 树 5 图 BFS DFS 最小生成树 最短路径 一 数据结构 1 顺序表和链表 顺序表使用数组实现 采用一组地址连续的存储单元 数组大小有两种方式指定 一是静态
  • C# 两种求平方根的方法 随机法 二分法

    自己发明的方法 效率不高 纯属娱乐 有点类似于蒙特卡洛算法 但是有记忆 private double TQSqrt double X 建立一个数列来存储结果 List
  • Keil编译*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS

    这个提示原因是工程中定义了函数但程序中没有被调用出现的提示 解决方法 步骤1 步骤2 设置完再次编译 编译器自动把没有调用到的函数屏蔽掉
  • Nature发文:LK-99不是超导体(附链接)

    来源 新智元 本文约3500字 建议阅读7分钟Nature刊文梳理LK 99不是超导体的证据 科学界已经开始总结经验教训 导读 这次真的实锤了 Nature刊文梳理LK 99不是超导体的证据 科学界已经开始总结经验教训 连续多日的室温超导疑
  • spring boot打包发布后修改端口和配置不起作用

    在开发环境好好的 发布到服务器后改了下端口怎么改都不正常 还是用的开发环境配置的端口号 pom xml中的配置如下
  • 引导页源码全开源解密带后台超漂亮音乐+客服+多模板

    源码介绍 话不多说 全新的 自适应 采用器 可自己歌单 接的的云客服 1 新增6套 2 增加后台 3 上传 4 新增多种片 5 弹出公告 6 适配seo优化 网盘下载地址 http www bytepan com t2mfGXzODQN 图
  • 什么是网关,网关的作用是什么?

    网关 Gateway 又称网间连接器 协议转换器 网关在传输层上以实现网络互连 是最复杂的网络互连设备 仅用于两个高层协议不同的网络互连 网关的结构也和路由器类似 不同的是互连层 网关既可以用于广域网互连 也可以用于局域网互连 网关是一种充
  • powershell notes II

    学习疑问 1 如何任意显示某个对象的method并使用它呢 已结 2 获取可卸载程序的命令行字卸载符串该怎么在powershell中使用呢 一 PowerShell常用快捷键F7 显示曾经输入的命令历史记录 用上下箭头可逐个选定再次执行 A
  • node 升版本

    不用命令 不用nvm的傻瓜式教程 前端项目之前一直用的node14版本 结果clone下一个开源项目需要15以上的版本 这就需要升级了 第一步 直接从官网上下载需要的版本 我下载的是免安装的压缩包 官网地址 Node js 下载完成后解压放
  • 17_外部中断实验

    目录 外部中断概述 外部中断的一般配置步骤 硬件连接图 实验源码 中途遇到问题printf打印中文乱码 外部中断概述 STM32F1的每个IO口都可以作为外部中断输入 STM32F1的中断控制器支持19个外部中断 事件请求 线0 15 对应