STM32_LED相关

STM32_LED相关

image-20260203173256203

image-20260203173726461

image-20260203173846663

image-20260203174034787

image-20260203174302932

image-20260203180653324

image-20260203180718633

image-20260203180744836

image-20260203180821265

image-20260203180839676

image-20260203180906695

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 上拉/下拉输入 确定默认电平

image-20260210224544029

image-20260210225652587

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流水灯

image-20260210231131936

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

STM32F103C8T6引脚定义

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:蜂鸣器上面的白色贴纸非必要别撕,因为蜂鸣器太吵了~

posted @ 2026-02-10 23:50  Q&25  阅读(4)  评论(0)    收藏  举报