【蓝桥杯嵌入式】点亮LED灯,流水灯的原理图解析与代码实现——STM32

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【蓝桥杯嵌入式】点亮LED灯,流水灯的原理图解析与代码实现——STM32

目录


看原理图

设置STM32CubeMX

配置文件

初始化LED函数

实例运用


正文


看原理图


可以看到控制LED灯的是PC8~PC15,由于图中最左边是VDD,也就是高电平控制的,所以当PC8~PC15为高电平的时候,LED亮,为低电平的时候,LED灭。同理PD2低电平关,高电平开

11.png


设置STM32CubeMX


打开我们已经建立好的工程(如何初始化STM32工程)中的STM32CubeMX


将PC8~PC15和PD2引脚设置为输出模式

22.png

然后点击红框中的System Core中的GPIO,在弹出来的中间界面中选中PC8~PC15,根据原理图的分析,我们将这些引脚置为高电平(high)。

33.png

同理,将PD2置为低电平(low)

44.png

然后右上角点击生成代码(GENERATE CODE)即可


配置文件


首先打开Keil5,新建两个文件,命名为led.c和led.h,并加入到我们的bsp文件中去。

然后再左侧工程文件右击,添加一个组(Add Group...)

55.png

创建成功后,双击红框中的bsp,找到你的bsp文件路径下的lcd.c,并添加进去

66.png

接下来我们要将我们写得bsp模块代码路径添加到默认路径中去


点击魔法棒,点击C/C++,根据图中数字引导,在第五步时将bsp的路劲添加进去即可(记得点OK 哦)

77.png


初始化LED函数


初始化一个函数前,我们首先要明白要将这个设备初始化成上面样子的,如LED灯,我们一般希望LED灯初始化后,是全部熄灭的,从这个角度来些代码


另外我们有时还希望初始化能集成一些其他功能,如LED的初始化,我们可以使它拥有点亮灯的功能,于是有如下代码(特别要理解第一句与第二句代码的关系哦):

/*
LED_Disp:全灭LED灯,然后点亮一个LED灯
    @dsLED:要点亮的LED灯,如dsLED==0x01,点亮LED1
*/
void LED_Disp(uchar dsLED)
{
  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);   //将GPIOC的所有引脚置为高电平,也就是LED初始化熄灭
  HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);     //因为控制LED灯是在8~15位,上面一句代码是默认前八位置0,所以我们左移8位,就能将GPIOC的8~15置为0了
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);     //初始化锁存器
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

这样,我们的初始化函数就写成啦,其中的参数设置为“0x01”,就是LED灯全熄灭了。


实例运用


现在我们来简单的写一个流水灯吧

如果理解了初始化代码中的第一句与第二句,我们就可以利用位运算来用更简单的代码实现流水灯了,以下是从左至右依次亮0.5秒,然后熄灭0.5秒:

/*
LED_liushui:实现LED灯流水
*/
void LED_liushui(void)
{
  int i = 1;
  while(1)
  {
    LED_Disp(i);
    HAL_Delay(500);
    LED_Disp(0x00);
    HAL_Delay(500);
    if(i == 128)
      i = 1;
    else
      i = i<<1;
  }
}
相关文章
|
5月前
|
C语言
蓝桥杯嵌入式零基础如何准备
蓝桥杯嵌入式零基础如何准备
|
3月前
|
传感器 芯片
嵌入式通信协议全解析:SPI、I²C、UART详解(附带面试题)
通信是指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递。从广义上来说,通信是指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法、任意媒质,将信息从某方准确安全地传送到另方。在出现电波传递通信后,通信被单一解释为信息的传递,是指由一地向另一地进行信息的传输与交换,其目的是传输消息。通信方式包括利用“电”来传递消息的电信,这种通信具有迅速、准确、可靠等特点,且几乎不受时间、地点、空间、距离的限制,因而得到了飞速发展和广泛应用。
537 0
|
4月前
|
Web App开发 传感器 Linux
【嵌入式软件工程师面经】STM32单片机
【嵌入式软件工程师面经】STM32单片机
82 1
|
4月前
|
存储 数据安全/隐私保护 芯片
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
|
5月前
|
网络安全 数据安全/隐私保护 计算机视觉
2024蓝桥杯网络安全-图片隐写-缺失的数据(0基础也能学会-含代码解释)
2024蓝桥杯网络安全-图片隐写-缺失的数据(0基础也能学会-含代码解释)
|
5月前
|
缓存 网络协议 算法
[蓝桥杯嵌入式]hal库 stm32 PWM的使用(随时修改占空比,随时修改频率)
[蓝桥杯嵌入式]hal库 stm32 PWM的使用(随时修改占空比,随时修改频率)
|
2月前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
2月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
56 6
|
19天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
23天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析

推荐镜像

更多
下一篇
无影云桌面