使用Cube实现流水灯,并采用中断控制流水灯亮灭

本文介绍了使用STM32F103开发板通过CubeMx和KeilMDK实现LED流水灯的基本操作,包括GPIO配置、代码编写、烧录程序,以及中断控制流水灯和使用示波器观察波形。后续章节演示了如何用中断控制单个LED灯的亮灭。
摘要由CSDN通过智能技术生成

实验软件:CubeMx,KeilMDK,mcuisp
实验管脚:PA1,PB1,PB10
实验材料:若干LED,若干跳线,一个面包板,一个F103C8T6,一个USB转TTL

1、Cube点亮流水灯

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

1.1、安装Cube

安装教程可参考:https://blog.csdn.net/as480133937/article/details/98885316

1.2、新建工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选择PA1,PB1,PB10
在这里插入图片描述
配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,我们要用是GPIO接口,而这些接口都在APB2里,APB2外设由HSE控制,所以将HSE设置为外部晶振。
在这里插入图片描述
(为啥要这样配置?)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后点击generate即可
在这里插入图片描述
在生成的工程文件的main.c循环中编写你的代码即可

1.3、代码编写

我的代码如下(采用的PA1,PB1,PB10):

while (1)
  {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
	  HAL_Delay(1000);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
	  HAL_Delay(1000);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);
	  HAL_Delay(1000);
  }

1.4、烧录程序

(为啥要选择DTR低电平复位,RTS高电平进BootLoader)
在这里插入图片描述

1.5、运行效果

在这里插入图片描述

2、中断控制流水灯

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

2.1、新建工程

与上述差不多一样,只是需要多选择一个管脚进行中断配置
选择PA3作为开关
在这里插入图片描述
在这里插入图片描述
使能中断
在这里插入图片描述

2.2、重写中断回调函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == SWITCH_Pin){
  //获取A3的电位,如果是低电平就一直死循环,使流水灯停止工作
	    while(HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin)==GPIO_PIN_RESET){}
  }
}

主循环还是流水灯代码:

while (1)
  {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
	  HAL_Delay(1000);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
	  HAL_Delay(1000);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);
	  HAL_Delay(1000);
  }

2.3、运行效果

在这里插入图片描述

3、示波器观察波形图

在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。

详细操作可查看https://blog.csdn.net/wakeup_high/article/details/133828393?spm=1001.2014.3001.5502中的示波器部分

点击魔法棒
在这里插入图片描述
点击Debug->Logic Analyzer->配置引脚(可直接输入PORTX.X再按Enter键)
在这里插入图片描述
波形:
在这里插入图片描述
可见周期在1s左右,高电平灯亮,低电平灯灭。

4、中断控制一个灯亮灭

PA4作为LED灯
PA5为按钮

配置过程和上述类似
中断回调函数重写:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == SWITCH_Pin){
	  GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port, SWITCH_Pin);
	  
	  if(pinState == GPIO_PIN_RESET){
		  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
	  }else{
		  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
	  }
  }
}

运行效果:
在这里插入图片描述

参考:
https://www.cnblogs.com/cqjtu-linzd/articles/17779241.html#3-中断模式控制流水灯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值