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

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

http://www.jsqmd.com/news/134872/

相关文章:

  • 一文总结Web领域常见的十大高危漏洞:新手掌握即超越99%的人!
  • 维护成本降低50%:我们的页面对象模型(POM)是如何演进的?
  • 如何用智谱AutoGLM实现手机全自动操作?99%的人都不知道的隐藏功能
  • 灵活用工平台,亲测效果分享
  • python图书大厦图书借阅管理系统的设计与实现--论文_pycharm django vue flask
  • leetcode 3074
  • 三集一体除湿热泵机组哪家强?2025年权威供应商推荐,市面上领先的三集一体除湿热泵机组厂家排行榜深度剖析助力明智之选 - 品牌推荐师
  • 【Open-AutoGLM下载全指南】:手把手教你获取并部署开源大模型(附国内镜像链接)
  • 甲醛检测公司推荐榜单:绿阳环保领衔专业机构,守护室内呼吸安全 - torzi_JavaScript
  • Open-AutoGLM本地部署性能优化(实现低延迟高并发的4种核心技术)
  • 假如从今天学黑客技术,能在过年前接单赚钱吗?这份3个月的落地指南助你实现梦想!
  • 【Open-AutoGLM PC深度解析】:揭秘AI编程新神器如何颠覆开发者工作流
  • python在线学生学籍档案信息管理系统--论文_pycharm django vue flask
  • 全域价值深耕精准排名赋能:2025 DeepSeek优化头部服务商实力洞察 - 品牌推荐排行榜
  • 计算机Java毕设实战-基于springboot+vue的在线音乐创作分享网站基于SpringBoot的音乐分享与交流平台设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2026丽江旅拍品质TOP5推荐榜单:雪山古城下的口碑之选,新人必看! - 提酒换清欢
  • Open-AutoGLM本地运行卡顿怎么办?3招彻底解决资源占用过高问题
  • 合法练习黑客技术必备的四个靶场:网安新人从入门到实战的系统化训练方案你一定要知道!
  • 从零开始玩转Open-AutoGLM:GitHub新手入门+高级调优技巧大全
  • 你还在手动破解?Open-AutoGLM官方激活码正确申请方式大公开
  • 2025年山东企业400电话方案权威推荐榜单:山东公司代运营公众号承办商/山东运营短视频账号渠道/山东海报设计广告源头精选 - 品牌推荐官
  • 「通用智能」到底存不存在?LeCun与Hassabis激辩通用智能:大模型发展路径之争深度解析!
  • 【紧急通知】Open-AutoGLM主地址即将关闭?速看迁移指南与备份方案
  • 硅谷AI裁员潮!智能分化已开始:未来5年,程序员将被分为“可被优化”和“不可替代”两类!
  • 2025论文降AI实测指南
  • 必看!2025年散酒公司大推荐榜单 - 百誉集团
  • 新洁能 NCE65T540K:650V 超结 MOSFET 技术特性解析
  • 2025-2026年国内电子万能试验机生产商/生产厂家/制造商推荐:国产电子万能试验机哪家好/哪家强/哪个牌子好/哪个厂家品质好 - 品牌推荐大师1
  • 生成式AI写测试用例:效率飞跃的背后,我们失去了什么?
  • (Open-AutoGLM登录困境破局指南)仅限内部流传的4大运维秘技首次公开