news 2026/6/10 11:19:10

stm32基础学习——外部中断的使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
stm32基础学习——外部中断的使用

stm32基础学习——外部中断的使用

  • 一、前言
  • 二、准备工作
  • 三、编写代码
    • 3.1用查询方式实现LED开关
    • 3.2用中断方式实现LED开关
  • 四、结束语

所有可用资源可在我的gitee仓库查找,点击即可前往

一、前言

本篇文章继续介绍stm32的一些基本使用,文章主要是介绍外部中断的使用,同样以按键控制LED灯为例,之前我用查询方式来实现的,这篇文章尝试用中断的方式实现,废话不多说,咱们开始。

二、准备工作

硬件

  • stm32F103C8T6开发板
  • ST-LINK V2下载器一个
  • 3~5V的LED灯(发光二极管)一个
  • 四引脚按键一个
  • 杜邦线若干+面包板

软件

  • Keil 5(没安装可以点击进入我的另一篇博客有详细下载及配置教程)

其他(需要自行下载,点击前往,下载template文件即可)

  • stm32工程模板(由于新建模板比较麻烦,初学还是找个工程模板吧,方便点)

电路图:

三、编写代码

为了方便对比,我这里先给出用查询方式实现LED灯开关的代码,对比可以发现,在查询方式中Turn_LED函数是写在while循环里面的,而在中断方式里是写在中断函数里面的。

3.1用查询方式实现LED开关

#include"stm32f10x.h"#include"delay.h"uint8_tflag1=0;//表示是否按下的标志位uint8_tis_led_turn=0;//LED灯状态标志位默认为关voidTrun_LED(void);//开灯关灯voidTrun_LED(void){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0){flag1=1;//表示按下Delay(50);if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&&flag1==1){// 取反状态:如按下前为关则置为开,反之亦然is_led_turn=!is_led_turn;GPIO_WriteBit(GPIOB,GPIO_Pin_10,is_led_turn==1?Bit_SET:Bit_RESET);flag1=0;// 重置}}}intmain(void){//按键引脚初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_14;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//设置为输入上拉模式GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);//初始化连接LED的引脚GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//设置为输出推挽模式GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_Init(GPIOB,&GPIO_InitStruct);while(1){Trun_LED();}}

上面就是用查询方式实现的当个按键开关控制LED,也挺丝滑的哈。

3.2用中断方式实现LED开关

在stm32中使用中断我感觉还是有点麻烦,大概就以下的步骤:开启时钟 -> 配置GPIO和AFIO -> 配置EXTI -> 配置NVIC -> 配置中断函数,大概就这些了。

#include"stm32f10x.h"#include"delay.h"uint8_tis_led_turn=0;//LED灯状态标志位默认为关voidTurn_LED(void);//开灯关灯voidKey_Init(void);//初始化中断voidEXTI0_IRQHandler(void);//中断函数voidKey_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//配置EXTIEXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿出发EXTI_Init(&EXTI_InitStructure);//配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级NVIC_Init(&NVIC_InitStructure);}// 这里注意// GPIO引脚0~4使用的是独立中断线Line0~4,Line5-9是同一中断线,Line10-15同一中断线// 如果使用的是同一中断线,下面的函数名相应的改动,如EXTI0_IRQHandler()voidEXTI15_10_IRQHandler(void){//配置中断函数函数if(EXTI_GetITStatus(EXTI_Line14)==SET){//中断标志判断Delay(10);Turn_LED();}EXTI_ClearITPendingBit(EXTI_Line14);// 清除标志位}voidTurn_LED(void){//按键按下if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0){// 取反状态:如按下前为关则置为开,反之亦然is_led_turn=!is_led_turn;GPIO_WriteBit(GPIOB,GPIO_Pin_10,is_led_turn==1?Bit_SET:Bit_RESET);//等待松开,防止重复进入中断(学习使用,工作中应避免这种用法)while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0);Delay(10);}}intmain(void){//按键引脚初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_14;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//设置为输入上拉模式GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);//初始化连接LED的引脚GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//设置为输出推挽模式GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_Init(GPIOB,&GPIO_InitStruct);Key_Init();//初始化中断while(1){//Turn_LED();}}

四、结束语

好了,stm32的基本使用——外部中断的使用先介绍到这,后续有时间我继续更新这方面的文章,敬请期待,我是“风行男孩”,咱有缘再见!(码字不易,转载请标明出处!若是文章有帮助,点个赞留个痕迹即可。)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 9:25:27

【课程设计/毕业设计】基于springboot音乐翻唱与分享平台基于SpringBoot的音乐分享与交流平台设计与实现【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/29 12:53:03

Open-AutoGLM频繁掉线登录失败,企业级高可用接入方案来了

第一章:Open-AutoGLM 网页登不上当用户尝试访问 Open-AutoGLM 服务时,可能会遇到网页无法加载或登录失败的问题。这类情况通常由网络配置、认证机制或服务端状态异常引起。常见原因与排查步骤 检查本地网络连接是否正常,尝试访问其他网站验证…

作者头像 李华
网站建设 2026/6/9 22:30:10

Open-AutoGLM PC到底有多强?5大核心功能带你抢先掌握未来开发节奏

第一章:Open-AutoGLM PC的诞生背景与未来定位随着大语言模型在自然语言理解、代码生成和智能推理等领域的突破性进展,本地化、轻量化AI推理设备的需求日益增长。Open-AutoGLM PC正是在这一背景下应运而生,旨在为开发者、研究者及边缘计算用户…

作者头像 李华
网站建设 2026/6/8 11:47:58

编写一个程序,建立一个带头结点的单向链表,链表中每个结点包含整型数据域和指针域,输出此链表的数值。结点的数据域值依次从键盘输入,以0表示输入结束且0不存储在链表中。

#include<iostream> using namespace std;struct Node {int val;Node* next; };int main() {Node* head new Node(); // 头结点Node* tail head;int num;// 建立链表while(cin >> num && num ! 0){Node* p new Node();p->val num;p->next null…

作者头像 李华
网站建设 2026/5/28 23:08:03

基于风险驱动的测试策略制定

为何需要风险驱动的测试‌ 在敏捷与DevOps成为主流的今天&#xff0c;软件发布周期急剧缩短。测试团队面临着前所未有的压力&#xff1a;既要保证质量&#xff0c;又要跟上发布节奏。盲目追求100%的测试覆盖不仅成本高昂&#xff0c;在实践中也难以实现。风险驱动的测试思维转…

作者头像 李华
网站建设 2026/6/10 10:56:45

国际化与本地化测试的完整清单:构建全球化软件的质量防线

在全球数字化浪潮下&#xff0c;软件产品的国际竞争力不仅取决于其核心功能&#xff0c;更依赖于其对不同语言、文化和地区偏好的精准适配。国际化与本地化测试&#xff0c;正是保障软件“全球通行”质量的关键环节。本文旨在为软件测试从业者提供一份系统、可操作的完整测试清…

作者头像 李华