基于HAL库的LED流水灯

基于HAL库的LED流水灯

一、实验要求:

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

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

2、用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。

(二)在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。

请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。

二、安装STM32CubeMX

1.安装JAVA环境

官网链接:https://www.java.com/zh_CN/download/windows-64bit.jsp
在这里插入图片描述
打开JAVA安装包,勾选可更改目标文件,之后安装
在这里插入图片描述
选择合适的地址,之后下一步
在这里插入图片描述
接下来等待自动安装,安装完成之后关闭。
在开始菜单中进入所用应用,如果有“Java”即表明安装成功
在这里插入图片描述

2.安装CubeMX

网盘链接:https://pan.baidu.com/s/1frqRAUOwO3TgyleixRWNYw?pwd=1q3b
提取码:1q3b
打开安装好的压缩包,点击“Next”
在这里插入图片描述
勾选“I accept”,然后“Next”
在这里插入图片描述
勾选第一个,然后Next
在这里插入图片描述
之后选择合适的路径,若路径未创建会提示路径将被创建,点击确定即可
在这里插入图片描述
根据需求这两个都进行勾选,之后Next
在这里插入图片描述
之后程序自动进行安装。点Next即可。STM32CubeMX安装成功,接下来就可以使用它了。

3.安装相应的库

打开安装好的STMCubeMX,点击Help,选择“Manage embedded software packages”
在这里插入图片描述
勾选要安装的STM32F1的HAL库,由于我没有登录,所以这里的Install前有一个警示,登录之后就可以正常下载了。
在这里插入图片描述
下载完成之后选择的库前出现绿色标识符。
在这里插入图片描述

三、使用HAL库实现流水灯

1.配置HAL库

下面新建项目,点击“ACCESS TO MCU SELECTOR”进入新建项目在这里插入图片描述
在搜索框输入“STM32F103C8T6”,之后双击对应选项
在这里插入图片描述
设置RCC为“Cystal/Ceramic Resonator”
在这里插入图片描述
之后设置我们的GPIO口,这里我选择的是A0、A2和B6,将它们设置为GPIO_Output
在这里插入图片描述
输出设置为推挽输出
在这里插入图片描述
接下来配备APB2时钟
在这里插入图片描述
为项目命名并选择适当的存储路径,将Toolchain/IDE设置为MDK-ARM
在这里插入图片描述
导出文件可以选择导出所有文件也可以选择只导出必要文件,只是所有文件编译时耗时会更久,之后Generated file勾选.c/,h选项
在这里插入图片描述
最后导出代码即可
在这里插入图片描述

2.编译程序实现LED流水灯

找到CubeMX建立项目存储的位置,进入"MDK-ARM"文件夹,点击project进入Keil
在这里插入图片描述
进入Keil的项目中,找到main.c,该文件中已经将各端口初始化完成,我们直接在while(1)循环中编写我们需要的指令即可
在这里插入图片描述

while(1)中的代码:

while (1)
  {
    /* USER CODE END WHILE */
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0 ,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2 ,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6 ,GPIO_PIN_SET);
	  HAL_Delay(400);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0 ,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2 ,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6 ,GPIO_PIN_SET);
	  HAL_Delay(400);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0 ,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2 ,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6 ,GPIO_PIN_RESET);
	  HAL_Delay(400);
	  

    /* USER CODE BEGIN 3 */
  }
  • HAL_GPIO_WritePin():这是HAL库提供的功能,它抽象了STM32微控制器上的低级硬件访问,它用于控制 GPIO
    引脚的状态,第一个参数为选择GPIO端口,第二个参数为GPIO引脚号,第三个参数为设置引脚的状态。
  • GPIO_PIN_RESET:这是引脚设置的状态。在许多微控制器库中,通常表示低逻辑电平,这意味着引脚设置为0V或地。
  • GPIO_PIN_SET:表示引脚被设置为高逻辑电平,这意味着它被设置为电源电压电平。在大多数情况下,这将打开或激活引脚,这对于打开
    LED、激活继电器或控制连接到 GPIO 引脚的其他数字设备等任务非常有用。

3.硬件实现:

四、使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形

具体使用Keil软件仿真逻辑分析仪的方式在上一篇文章中详细讲述,在此不再赘述。
根据分析波形,提取一个低电平持续的时间即为代码中Delay的时间,经过计算为0.41s,几乎接近程序中的时间。
在这里插入图片描述

五、使用中断控制LED灯亮灭

1.配置STM32Cube

该配置方式与实现LED灯闪烁大致相同,下面在LED灯闪烁的基础上进行修改:设置一个端口为“EXTI5”,这里选取的GPIOB_5
在这里插入图片描述
首先将各个GPIO端口取不同的名字,有助于编写程序汇总接收端口的信息,之后将B5的中断方式设置为上升沿触发
在这里插入图片描述
接下来配置NVIC,勾选中断选项
在这里插入图片描述
在SYS中勾选Serial Wire,如果遇到该选项无法勾选的情况,检查是否已经设置的端口占用了Serial Wire,由于我一开始选择了A13为GPIO_Output,所以无法勾选该选项,更改端口将A13空出便可以勾选了。
在这里插入图片描述
配备时钟:
在这里插入图片描述
其他操作均与上方配置LED流水灯的操作相同,最后导出程序在Keil编写程序即可

2.编写程序

打开gpio.c程序,在第546行找到HAL_GPIO_EXIT_IRQHandler()函数,复制该函数中的“HAL_GPIO_EXIT_Callback()”函数,粘贴到main.c调用
在这里插入图片描述

设置了指定 GPIO 引脚的中断标志:

 if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)

该函数用于读取给定引脚的 EXTI 中断状态。如果设置了该标志(不等于零),则表示该引脚上发生了中断事件。
如果设置了中断标志,则此行将清除指定 GPIO 引脚的中断标志。

__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);

清除中断标志后,此行调用回调函数并作为参数传递。通常在此处定义自定义代码以处理特定于 GPIO 引脚的中断事件。

HAL_GPIO_EXTI_Callback(GPIO_Pin);

综上:HAL_GPIO_EXIT_Callback()中代码:

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

中断程序编译完成,while中不需要添加代码即可实现中断,当端口电平变化时,程序进入中断控制LED灯

3.硬件实现

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值