当前位置: 首页 > news >正文

7.2 按钮实验

目录

1.搭建电路

2.分配EXTI线

3.配置EXTI线的参数

4.配置NVIC模块

5.编写中断响应函数

5.1确定中断响应函数的名称

5.2 判断哪条线触发了中断

5.3 清除标志位

6.代码


1.搭建电路

两个按钮实现控制板载LED的亮和灭,左边按钮控制点亮,右边按钮控制熄灭

2.分配EXTI线

也就是配置复用器,配置复用器之前先使能一下AFIO时钟,然后调用GPIO_EXTILineConfig函数

	// #2. 为EXTI5和EXTI6分配引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);

3.配置EXTI线的参数

EXTI_Init专门用来配置EXTI这条线

	// #3. 初始化EXTI线EXTI_InitTypeDef EXTI_InitStruct;//配置线5EXTI_InitStruct.EXTI_Line = EXTI_Line5;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//中断EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//捕获上升沿EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStruct);// 配置线6EXTI_InitStruct.EXTI_Line = EXTI_Line6;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;	// 中断EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 捕获上升沿EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStruct);

4.配置NVIC模块

配置中断的管理员,也就是NVIC模块,详细见7.1

下面使用分组二,其实选哪一个分组都一样,因为只有一个中断

主函数里面写分组

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	// #4. 配置中断NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn; // 中断名称 打开stm32f10x.h头文件 搜索enum IRQn里面找NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//子优先级NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//闭合开关NVIC_Init(&NVIC_InitStruct);

5.编写中断响应函数

5.1确定中断响应函数的名称

在startup文件夹里startup_stm32f10x_md.s文件第57行中断向量表里面找对应的中断函数名,不要写错,不然不起作用

EXTI9_5_IRQHandler这就是本次要用的中断响应函数,因为本次用到线5和线6,线5-线9共用EXTI9_5中断,可看本篇2的分配EXTI线图

void EXTI9_5_IRQHandler(void)
{}

5.2 判断哪条线触发了中断

5.3 清除标志位

在上面代码的基础上加了清0,比如左边按钮按了之后,线5从0变1之后,要清0,不清0后面都是1了

void EXTI9_5_IRQHandler(void)
{// 线5触发的中断if(EXTI_GetFlagStatus(EXTI_Line5)==SET) {EXTI_ClearFlag(EXTI_Line5);  //清除中断标志位GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);  //亮灯}// 线6触发的中断if (EXTI_GetFlagStatus(EXTI_Line6) == SET)	{EXTI_ClearFlag(EXTI_Line6);					// 清除中断标志位GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 灭灯}
}	  

6.代码

#include "stm32f10x.h"// 初始化板载LED
void App_OnBoardLED_Init(void);
// 初始化按钮
void App_Button_Init(void);int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);App_OnBoardLED_Init();App_Button_Init();while (1){}
}// 初始化板载LED
void App_OnBoardLED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIO_InitStruct);// 先让熄灭GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}
// 初始化按钮
void App_Button_Init(void)
{// #1. 初始化PA5和PA6RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;// PA5GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 输入上拉模式GPIO_Init(GPIOA, &GPIO_InitStruct);// PA6GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStruct);// #2. 复用器为EXTI5和EXTI6分配引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);// #3. 初始化EXTI线EXTI_InitTypeDef EXTI_InitStruct;// 配置线5EXTI_InitStruct.EXTI_Line = EXTI_Line5;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;	// 中断EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 捕获上升沿EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStruct);// 配置线6EXTI_InitStruct.EXTI_Line = EXTI_Line6;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;	// 中断EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 捕获上升沿EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStruct);// #4. 配置中断NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;		   // 中断名称 打开stm32f10x.h头文件 搜索enum IRQn里面找NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;		   // 子优先级NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;		   // 闭合开关NVIC_Init(&NVIC_InitStruct);
}void EXTI9_5_IRQHandler(void)
{// 线5触发的中断if (EXTI_GetFlagStatus(EXTI_Line5) == SET){EXTI_ClearFlag(EXTI_Line5);					  // 清除中断标志位GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 亮灯}// 线6触发的中断if (EXTI_GetFlagStatus(EXTI_Line6) == SET){EXTI_ClearFlag(EXTI_Line6);					// 清除中断标志位GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 灭灯}
}

http://www.dtcms.com/a/528077.html

相关文章:

  • 多语言网站思路柳州市安全教育平台
  • 触摸未来2025-10-25:蓝图绘制
  • 面向对象——设计模式(行为型)
  • 06-MySQL基础查询
  • 蓬莱网站建设哪家专业苏州智能网站开发
  • 医院慢病管理软件系统问题域需求分析文档(示例)
  • Java 大视界 -- Java 大数据机器学习模型在舆情分析中的情感倾向判断与话题追踪
  • 用于小样本故障增量学习的多视图 Shapelet 原型网络
  • 动态规划思想的延伸:计数模式再升级——巧妙捕捉「优美子数组」
  • 徐州提供网站建设要多少钱杭州房产网我爱我家官网
  • 鸿蒙NEXT系列之NDK UI监听组件事件
  • 20251025 分治总结
  • CentOS上安装dpkg的方法
  • 【C++ 泛型编程】基于哈希表封装 unordered_set(附完整源码解析)
  • 【Docker】docker部署一个服务
  • 【C++】set map 的使用
  • mormot.net.sock.pas的总体设计分析
  • 上海企业网站制作哪家专业wordpress适合做大型网站吗
  • 建设银行网站怎么看不见余额数字展馆设计
  • 【数组二分查找+数组反转】2022-11-19
  • 【新版发布】标准版PHP v5.6.4正式版,优化部分用户体验
  • Spring Boot3零基础教程,Profile 环境隔离用法,笔记55
  • 【MATLAB例程】二维环境定位,GDOP和CRLB的计算,锚点数=4的情况(附代码下载链接)
  • 英语“近音“易混单词
  • 代码随想录Day62|总结篇
  • 基于VMware和Cent OS的Docker Engine安装与配置
  • 十七、OpenCV中HighGUI模块的介绍和使用
  • 【JVM】详解 编译器原理与优化技术
  • 良好形象的重要性----反思
  • kali抓包流量