首页 > 其他分享 >STM32 实现流水灯(基于 STM32F103C6T6 + HAL 库)

STM32 实现流水灯(基于 STM32F103C6T6 + HAL 库)

时间:2024-11-28 15:10:54浏览次数:5  
标签:HAL PIN WritePin STM32 STM32F103C6T6 GPIO LED PORT

一、硬件准备

1. STM32F103C6T6A + STLink 仿真器

2. LED 3 只

3. 杜邦线若干(20条以内)

4. 面包板一块

5. 立式微动开关 2 只


二、线路连接

1. STM32 核心板 PA4 PA5 PA6 分别接三只 LED

2. PB5 PB6 分别接两个开关一端

3. 保证所有开关、LED 负极与核心板共地


三、端口配置

1. PA4 PA5 PA6 设置为输出

2. PB5 PB6 设置为输入


 

四、代码编写

1. led.h

 1 #ifndef __LED_H
 2 #define __LED_H
 3 
 4 #define LED1_RED_PIN GPIO_PIN_4
 5 #define LED2_YELLOW_PIN GPIO_PIN_5
 6 #define LED3_GREEN_PIN GPIO_PIN_6
 7 
 8 #define LED_PORT GPIOA
 9 
10 #endif // !__LED_H

2. key.h

1 #ifndef __KEY_H
2 #define __KEY_H
3 
4 #define KEY1_DOWN_PIN GPIO_PIN_5
5 #define KEY2_UP_PIN GPIO_PIN_6
6 
7 #define KEY_PORT GPIOB
8 
9 #endif // !__KEY_H

按键功能是亮灯方向向上或向下,当两键同时按下,则亮所有灯。

这里两个头文件仅是用于改变量名,源文件仍可进行优化。

3. 修改 GPIO 初始化函数,将 PB5 PB6 的电平设置为 GPIO_PULLUP。

意思是保持高电平状态,当按键按下,相当于端口接地,电平被拉低,所以检测到输入低电平时表示按键动作。

4. 主函数初始化部分:

1 unsigned char ch_flow = 2U;
2 const unsigned int uint_delay = 250U;
3 HAL_GPIO_WritePin(LED_PORT, LED2_YELLOW_PIN, GPIO_PIN_SET);

line1 中定义 ch_flow 是用于代表当前是第几个灯亮,2 代表第二个灯亮,故 line3 中将第二个灯的端口设为高电平。

line2 设置延时消抖,如果不设置延时或延时过低,就会造成操作过度响应,反之则会响应变慢。

5. 主函数循环部分:

 1 GPIO_PinState down_key_state = HAL_GPIO_ReadPin(KEY_PORT, KEY1_DOWN_PIN);
 2 GPIO_PinState up_key_state = HAL_GPIO_ReadPin(KEY_PORT, KEY2_UP_PIN);
 3 // two key pressed at same time
 4 if (GPIO_PIN_RESET == (up_key_state | down_key_state))
 5 {
 6     HAL_GPIO_WritePin(LED_PORT, LED1_RED_PIN, GPIO_PIN_SET);
 7     HAL_GPIO_WritePin(LED_PORT, LED2_YELLOW_PIN, GPIO_PIN_SET);
 8     HAL_GPIO_WritePin(LED_PORT, LED3_GREEN_PIN, GPIO_PIN_SET);
 9     HAL_Delay(uint_delay);
10     continue;
11 }
12 // flow down
13 if (GPIO_PIN_RESET == down_key_state)
14 {
15     switch(ch_flow)
16     {
17         case 1U:
18             HAL_GPIO_WritePin(LED_PORT, LED1_RED_PIN, GPIO_PIN_RESET);
19             HAL_GPIO_WritePin(LED_PORT, LED2_YELLOW_PIN, GPIO_PIN_SET);
20             ch_flow = 2U;
21             HAL_Delay(uint_delay);
22             continue;
23         case 2U:
24             HAL_GPIO_WritePin(LED_PORT, LED2_YELLOW_PIN, GPIO_PIN_RESET);
25             HAL_GPIO_WritePin(LED_PORT, LED3_GREEN_PIN, GPIO_PIN_SET);
26             ch_flow = 3U;
27             HAL_Delay(uint_delay);
28             continue;
29         case 3U:
30             HAL_GPIO_WritePin(LED_PORT, LED3_GREEN_PIN, GPIO_PIN_RESET);
31             HAL_GPIO_WritePin(LED_PORT, LED1_RED_PIN, GPIO_PIN_SET);
32             ch_flow = 1U;
33             HAL_Delay(uint_delay);
34             continue;
35     }
36 }
37 // flow up
38 if (GPIO_PIN_RESET == up_key_state)
39 {
40     switch(ch_flow)
41     {
42         case 3U:
43             HAL_GPIO_WritePin(LED_PORT, LED3_GREEN_PIN, GPIO_PIN_RESET);
44             HAL_GPIO_WritePin(LED_PORT, LED2_YELLOW_PIN, GPIO_PIN_SET);
45             ch_flow = 2U;
46             HAL_Delay(uint_delay);
47             break;
48         case 2U:
49             HAL_GPIO_WritePin(LED_PORT, LED2_YELLOW_PIN, GPIO_PIN_RESET);
50             HAL_GPIO_WritePin(LED_PORT, LED1_RED_PIN, GPIO_PIN_SET);
51             ch_flow = 1U;
52             HAL_Delay(uint_delay);
53             break;
54         case 1U:
55             HAL_GPIO_WritePin(LED_PORT, LED1_RED_PIN, GPIO_PIN_RESET);
56             HAL_GPIO_WritePin(LED_PORT, LED3_GREEN_PIN, GPIO_PIN_SET);
57             ch_flow = 3U;
58             HAL_Delay(uint_delay);
59             break;
60     }
61 }

