1.优化1————多源文件创建

/**
  ******************************************************************************
  * @file    main.c
  * @author  作者
  * @version v1.0
  * @date    2026.4.3
  * @brief   点亮LED灯标准库写法
  ******************************************************************************
  * @attention
  *
  * 版权声明
  *
  ******************************************************************************
  */
#include "stm32f10x.h"
void LED_GPIO_Config(void);
void LED_GPIO_ON(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void LED_GPIO_OFF(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void Rough_Delay(__IO uint32_t ncount);
void Rough_Delay_Us(__IO uint32_t ncount);
void Rough_Delay_Ms(__IO uint32_t time);
void Rough_Delay_S(__IO uint32_t time);

int main (void)
{
    uint32_t time_temp = 5000;
    LED_GPIO_Config();
    
    while(1) 
    {
        //只开R灯
        LED_GPIO_ON(GPIOA, GPIO_Pin_1); 
        LED_GPIO_OFF(GPIOA, GPIO_Pin_2);  
        LED_GPIO_OFF(GPIOA, GPIO_Pin_3); 
        Rough_Delay_Ms(time_temp);
        
        //只开G灯
        LED_GPIO_OFF(GPIOA, GPIO_Pin_1); 
        LED_GPIO_ON(GPIOA, GPIO_Pin_2);  
        LED_GPIO_OFF(GPIOA, GPIO_Pin_3); 
        Rough_Delay_Ms(time_temp);
        
        //只开B灯
        LED_GPIO_OFF(GPIOA, GPIO_Pin_1); 
        LED_GPIO_OFF(GPIOA, GPIO_Pin_2);  
        LED_GPIO_ON(GPIOA, GPIO_Pin_3); 
        Rough_Delay_Ms(time_temp);
        
        for (uint32_t i = 0; i < 3; i++) 
        {
            //全开
            LED_GPIO_ON(GPIOA, GPIO_Pin_1); 
            LED_GPIO_ON(GPIOA, GPIO_Pin_2);  
            LED_GPIO_ON(GPIOA, GPIO_Pin_3); 
            Rough_Delay_Ms(time_temp);
            
            //全关
            LED_GPIO_OFF(GPIOA, GPIO_Pin_1); 
            LED_GPIO_OFF(GPIOA, GPIO_Pin_2);  
            LED_GPIO_OFF(GPIOA, GPIO_Pin_3); 
            Rough_Delay_Ms(time_temp);
        }
        
    }
}

//基础配置
void LED_GPIO_Config(void)

{
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA 端口时钟
    
    GPIO_SetBits(GPIOA, GPIO_Pin_1);    //设置PA1端口初始化1 让LED灭
    GPIO_SetBits(GPIOA, GPIO_Pin_2);    //设置PA2端口初始化1 让LED灭 
    GPIO_SetBits(GPIOA, GPIO_Pin_3);    //设置PA3端口初始化1 让LED灭
    
    // 配置引脚:选择GPIOA的Pin1
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    // 配置输出速度:50MHz
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // 配置引脚:选择GPIOA的Pin2
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
    // 配置输出速度:50MHz
    //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    //GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // 配置引脚:选择GPIOA的Pin3
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
    // 配置输出速度:50MHz
    //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    //GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
}


//开灯
void LED_GPIO_ON(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    GPIO_ResetBits(GPIOx, GPIO_Pin);
}

//关灯
void LED_GPIO_OFF(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    GPIO_SetBits(GPIOx, GPIO_Pin);
}

void Rough_Delay(__IO uint32_t ncount)
{
    for (uint32_t i = 0; i < ncount; i++) 
    {
        __nop();
    }
}

//us
void Rough_Delay_Us(__IO uint32_t time)
{
    Rough_Delay(time);
}

//ms
void Rough_Delay_Ms(__IO uint32_t time)
{
    Rough_Delay(time * 1000);
}

//s
void Rough_Delay_S(__IO uint32_t time)
{
    Rough_Delay(time * 1000 * 1000);
}

基于原来流水灯代码,全部放在main函数里面操作它的,并没用进行规章的使用。
在这里插入图片描述
例如我们要开1灯,就需要吧2灯,3灯关掉,然后我们就开了R灯,但是我们不知道PA1就是R嘛,我们要看相关的原理图或者readme才知道,1灯就是R。那么有没有一种方法无需这种操作,那么就讲到优化过程。

1.1创建4个文件

在这里插入图片描述
在这里插入图片描述
在keil5创建4文件,
命名
bsp_gpio_led.c
bsp_gpio_led.h
保存在user//led里面

命名
bsp_delay.c
bsp_delay.h
保存在user//delay里面
在这里插入图片描述
delay文件夹里面有bsp_delay.c和bsp_delay.h
在这里插入图片描述
led文件夹里面有bsp_gpio_led.c和bsp_gpio_led.h
在这里插入图片描述

1.2 将源文件导入进来

将bsp_gpio_led.c导入进来,导入到工程文件里面的user里面来
在这里插入图片描述
将bsp_delay.c导入进来,导入到工程文件里面的user里面来
在这里插入图片描述
最终在左边栏里面user里面出现了这两个源文件
在这里插入图片描述

1.3 bsp_gpio_led.c

在main函数中将关于LED部分放在该源文件里面去
在这里插入图片描述
bsp_gpio_led.c源文件存放的代码



//基础配置
void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA 端口时钟
    
    GPIO_SetBits(GPIOA, GPIO_Pin_1);    //设置PA1端口初始化1 让LED灭
    GPIO_SetBits(GPIOA, GPIO_Pin_2);    //设置PA2端口初始化1 让LED灭 
    GPIO_SetBits(GPIOA, GPIO_Pin_3);    //设置PA3端口初始化1 让LED灭
    
    // 配置引脚:选择GPIOA的Pin1
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    // 配置输出速度:50MHz
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // 配置引脚:选择GPIOA的Pin2
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
    // 配置输出速度:50MHz
    //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    //GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // 配置引脚:选择GPIOA的Pin3
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
    // 配置输出速度:50MHz
    //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    //GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
}

//开灯
void LED_GPIO_ON(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    GPIO_ResetBits(GPIOx, GPIO_Pin);
}

//关灯
void LED_GPIO_OFF(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    GPIO_SetBits(GPIOx, GPIO_Pin);
}


1.4 bsp_gpio_led.h

先在bsp_gpio_led.h中将基本架构建立好
在这里插入图片描述

然后将关于LED函数的声明代码也放进来
在这里插入图片描述
bsp_gpio_led.h

#ifndef __bsp_gpio_led_H
#define __bsp_gpio_led_H


void LED_GPIO_Config(void);
void LED_GPIO_ON(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void LED_GPIO_OFF(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


#endif /*__bsp_gpio_led_H*/

1.5 bsp_delay.c

将关于时间的函数放在bsp_delay.c中
在这里插入图片描述
bsp_delay.c


void Rough_Delay(__IO uint32_t ncount)
{
    for (uint32_t i = 0; i < ncount; i++) 
    {
        __nop();
    }
}

//us
void Rough_Delay_Us(__IO uint32_t time)
{
    Rough_Delay(time);
}

//ms
void Rough_Delay_Ms(__IO uint32_t time)
{
    Rough_Delay(time * 1000);
}

//s
void Rough_Delay_S(__IO uint32_t time)
{
    Rough_Delay(time * 1000 * 1000);
}

1.6 bsp_delay.h

将关于时间函数的声明放在bsp_Delay.h中
在这里插入图片描述

bsp_delay.h

#ifndef __bsp_delay_H
#define __bsp_delay_H

void Rough_Delay(__IO uint32_t ncount);
void Rough_Delay_Us(__IO uint32_t ncount);
void Rough_Delay_Ms(__IO uint32_t time);
void Rough_Delay_S(__IO uint32_t time);

#endif /*__bsp_delay_H*/

1.7 四个文件整理

1.将bsp_gpio_led.h和bsp_delay.h都加上头文件
#include “stm32f10x.h”
在这里插入图片描述
在这里插入图片描述
2.在bsp_gpio_led.c源文件加入头文件
#include “led/bsp_gpio_led.h”
在这里插入图片描述
3.在bsp_delay.c源文件加入头文件
#include “delay/bsp_delay.h”
在这里插入图片描述
4.在main.c里面加入头文件
#include “led/bsp_gpio_led.h”
#include “delay/bsp_delay.h”
在这里插入图片描述
5.最后编译
在这里插入图片描述
0警告,0错误。

1.8 关于头文件链接理解

1.因为我在keil5里面添加了user的路径
然后user里面又创建了两个文件夹,分别是delay和led
delay存储的是delay的源文件和头文件
led存储的是led的源文件和头文件
所以编译器可以找到user的路径,因为我添加了user的路径,但是找不到bsp_gpio_led.h路径和
bsp_delay.h路径。
所以既然编译器可以找到user路径,然后在头文件写
#include “led/bsp_gpio_led.h”,led文件里面的bsp_gpio_led.h头文件
#include “delay/bsp_delay.h”,delay文件里面的bsp_delay.h头文件
在这里插入图片描述
在这里插入图片描述
2.我在bsp_gpio_led.h和bsp_delay.h分别都加入了头文件
#include “stm32f10x.h”

因为在bsp_gpio_led.h中,有数据类型是GPIO_TypeDef*和uint16_t,是通过在
#include “stm32f10x.h”
这个头文件搜索到的,所以需要加

以及bsp_delay.h中,有数据类型uint16_t,也是需要通过#include “stm32f10x.h”
搜索到的
在这里插入图片描述
在这里插入图片描述
3.为什么bsp_gpio_led.c和bsp_delay.c都加入了自己的.h
理解成一种格式,每一个.c源文件都有自己配套的.h文件,
.c源文件用来编写函数的功能,然后自己的一些函数功能可以对外开发的接口
都定义在自己的.h文件中
如果别的源文件想要使用该源文件的函数功能,就只需要包含该源文件对应的头文件
3.1 作用1,可以对外开放自己的源文件功能接口使用
3.2 作用2,因为在自己的源文件里面有一些数据类型都在#include "stm32f10x.h"里面包含着
#include "stm32f10x.h"被自己的头文件包含着,自己的.c源文件包含自己的.h头文件,相当于自己的.c源文件包含了#include "stm32f10x.h"文件。
在这里插入图片描述
在这里插入图片描述
4.main.c也包含着bsp_gpio_led.h和bsp_delay.h头文件,因为在main里面需要使用LED.c文件里面函功能,所以需要包含LED对应的头文件才能使用,还需要使用delay.c文件里面的延时函数功能,所以也需要包含delay对应的头文件才能正常使用。
在这里插入图片描述

2.优化2————宏的用法

要养成多使用宏的习惯
在bsp_gpio_led.h文件中
将一些用到的GPIOA,以及GPIOA引脚,以及端口时钟通过宏定义去封装

2.1 一次封装————宏

/*定义连接GPIO端口,用户只需要修改下面代码即可改变控制的LED引脚 */

//LED1
#define LED1_GPIO_PORT      GPIOA                       /* GPIO 端口 */
#define LED1_GPIO_CLK_PORT  RCC_APB2Periph_GPIOA        /* GPIO 端口时钟 */
#define LED1_GPIO_PIN       GPIO_Pin_1                  /* 对应PIN脚 */

//LED2
#define LED2_GPIO_PORT      GPIOA                       /* GPIO 端口 */
#define LED2_GPIO_CLK_PORT  RCC_APB2Periph_GPIOA        /* GPIO 端口时钟 */
#define LED2_GPIO_PIN       GPIO_Pin_2                 /* 对应PIN脚 */

//LED3
#define LED3_GPIO_PORT      GPIOA                       /* GPIO 端口 */
#define LED3_GPIO_CLK_PORT  RCC_APB2Periph_GPIOA        /* GPIO 端口时钟 */
#define LED3_GPIO_PIN       GPIO_Pin_3                  /* 对应PIN脚 */

2.2 二次封装————宏

/***************核心板载LED灯****************************************/

//R_LED
#define R_LED1_GPIO_PORT      LED1_GPIO_PORT            /* GPIO 端口 */
#define R_LED1_GPIO_CLK_PORT  LED1_GPIO_CLK_PORT        /* GPIO 端口时钟 */
#define R_LED1_GPIO_PIN       LED1_GPIO_PIN             /* 对应PIN脚 */

//G_LED
#define G_LED2_GPIO_PORT      LED2_GPIO_PORT            /* GPIO 端口 */
#define G_LED2_GPIO_CLK_PORT  LED2_GPIO_CLK_PORT        /* GPIO 端口时钟 */
#define G_LED2_GPIO_PIN       LED2_GPIO_PIN             /* 对应PIN脚 */

//B_LED
#define B_LED3_GPIO_PORT      LED3_GPIO_PORT            /* GPIO 端口 */
#define B_LED3_GPIO_CLK_PORT  LED3_GPIO_CLK_PORT        /* GPIO 端口时钟 */
#define B_LED3_GPIO_PIN       LED3_GPIO_PIN             /* 对应PIN脚 */

2.3 函数封装————宏

函数也可以进行封装
原本我要使用只点亮R灯需要写三个函数
LED_GPIO_ON(R_LED1_GPIO_PORT, R_LED1_GPIO_PIN);
LED_GPIO_OFF(G_LED2_GPIO_PORT, G_LED2_GPIO_PIN);
LED_GPIO_OFF(B_LED3_GPIO_PORT, B_LED3_GPIO_PIN);

现在我也可以通过宏定义将3个函数功能用来只点亮R灯的宏定义

//R_LED
#define R_LED_ON_ONLY LED_GPIO_ON(R_LED1_GPIO_PORT, R_LED1_GPIO_PIN);  \
                      LED_GPIO_OFF(G_LED2_GPIO_PORT, G_LED2_GPIO_PIN); \
                      LED_GPIO_OFF(B_LED3_GPIO_PORT, B_LED3_GPIO_PIN);

函数封装

/***************用户自定义宏****************************************/
//R_LED
#define R_LED_ON_ONLY LED_GPIO_ON(R_LED1_GPIO_PORT, R_LED1_GPIO_PIN);  \
                      LED_GPIO_OFF(G_LED2_GPIO_PORT, G_LED2_GPIO_PIN); \
                      LED_GPIO_OFF(B_LED3_GPIO_PORT, B_LED3_GPIO_PIN); 

//G_LED
#define G_LED_ON_ONLY LED_GPIO_OFF(R_LED1_GPIO_PORT, R_LED1_GPIO_PIN);  \
                      LED_GPIO_ON(G_LED2_GPIO_PORT, G_LED2_GPIO_PIN); \
                      LED_GPIO_OFF(B_LED3_GPIO_PORT, B_LED3_GPIO_PIN);

//B_LED
#define B_LED_ON_ONLY LED_GPIO_OFF(R_LED1_GPIO_PORT, R_LED1_GPIO_PIN);  \
                      LED_GPIO_OFF(G_LED2_GPIO_PORT, G_LED2_GPIO_PIN); \
                      LED_GPIO_ON(B_LED3_GPIO_PORT, B_LED3_GPIO_PIN);                      

//B_G_B_LED全亮
#define RGB_LED_ALL_ON    LED_GPIO_ON(R_LED1_GPIO_PORT, R_LED1_GPIO_PIN);  \
                          LED_GPIO_ON(G_LED2_GPIO_PORT, G_LED2_GPIO_PIN); \
                          LED_GPIO_ON(B_LED3_GPIO_PORT, B_LED3_GPIO_PIN);
                          
//B_G_B_LED全灭
#define RGB_LED_ALL_OFF     LED_GPIO_OFF(R_LED1_GPIO_PORT, R_LED1_GPIO_PIN);  \
                            LED_GPIO_OFF(G_LED2_GPIO_PORT, G_LED2_GPIO_PIN); \
                            LED_GPIO_OFF(B_LED3_GPIO_PORT, B_LED3_GPIO_PIN);

2.4 bsp_gpio_led.h文件展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.5 main函数展示

在这里插入图片描述
最终在main函数里面只写一个宏,就相当于使用3个函数的功能,通过宏名字很直观的知道是做什么事情,注释也可以省略。

比如:
R_LED_ON_ONLY;
只开启R灯

G_LED_ON_ONLY;
开启G灯

B_LED_ON_ONLY;
开启B灯

RGB_LED_ALL_ON;
RGB灯全开

RGB_LED_ALL_OFF;
RGB灯全灭

3.优化3————注释部分

在这里插入图片描述
在ADC官方提供的函数里面,他有这么一个习惯,每一个函数上面都写了这些注释
@brief 函数功能讲解
@param 函数里面的参数功能讲解,其中@param的个数是取决于参数的个数,每一个@param对应的其中一个参数讲解
@retval 返回值讲解
还有一个@note 补充说明,注意事项写这里

所以我们也有这么个关于函数的解释部分。

3.1 #if ——#endif 使用

void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };

#if 1
    
    RCC_APB2PeriphClockCmd(R_LED1_GPIO_CLK_PORT, ENABLE); //开启GPIOA 端口时钟
    
    GPIO_SetBits(R_LED1_GPIO_PORT, R_LED1_GPIO_PIN);    //设置PA1端口初始化1 让LED灭
    
    // 配置引脚:选择GPIOA的Pin1
    GPIO_InitStruct.GPIO_Pin = R_LED1_GPIO_PIN;
    // 配置输出速度:50MHz
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(R_LED1_GPIO_PORT, &GPIO_InitStruct);
#endif

#if 1
    
    RCC_APB2PeriphClockCmd(G_LED2_GPIO_CLK_PORT, ENABLE); //开启GPIOA 端口时钟
    
    GPIO_SetBits(G_LED2_GPIO_PORT, G_LED2_GPIO_PIN);    //设置PA2端口初始化1 让LED灭
    
    // 配置引脚:选择GPIOA的Pin1
    GPIO_InitStruct.GPIO_Pin = G_LED2_GPIO_PIN;
    // 配置输出速度:50MHz
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(G_LED2_GPIO_PORT, &GPIO_InitStruct);
#endif

#if 1
    
    RCC_APB2PeriphClockCmd(B_LED3_GPIO_CLK_PORT, ENABLE); //开启GPIOA 端口时钟
    
    GPIO_SetBits(B_LED3_GPIO_PORT, B_LED3_GPIO_PIN);    //设置PA3端口初始化1 让LED灭
    
    // 配置引脚:选择GPIOA的Pin1
    GPIO_InitStruct.GPIO_Pin = B_LED3_GPIO_PIN;
    // 配置输出速度:50MHz
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(B_LED3_GPIO_PORT, &GPIO_InitStruct);
#endif
    
}

原先对三个LED灯一起配置,通过使用#if——#endif单独对每一个LED进行配置,当我想要哪一个配置就在# if 前面加上1,

#if 1



#endif

如果不想要执行这部分就写成

#if 0



#endif

从#if 0 到#endif之间的代码不会执行,相当于注释掉一样,可以选择性初始化我想要初始化部分。

3.2 函数注释部分

main.c

/**
  ******************************************************************************
  * @file    main.c
  * @author  作者
  * @version v1.0
  * @date    2026.4.3
  * @brief   流水灯标准库写法
  ******************************************************************************
  * @attention
  *
  * 版权声明
  *
  ******************************************************************************
  */
#include "led/bsp_gpio_led.h"
#include "delay/bsp_delay.h"
#include "stm32f10x.h"

/**
  * @brief  主函数
  * @param  无
  * @note   无
  * @retval 无
  */
  
int main (void)
{
    uint32_t time_temp = 5000;
    LED_GPIO_Config();
    
    while(1) 
    {
        R_LED_ON_ONLY;
        Rough_Delay_Ms(time_temp);
        
        G_LED_ON_ONLY; 
        Rough_Delay_Ms(time_temp);
        
        B_LED_ON_ONLY; 
        Rough_Delay_Ms(time_temp);
        
        for (uint32_t i = 0; i < 3; i++) 
        {
            RGB_LED_ALL_ON;  
            Rough_Delay_Ms(time_temp);
            
            RGB_LED_ALL_OFF;
            Rough_Delay_Ms(time_temp);
        }
    }
}

bsp_gpio_led.c


/**
  ******************************************************************************
  * @file    bsp_gpio_led.c
  * @author  作者
  * @version v1.0
  * @date    2026.4.3
  * @brief   LED灯的函数接口
  ******************************************************************************
  * @attention
  *
  * 版权声明
  *
  ******************************************************************************
  */
#include "led/bsp_gpio_led.h"

/**
  * @brief  初始化控制 LED 的IO
  * @param  无
  * @retval 无
  */
  
void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };

