一、前言
承接上一篇单LED闪烁实验,今天在原有工程基础上修改代码,实现流水灯效果。
目前我依旧是刚入门阶段,不会复杂封装和工程分层,所有代码直接写在main.c里,写法直白简单,用来巩固多GPIO引脚同时控制的知识点。自身基础薄弱,文中有错误欢迎各位大佬指正。
二、实验目标
- 掌握同时配置多个GPIO输出引脚;
- 学会通过循环实现灯光依次点亮、流动的流水效果;
- 对比单灯闪烁,理解批量控制引脚的思路。
三、本地工程真实结构
使用文件夹内 [1-2]LED流水灯 工程,目录结构和上次点灯完全一致,没有额外Hardware驱动文件夹:
- Start:芯片底层启动文件,无需修改;
- Library:STM32标准外设库;
- System:系统时钟、毫秒延时函数;
- User:唯一编写主程序main.c的目录,所有逻辑直接写在这里。
四、硬件简单说明
- 开发板4路LED分别接 PC13、PC14、PC15、PB0 引脚;
- 引脚输出低电平LED点亮,高电平熄灭;
- 每一路LED都串联220Ω限流电阻,防止电流过大烧毁灯珠。
五、完整基础代码
#include"stm32f10x.h"// Device header#include"delay.h"intmain(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);while(1){GPIO_Write(GPIOA,~0x0001);//0000 0000 0000 0001Delay_ms(500);GPIO_Write(GPIOA,~0x0002);//0000 0000 0000 0010Delay_ms(500);GPIO_Write(GPIOA,~0x0004);//0000 0000 0000 0100Delay_ms(500);GPIO_Write(GPIOA,~0x0008);//0000 0000 0000 1000Delay_ms(500);}}六、粗浅学习感悟
1. 控制多个端口时,开启时钟可以用 | 符号一次性开启多个外设时钟,不用重复写函数;
2. 同一个端口多个引脚,同样能用 | 拼接在一起统一初始化,简化代码;
3. 流水灯最基础写法就是逐个点亮、延时、熄灭,逻辑很好理解;
4. 现在这种逐行写法比较繁琐,后续学会数组和循环后可以简化代码。