您现在的位置是:首页 >技术杂谈 >STM32-流水灯实验网站首页技术杂谈

STM32-流水灯实验

Boshevilk 2025-03-22 12:01:03
简介STM32-流水灯实验

流水灯实验需要用到多个引脚,所以我们要清楚哪些引脚可用,哪些引脚不可用,以下是STM32f103c8t6的引脚功能和复用功能,其中PB2,PA13,PA14,PA15,PB3,PB4有特殊功能
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里,我们使用PA0,PA1,PA2,PA3,PA4,来控制led灯的亮灭。
先将导线连接。如下图
注意,led灯的长脚为正极,短脚为负极。
如图:

分析:长脚由芯片引脚控制,短脚接电源负极,即当引脚输出高电平时,led亮,当引脚输出低电平时,灭。故使用推挽输出模式。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void){
	//先开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//定义结构体
	GPIO_InitTypeDef GPIO_Init_Struct;
	//赋值
	GPIO_Init_Struct.GPIO_Mode = GPIO_Mode_Out_PP ;//使用推挽输入输出
	GPIO_Init_Struct.GPIO_Pin = 0x1F;//将pa0,1,2,3,4全部开通
	GPIO_Init_Struct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA ,&GPIO_Init_Struct);
	
    //实现流水灯操作,led正极连接引脚,负极接地,使用推挽输出,即将数据寄存器写入1,引脚输出高电平,点亮led,反之熄灭。
	uint16_t val = 0x0010;//这里初始化一个数
	while(1){
		for(int i = 0; i < 5; i++){
			//循环点亮PA0-4
			GPIO_Write(GPIOA, val);
			val >>= 1;//将val右移一位
			Delay_Ms(100);
		}
		val = 0x0010;//再将val初始化
    }
}

这里有个难点,即val右移一位代表什么意思
0x0010展开即0000 0000 0001 0000,代表我要将PA4引脚的数据输出寄存器写1,即PA4引脚输出高电平,其他引脚输出低电平,那么就会点亮连接PA4引脚的LED灯,其他的LED灯熄灭。
右移一位即变为 0000 0000 0000 1000,代表我要将PA3引脚的数据输出寄存器写1,即PA4引脚输出高电平,其他引脚输出低电平,那么就会点亮连接PA3引脚的LED灯,其他的LED灯熄灭。
。。。
一直循环5次,依次点亮剩余灯。
由于在while循环内部,所以这样的操作一直会执行。造成流水灯的现像。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。