#if 1
    
    RCC_APB2PeriphClockCmd(R_LED1_GPIO_CLK_PORT, ENABLE); //开启GPIOA 端口时钟
    
    GPIO_SetBits(R_LED1_GPIO_PORT, R_LED1_GPIO_PIN);    //设置PA1端口初始化1 让LED灭
    
    // 配置引脚:选择GPIOA的Pin1
    GPIO_InitStruct.GPIO_Pin = R_LED1_GPIO_PIN;
    // 配置输出速度:50MHz
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(R_LED1_GPIO_PORT, &GPIO_InitStruct);
#endif

#if 1
    
    RCC_APB2PeriphClockCmd(G_LED2_GPIO_CLK_PORT, ENABLE); //开启GPIOA 端口时钟
    
    GPIO_SetBits(G_LED2_GPIO_PORT, G_LED2_GPIO_PIN);    //设置PA2端口初始化1 让LED灭
    
    // 配置引脚:选择GPIOA的Pin1
    GPIO_InitStruct.GPIO_Pin = G_LED2_GPIO_PIN;
    // 配置输出速度:50MHz
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(G_LED2_GPIO_PORT, &GPIO_InitStruct);
#endif

#if 1
    
    RCC_APB2PeriphClockCmd(B_LED3_GPIO_CLK_PORT, ENABLE); //开启GPIOA 端口时钟
    
    GPIO_SetBits(B_LED3_GPIO_PORT, B_LED3_GPIO_PIN);    //设置PA3端口初始化1 让LED灭
    
    // 配置引脚:选择GPIOA的Pin1
    GPIO_InitStruct.GPIO_Pin = B_LED3_GPIO_PIN;
    // 配置输出速度:50MHz
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(B_LED3_GPIO_PORT, &GPIO_InitStruct);
#endif
    
}

