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

基于HAL库控制LED流水灯

一. 了解并掌握HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务:

1、重做上一个LED流水灯作业,用GPIO端口完成2只LED灯的周期闪烁。

2、接上,再用GPIO端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作。

二. 在没有示波器条件下,使用Keil的软件仿真逻辑分析仪功能观察LED管脚的时序波形,分析上面作业按键中断时,LED灯的波形变化情况。

文章目录

  • 一、安装 stm32CubeMX及项目创建
  • 二、GPIO端口完成2只LED灯的周期闪烁
    • 1、代码编写
    • 2、编译与烧录
  • 三、中断控制LED周期性闪烁
    • 1、创建项目
    • 2、代码编写
    • 3、编译和烧录
  • 四、使用Keil观察波形
    • 1、设置相关参数
    • 2、点击放大镜,选择逻辑分析仪->点击setup,选择要观察的引脚
    • 3、最终波形及分析
  • 总结
  • 参考资料

一、安装 stm32CubeMX及项目创建

参考资料:https://blog.csdn.net/weixin_56102526/article/details/120877293

二、GPIO端口完成2只LED灯的周期闪烁

这里用到的2只LED灯分别接PA5、PA6端口。

1、代码编写

在main.c文件的main函数下的while循环中,添加下面几行代码。

注意所有自己编写的代码请放在/* USER CODE BEGIN XXX / / USER CODE END XXX */之间;这样我们修改工程的时候你自己写的代码就不会被删除。

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);  // PA6亮HAL_Delay(1000); // 延时1sHAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);  // PA6灭HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);  // PA5亮HAL_Delay(1000); // 延时1sHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);  // PA5灭

2、编译与烧录

点击魔法棒

点击Debug->点击Settings

在这里插入图片描述

点击Flash Download->勾选Reset and Run->点击确定

在这里插入图片描述

将面包板与电脑连接,点击编译后,再点击load

在这里插入图片描述

最终的效果

在这里插入图片描述

三、中断控制LED周期性闪烁

设置PA5、PB9端口分别接一个LED灯,其次设置PA0接一个开关。设置LED灯初始状态为灭,即GPIO口初始化为高电平;因为当开关接高电平时,对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作,所以PA0口选择上升沿下降沿触发。这里设置一个变量n,当该变量为0时流水灯工作,当n为1时流水灯停止,而这个变量由中断函数内部控制,当检测到电平变化时,将n取反,0变1,1变0,实现整个过程。

1、创建项目

(1)选择芯片,STM32F103C8T6

在这里插入图片描述

在这里插入图片描述

(2)时钟RCC配置

在这里插入图片描述

(3)SYS配置

在这里插入图片描述

(4)GPIO配置

在芯片图中选择PA5、PB9为GPIO_Output,PA0设置为EXTI0_Line

在这里插入图片描述

点击左侧表格,设置PA5、PB9初始状态为High;选中PA0,将GPIO Mode设置为上升沿下降沿触发,将GPIO Pull-up/Pull-down设置为上拉电阻模式(Pull-up),别名设置为switch interrupt

(6)NVIC配置

勾选如图所示的中断方式

在这里插入图片描述

(7)时钟树配置

在这里插入图片描述

(8)设置工程名与工程路径
在这里插入图片描述

(9)设置工程文件,并导出

在这里插入图片描述
在这里插入图片描述

2、代码编写

定义全局变量

uint8_t n=0;

中断触发函数的设置

在Keil文件中的在Keil文件中的stm32f1xx_hal_gpio.c文件可以找到中断服务函数。HAL_GPIO_EXTI_Callback(GPIO_Pin)函数,此函数为回调函数,我们打开可以发现前面有个weak。

前面的 __weak 表示此函数为虚函数,需要用户重写的。

在这里插入图片描述

我们在main.c文件中找个地方重新写一下。

位置在main函数下方。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if( GPIO_Pin == switch_interrupt_Pin)//判断外部中断源{                                                                                                                                                                                                                                                                     n=!n;//转变n的状态}
}

在这里插入图片描述

在main.c文件的main函数下的while循环中,添加下面几行代码。

   switch(n){case 0:{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//PA4亮灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯HAL_Delay(1000);//延时1sHAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA4熄灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC15熄灯HAL_Delay(1000);//延时1s	break;}case 1:   {HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,1);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,1);break;}}

3、编译和烧录

步骤与上一个实验一致

烧录结果

HAL

四、使用Keil观察波形

1、设置相关参数

点击魔法棒->点击Debug

在这里插入图片描述

2、点击放大镜,选择逻辑分析仪->点击setup,选择要观察的引脚

点击右上角的添加输入:

输入PORTX.y回车,信号输入类型选择bit(X为GPIO口号,y为选择的引脚号)

在这里插入图片描述
在这里插入图片描述

3、最终波形及分析

在这里插入图片描述

由波形可知,一个波形的变化约为1s,与我们预期设计一致。

总结

这次HAL库点灯实验,相比于标准库和寄存器,它的编写显得更加简单。提高了动手能力,也对中断函数的应用更加熟练。

参考资料

https://blog.csdn.net/m0_63650001/article/details/133896352

https://blog.csdn.net/weixin_55376063/article/details/127414616

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

相关文章:

  • 利用kubeadm安装k8s集群 以及跟harbor私有仓库下载镜像
  • 明天(周六)下午!武汉Linux爱好者线下沙龙,我们在华中科技大学等你!
  • MySQL主从复制(五):读写分离
  • 阿里巴巴 EasyExcel 真正的高效与通用导入(亿级数据秒级导入)
  • 32.5k star!!替换 postman?【送源码】
  • 课时135:awk实践_逻辑控制_综合实践
  • c++ 读取MNIST数据集实现softmax回归
  • JS-04何为继承以及实现方式
  • 6款网站登录页(附带源码)
  • spring boot打的包直接运行
  • 移除元素-力扣
  • 代码随想录算法训练营第三天| 203.移除链表元素、 707.设计链表、 206.反转链表
  • 【题解】AB33 相差不超过k的最多数(排序 + 滑动窗口)
  • LSPatch免root手机模块应用
  • 深入解析kube-scheduler的算法自定义插件
  • java原型模式 (Prototype Pattern) 介绍
  • LLama3 | 一. 本地 Web Demo 部署
  • MariaDB 给指定列值自动加密(持久数据加触发器)
  • 深入理解Linux系统管理与网络配置高级指南
  • 朴素贝叶斯+SMSSpamCollections
  • 【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
  • 深度神经网络详解
  • MYSQL 数据迁移利器 MYSQLSH
  • 【MYSQL】分数排名
  • 【论文笔记】| 蛋白质大模型ProLLaMA
  • MySQL笔记第一天(从小白到入门)
  • 初识Qt:从Hello world到对象树的深度解析
  • 多维数据库创建
  • win11安装docker运行Open-Webui 界面化展示 ollama大模型
  • 网络模型-PoE技术