3.2 LED闪烁/LED流水灯/蜂鸣器
一、LED 闪烁电路
1.1 硬件电路搭建
准备材料:STM32 最小系统板、面包板、跳线、LED、ST - LINK。
搭建步骤:

将面包板正极红线朝上,插入 STM32 最小系统板,注意留出相应孔位。
用跳线将最小系统板的正负极引到面包板供电引脚,使上下四排供电引脚获取电源。
按照银角标识符将 ST - LINK 连接到最小系统板,注意引脚顺序。
将 LED 长角(正极)接到正极供电孔,短角(负极)接到 PA0 端口,采用低电平点亮方式。
1.2 代码实现
开启 GPIO 时钟:调用
RCC_APB2PeriphClockCmd()函数,选择RCC_APB2Periph_GPIOA,使能 GPIOA 时钟。初始化 GPIO 口:定义一个
GPIO_InitTypeDef结构体变量,给结构体成员赋值,选择GPIO_Mode_Out_PP(推挽输出)、GPIO_Pin_0(PA0 端口)、GPIO_Speed_50MHz(输出速度 50 兆赫兹),调用GPIO_Init()函数完成初始化。GPIO_Mode GPIO工作模式 GPIO_Mode_AIN模拟输入(Analog In) GPIO_Mode_IN_FLOATING浮空输入 GPIO_Mode_IPD下拉输入(In Pull Down) GPIO_Mode_IPU上拉输入(In Pull Up) GPIO_Mode_Out_OD开漏输出(Out Open Drain) GPIO_Modr_Out_PP推挽输出(Out Push Pull) GPIO_Mode_AF_OD复用开漏输出(Alternate Function Open Drain) GPIO_Mode_AF_PP复用推挽输出(Alternate Function Push Pull) 控制 GPIO 口输出:在主循环中,使用
GPIO_ResetBits()将 PA0 设置为低电平点亮 LED,使用GPIO_SetBits()将 PA0 设置为高电平熄灭 LED。另外也可以使用GPIO_BitWrite()实现相同的效果。添加延时代码: 为了实现 LED 闪烁,主循环中需要有延时。延时函数可以从
程序源码\STM32Project-有注释版\1-3 Delay函数模块获取,将其添加到工程中,在main.c中包含头文件#include "delay.h",然后调用delay_ms()进行延时。
#include "stm32f10x.h" // Device header
#include "delay.h" //延时函数
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while(1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
Delay_ms(500);
GPIO_SetBits(GPIOA, GPIO_Pin_0);
Delay_ms(500);
/*
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
Delay_ms(500);
*/
}
}循环中也可以用下方的代码实现相同的效果:
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(1));
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(0));
Delay_ms(500);注意
注意这里不能直接使用 1 或 0,因为 1 和 0 是整数,而 BitAction 是枚举类型,需要使用 (BitAction)(1) 或 (BitAction)(0) 进行强制类型转换。
二、LED 流水灯电路
2.1 硬件电路搭建
准备材料:八个 LED、面包板、跳线、STM32 最小系统板。
搭建步骤:

将八个 LED 正极都插到正极供电孔。
负极依次插到 PA0 到 PA7 端口。
2.2 代码实现
初始化部分:与 LED 闪烁类似,开启 GPIOA 时钟,初始化 GPIOA 端口,但需将 GPIO_Pin 设置为 GPIO_Pin_All(或使用按位或操作选择 PA0 到 PA7 端口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | … | GPIO_Pin_7),将 8 个端口全部配置为推挽输出模式。
主循环部分:使用 GPIO_Write() 函数,根据不同的输出数据寄存器值 (GPIOx_ODR) ,实现 LED 依次点亮的流水灯效果。例如,先输出 0x0001(对应二进制 0000 0000 0000 0001,即 GPIO_Pin_0 高电平),延时后输出 0x0002(对应二进制 0000 0000 0000 0010,即 GPIO_Pin_1 高电平),以此类推,由于是低电平点亮,还需要用按位取反~的操作 。
#include "stm32f10x.h" // Device header
#include "delay.h" //延时函数
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while(1)
{
GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001
Delay_ms(500);
GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010
Delay_ms(500);
GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100
Delay_ms(500);
GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000
Delay_ms(500);
GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000
Delay_ms(500);
GPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000
Delay_ms(500);
GPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000
Delay_ms(500);
GPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000
Delay_ms(500);
}
}三、蜂鸣器电路
3.1 硬件电路搭建
准备材料:蜂鸣器模块、三根公对母杜邦线、STM32 最小系统板。
搭建步骤:

将杜邦线带孔一端插在蜂鸣器上,VCC 接正极,VDD 接地,用于控制的 I/O 口插在 PB12 号口。
3.2 代码实现
初始化部分:开启 GPIOB 时钟,将 PB12 端口初始化为推挽输出模式,速度 50 兆赫兹。
主循环部分:在主循环中,通过改变 PB12 端口的电平控制蜂鸣器,添加延时控制蜂鸣器的频率。
#include "stm32f10x.h" // Device header
#include "delay.h" //延时函数
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while(1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
Delay_ms(100);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
Delay_ms(100);
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
Delay_ms(100);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
Delay_ms(700);
}
}