/**
  * @brief  开启对应 LED 灯
  * @param  GPIOX : x可以是 A,B,C等
  * @param  GPIO_PIN: 待操作的PIN
  * @retval 无
  */
void LED_GPIO_ON(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    GPIO_ResetBits(GPIOx, GPIO_Pin);
}

/**
  * @brief  开启对应 LED 灯
  * @param  GPIOX : x可以是 A,B,C等
  * @param  GPIO_PIN: 待操作的PIN
  * @retval 无
  */
void LED_GPIO_OFF(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    GPIO_SetBits(GPIOx, GPIO_Pin);
}

/***************************************END OF FILE *********************************************************/

bsp_delay.c


/**
  ******************************************************************************
  * @file    bsp_delay.c
  * @author  作者
  * @version v1.0
  * @date    2026.4.3
  * @brief   粗略阻塞延时函数接口
  ******************************************************************************
  * @attention
  *
  * 版权声明
  *
  ******************************************************************************
  */
#include "delay/bsp_delay.h"

/**
  * @brief  粗略阻塞延时基本函数接口
  * @param  ncount:传入的计数值
  * @note   软件延时函数,使用不同的系统时钟,延时不一样,还会存在函数调用以及其他计算损耗,只能粗略使用
  * @retval 无
  */
  
