stm32F103C8T6标准库流水灯2——输出模式
目录
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);
}
可以看到每一个源文件都会需要用注释标注清楚,每一个函数上面也有相应的注释格式标注清楚,让代码更加规范性。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)