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

小实验:按键点灯(中断法)

1.实验目的

使用中断的方法,按下KEY1翻转LED1状态,而LED2一直保持500ms的频率闪烁

2.硬件清单

  • STM32开发板
  • ST-Link

3.代码

3.1exti.c

这个.c文件是编写中断的代码

#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "led.h"void exti_init(void)
{GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOA_CLK_ENABLE();                   //使能GPIO时钟//调用GPIO初始化时钟gpio_initstruct.Pin = GPIO_PIN_0;               //设置AFIOgpio_initstruct.Mode = GPIO_MODE_IT_FALLING;    //设置EXTI,下降沿触发gpio_initstruct.Pull = GPIO_PULLUP;             //设置GPIO输入模式gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &gpio_initstruct);//设置NVICHAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);         //设置优先级,EXTI0_IRQn就是PA0的中断线HAL_NVIC_EnableIRQ(EXTI0_IRQn);                 //使能中断
}//中断服务函数,中断服务函数没有任何的返回值和传入的参数
void EXTI0_IRQHandler(void)                         //中断服务函数的名字是在启动文件中写好的,找到对应的中断线即可。
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);           //调用公共服务函数
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)      //在回调函数中写代码
{delay_ms(20);if(GPIO_Pin == GPIO_PIN_0){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET){led1_toggle();}}
}

在这里插入图片描述
上图为中断的配置流程
使能GPIO时钟
就是代码中,exti_init()函数中的__HAL_RCC_GPIOA_CLK_ENABLE();这句。
设置GPIO输入模式,设置AFIO,设置EXTI,这三个就是调用GPIO初始化函数,设置这个函数中结构体中的参数。
GPIO模式:就是设置PULL为上拉还是下拉
AFIO:就是设置Pin引脚
EXTI:就是设置Mode为上升沿触发,还是下降沿触发,在这里插入图片描述
选择上升沿触发就是,当从低电平变为高电平时就触发中断,
选择下降沿触发就是,当从高电平变为低电平时就触发中断。
设置NVIC
首先设置优先级分组,是在main.c函数中HAL_Init()中设置,下图这句代码中修改后面的数字。
在这里插入图片描述
然后设置优先级,就是调用HAL_NVIC_SetPriority()函数。
然后设置使能中断,就是调用HAL_NVIC_EnableIRQ()函数
设置中断服务函数
在启动文件中在这里插入图片描述
找到对应的中断函数名,在这个函数中调用回调函数,然后在回调函数中写相应的代码。
写回调函数时,首先要判断一下检查触发中断的引脚是否是 PA0(GPIO_PIN_0),如果是其他引脚(如 PA1、PB2 等)触发中断,则跳过处理。
中断运行的步骤
首先外部触发中断,然后就会调用中断函数,在中断函数中会将设置为中断的引脚号传给回调函数,然后回调函数就会根据引脚的变化进行相应的动作。
完结

http://www.lryc.cn/news/610349.html

相关文章:

  • 【笔记】ROS1|5 ARP攻击Turtlebot3汉堡Burger并解析移动报文【旧文转载】
  • traefik网关鉴权中间件转发multipart/form-data请求的multipart: NextPart: EOF问题
  • LLM大模型时代:生活服务领域的“生存革命“与新生态重构
  • 深度学习-卷积神经网络CNN-卷积层
  • 探索机器学习在医疗领域的应用与挑战
  • Flask 项目 Windows 服务器部署全流程
  • C++信息学奥赛一本通-第一部分-基础一-第一章
  • RTX5060显卡安装cuda版本PyTorch踩坑记录
  • 深度解析:CPU 与 GPU 上的张量运算,为何“快”与“慢”并非绝对?
  • chatgpt plus简单得,不需要求人,不需要野卡,不需要合租,不需要昂贵的价格
  • 从 0 到 1 开发图书管理系统:飞算 JavaAI 让技术落地更简单
  • Oracle MCP Server简单配置以及备份调用
  • Oracle EBS ERP接口开发 — 修复bug基本流程
  • Calcite自定义扩展SQL案例详细流程篇
  • Centos Docker 安装手册(可用)
  • el-table高度自适应vue页面指令
  • Mac中M系列芯片采用rbenv管理ruby版本
  • 板子指示灯状态设计
  • 2SA2016-TD-E ON安森美 功率晶体管 0.18Ω超低压降+30MHz高频 工业电源专用
  • C语言的指针
  • python采集拍立淘按图搜索API接口,json数据参考
  • 2.4.3-2.4.8控制成本-控制资源-监督沟通-监督干系人-监督风险-控制采购
  • 每日任务day0804:小小勇者成长记之药剂师的小咪
  • 断点续传Demo实现
  • 【目标检测基础】——yolo学习
  • 设备电机状态监测中的故障诊断与定位策略
  • HCIP笔记1
  • 微信小程序本地存储与Cookie的区别
  • 【node】如何开发一个生成token的接口
  • DolphinScheduler 集成DataX