void Rough_Delay(__IO uint32_t ncount)
{
    for (uint32_t i = 0; i < ncount; i++) 
    {
        __nop();
    }
}

/**
  * @brief  粗略阻塞延时基本函数接口    单位:US
  * @param  ncount:传入的计数值
  * @note   软件延时函数,使用不同的系统时钟,延时不一样,还会存在函数调用以及其他计算损耗,只能粗略使用
  * @retval 无
  */
void Rough_Delay_Us(__IO uint32_t time)
{
    Rough_Delay(time);
}

/**
  * @brief  粗略阻塞延时基本函数接口    单位:MS
  * @param  ncount:传入的计数值
  * @note   软件延时函数,使用不同的系统时钟,延时不一样,还会存在函数调用以及其他计算损耗,只能粗略使用
  * @retval 无
  */
void Rough_Delay_Ms(__IO uint32_t time)
{
    Rough_Delay(time * 1000);
}

/**
  * @brief  粗略阻塞延时基本函数接口    单位:S
  * @param  ncount:传入的计数值
  * @note   软件延时函数,使用不同的系统时钟,延时不一样,还会存在函数调用以及其他计算损耗,只能粗略使用
  * @retval 无
  */
void Rough_Delay_S(__IO uint32_t time)
{
    Rough_Delay(time * 1000 * 1000);
}

可以看到每一个源文件都会需要用注释标注清楚,每一个函数上面也有相应的注释格式标注清楚,让代码更加规范性。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