五、测试运行

1. 通过单独按任意一个键向某一方向流动亮灯的功能

2. 同时按住两个按键将三个灯全部点亮的功能


 

标签:HAL,PIN,WritePin,STM32,STM32F103C6T6,GPIO,LED,PORT
From: https://www.cnblogs.com/eternalmoonbeam/p/18572685

相关文章

  • 2-STM32F103+ESP8266+EC800K(移远4G Cat1)--整体运行测试-Android和微信扫码绑定EC800
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/EC800K/my.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p> 说明(这节使用最新......
  • STM32cubeMX配置FreeRTOS生成代码--完成一个简单测试(Led闪烁和向串口发送“hello!world
    一、STM32cubeMX中相关配置(首先我用的STM32板子是STM32F103VBT6,板子不同,配置会略有不同,仅作参考!)打开STM32cubeMX,新建工程,选择对应板子型号:1.配置微控制器的时钟系统HighSpeedClock(HSE):高速时钟源,这里选择的是“Crystal/CeramicResonator”,意味着使用外部晶体......
  • STM32之串口232通讯
    STM32F407系列文章-RS232通讯(六)文章目录前言一、串口(UART)二、RS23-硬件特性三、RS232-程序实现1.函数rs232_init()2.函数USART_UX_IRQHandler()3.函数rs232_send_data()4.函数rs232_receive_data()5.函数rs232_receive_data()总结前言一般STM32F407芯片都会......
  • Halcon深度图高度测量
    1,简介深度图测量高度原理1):拟合平面2):消除相机坐标系对物体表面倾斜的影响3):将高度图像的域缩小到给定的高度范围。4):获取区域灰度值 也就是高度read_image(DistanceImage,'E:/项目/3D测高/高度/20244927-044910003.tif')get_image_size(DistanceImage,Width1,He......
  • STM32——GPIO
    目录一、基础知识      (一)基本特性                        数字和模拟信号                        IO端口基本结构      (二)引脚配置       多路复用——基于stm32f103       引......
  • 26 基于STM32的智能门禁系统(指纹、蓝牙、刷卡、OLED、电机)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STM32单片机,六个按键,分别代表指纹、蓝牙、刷卡的正确进门与错误进门;比如第一个按键按下,表示指纹正确,OLED显示指纹正确,开门,第二个按键按下的话,则指纹错误,OLED显示指纹错误,请重试,第二个按键连......
  • STM32和STM8开发工具、常用软件和开发环境汇总
    文章目录一、前言二、KeilC51软件三、KeilMDK-ARM四、STM32CubeMX及HAL库五、STM32CubeIDE六、STM8CubeMX七、STM32ST-LINKUtility一、前言整理一些常见的STM32/STM8开发所需要的安装包和工具。可以分别去官网下载最新的安装包。也可以通过关注【小康师兄】......
  • STM32 cubeIDE 可执行文件 *.elf 的烧录
    1.准备工具:ST_LINKST-Link/V2 JTAG/SWD标准的接口排列:2.用杜邦线连接单片机3.开始烧录方法1:Ctrl+B编译项目成功后,右键项目名-Runas- STM32 C/C++Application方法2:Ctrl+B编译项目成功后,点击RunDebug按钮,直接烧录。当有多个程序时,默认烧写最近烧录过的程序,点击......
  • 除Keil和IAR之外的STM32开发环境
    3.STM32CubeIDESTM32CubeIDE是ST公司针对STM32推出的一款集成开发环境。 官网地址:https://www.st.com/stm32cubeide1.优点ST官方软件,对STM32开发很友好。基于Eclipse工具链,界面更现代化。免费、免费、免费。2.缺点仅限STM32,不支持其他厂家单片机。推出时间不长,存在一......
  • stm32 CRC32实现代码及软硬方式测试
    一、概叙:1、本文主要是针对常用的crc32的实现方式进行说明2、crc32的软件方式和硬件方式时间上的差异二、实现:1、软件实现代码1/***@brief软件crc32计算*@paramptr输入的32位数组*@paramlen32位数组的长度*@returnu32......