STM32_LED相关
STM32_LED相关











1、测试程序——点亮LED灯
#include "stm32f10x.h" // Device header
int main()
{
// 开启GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 设置GPIOC Pin_13端口结构体
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 通用输出推挽模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
// 初始化GPIOC Pin_13
GPIO_Init(GPIOC, &GPIO_InitStructure);
//GPIO_SetBits(GPIOC, GPIO_Pin_13); // 设置高电平 —> LED熄灭
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 设置低电平 —> LED点亮
while(1)
{
}
}
| Out_PP | 推挽输出,强驱动 | LED、继电器 |
|---|---|---|
| Out_OD | 开漏输出,需上拉 | I2C、多设备总线 |
| IN_FLOATING | 浮空输入 | 按键、开关 |
| IN_PULL | 上拉/下拉输入 | 确定默认电平 |


2、GPIO程序——LED灯闪烁
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main()
{
// 开启GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 设置GPIOC Pin_13端口结构体
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 通用输出推挽模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
// 初始化GPIOC Pin_13
GPIO_Init(GPIOC, &GPIO_InitStructure);
while(1)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 设置低电平 —> LED点亮
Delay_ms(500);
GPIO_SetBits(GPIOC, GPIO_Pin_13); // 设置高电平 —> LED熄灭
Delay_ms(500);
}
}
延时函数部分
Delay.c
#include "stm32f10x.h"
/**
* @brief 微秒级延时
* @param xus 延时时长,范围:0~233015
* @retval 无
*/
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
/**
* @brief 毫秒级延时
* @param xms 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
/**
* @brief 秒级延时
* @param xs 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
Delay.h
#ifndef __DELAY_H
#define __DELAY_H
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);
#endif
3、GPIO程序——LED流水灯

根据原理图,也可以设置为开漏模式点亮LED灯。

PCB板是我自己画的,根据STM32F103C8T6引脚定义,PC14、PC15连接的是STM32低速晶振,当时设计时没有考虑周全,但在实际测试中这两个端口可以正常使用。
1)[较繁琐]第一种方式:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main()
{
// 开启GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 设置GPIOC Pin_13端口结构体
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; // 通用输出开漏模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
// 初始化GPIOC Pin_13
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); // GPIO配置完成后,默认低电平点亮所有LED,这里将其熄灭
while(1)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 设置低电平 ->开漏模式VSS —> LED点亮
Delay_ms(500);
GPIO_SetBits(GPIOC, GPIO_Pin_13); // 设置高电平 ->开漏模式高阻抗 —> LED熄灭
GPIO_ResetBits(GPIOC, GPIO_Pin_14); // 设置低电平 ->开漏模式VSS —> LED点亮
Delay_ms(500);
GPIO_SetBits(GPIOC, GPIO_Pin_14); // 设置高电平 ->开漏模式高阻抗 —> LED熄灭
GPIO_ResetBits(GPIOC, GPIO_Pin_15); // 设置低电平 ->开漏模式VSS —> LED点亮
Delay_ms(500);
GPIO_SetBits(GPIOC, GPIO_Pin_15); // 设置高电平 ->开漏模式高阻抗 —> LED熄灭
}
}
2)[较重要]第二种方式:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
// 开启GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 初始化PC13, PC14, PC15为推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 关键修改:推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // 低频应用,速度够用,噪声小
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 初始状态:全部设置为高电平,所有LED熄灭
GPIO_SetBits(GPIOC, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
while (1)
{
uint16_t leds[] = {GPIO_Pin_13, GPIO_Pin_14, GPIO_Pin_15};
for (int i = 0; i < 3; i++) {
GPIO_ResetBits(GPIOC, leds[i]); // 点亮当前LED
Delay_ms(500);
GPIO_SetBits(GPIOC, leds[i]); // 熄灭当前LED
}
}
}
4、GPIO程序——控制蜂鸣器
通过A0端口控制有源蜂鸣器,我的是低电平生效。
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
// 开启GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 初始化PA0为推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 设置为高电平,防止蜂鸣器上电鸣响
GPIO_SetBits(GPIOA, GPIO_Pin_0);
while (1)
{
// 设置为低电平,蜂鸣器鸣响
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
// 设置为高电平,蜂鸣器静音
//GPIO_SetBits(GPIOA, GPIO_Pin_0);
}
}
PS:蜂鸣器上面的白色贴纸非必要别撕,因为蜂鸣器太吵了~

浙公网安备 33010602011771号