目录
一、功能实现及接线图
1.功能实现
2.接线图
二、代码详解
1.预处理命令:
2.启用GPIO时钟
3. 结构体函数
4.功能程序
三、完整程序及示例
1.完整程序
2.演示视频:
在STM32上配置GPIO引脚,然后通过循环控制这些引脚的状态,实现了LED1,LED2,LED3的接替闪烁效果 。
配置:stm32f103c8主芯片,Keil uVision5编程软件。
#include "stm32f10x.h"
#include "Delay.h"
int main(void)
{
#include "stm32f10x.h"
:这行代码告诉编译器在编译时要包含名为“stm32f10x.h”的头文件。
在stm32的嵌入式开发中,通过包含这个头文件,我们可以访问和操作STM32微控制器的寄存器、宏定义等硬件功能。
#include "Delay.h"
:这行代码告诉编译器在编译程序时包含名为 "Delay.h" 的头文件。这个头文件是自定义头文件,包含与延时操作相关的函数。在嵌入式开发中,延时操作经常用于生成精确的时间间隔或控制外部设备的时序。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
启用GPIOA时钟的具体操作通常使用RCC_APB2PeriphClockCmd函数完成。
程序的意思是,启用GPIOA外设端口,便于后续程序使用GPIOA 0~15端口。
点击详细了解RCC模块的外设使能功能
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitTypeDef
是一个结构体类型,用于配置STM32微控制器的GPIO(通用输入输出)端口的初始化参数。
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); // 将引脚0置低
GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_3, (BitAction)1);
令GPIOA的pin0输出状态为低电平(Bit_RESET或(BitAction)0),pin1和pin3的输出状态为高电平(Bit_SET或(BitAction)1).
完整功能代码:
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); // 将引脚0置低
GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_3, (BitAction)1); // 将引脚1和3置高
Delay_ms(1000); // 延时1秒
GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)0); // 将引脚1置低
GPIO_WriteBit(GPIOA, GPIO_Pin_0 | GPIO_Pin_3, (BitAction)1); // 将引脚0和3置高
Delay_ms(1000); // 延时1秒
GPIO_WriteBit(GPIOA, GPIO_Pin_3, (BitAction)0); // 将引脚3置低
GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_0, (BitAction)1); // 将引脚1和0置高
Delay_ms(1000); // 延时1秒
通过延时函数,GPIOA的pin0、pin1、pin3输出状态保持1s,1s后再次改变三个端口的输出状态。
pin0 | pin1 | pin3 | WLED | GLEND | RLED | |
---|---|---|---|---|---|---|
0~1s | 0 | 1 | 1 | 亮 | 灭 | 灭 |
1~2s | 1 | 0 | 1 | 灭 | 亮 | 灭 |
2~3s | 1 | 1 | 0 | 灭 | 灭 | 亮 |
因GPIOA的pin0、pin1、pin3分别于WLED、GLEND、RLED的负极端连接,所以pin0、pin1、pin3分别输出低电平时,对应的led灯亮。
将完整程序写入死循环,可以实现流水灯的最终状态了。
#include "stm32f10x.h"
#include "Delay.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 启用GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置GPIO引脚为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3; // 设置GPIO引脚0、1和3
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置GPIO输出速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
GPIO_WriteBit(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3, (BitAction)0); // 将引脚0、1和3置低
while (1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); // 将引脚0置低
GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_3, (BitAction)1); // 将引脚1和3置高
Delay_ms(1000); // 延时1秒
GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)0); // 将引脚1置低
GPIO_WriteBit(GPIOA, GPIO_Pin_0 | GPIO_Pin_3, (BitAction)1); // 将引脚0和3置高
Delay_ms(1000); // 延时1秒
GPIO_WriteBit(GPIOA, GPIO_Pin_3, (BitAction)0); // 将引脚3置低
GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_0, (BitAction)1); // 将引脚1和0置高
Delay_ms(1000); // 延时1秒
}
}
流水灯演示视频
可以根据需求,增加LED灯的数量,代码的编写与上示原理一样。
延时函数资料:(转载)