STM32GPIO输出,使用固件库点亮LED

led.c 

//bsp:board support package 板级支持包
//每新建一个文件都要指定一个路径在 C/C++中 Include Paths 那里

//如果想提高程序的可移植性,更硬件相关的都定义成宏
#include "bsp_led.h"

void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能APB2的GPIOB时钟

	
	GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN|LED_B_GPIO_PIN|LED_R_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;				//速度配置低了功耗就会低,可以在这里降低功耗
  GPIO_Init(LED_RGB_GPIO_PORT,&GPIO_InitStruct);				//初始化GPIOB端口
	
	GPIO_SetBits(LED_RGB_GPIO_PORT, LED_G_GPIO_PIN|LED_R_GPIO_PIN|LED_B_GPIO_PIN);
}

  1. #include "bsp_led.h":引入LED相关的头文件,可能包含了一些宏定义和函数声明。

  2. void LED_GPIO_Config(void):LED GPIO配置函数的定义。

  3. GPIO_InitTypeDef GPIO_InitStruct;:定义一个GPIO初始化结构体,通常用于配置GPIO的各种参数。

  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);:使能APB2总线上的GPIOB时钟。

  5. GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN | LED_B_GPIO_PIN | LED_R_GPIO_PIN;:设置要配置的GPIO引脚,LED的三个颜色对应的引脚。

  6. 这里用到了|按位运算符

    | 是按位或(bitwise OR)运算符。在C语言中,它用于对两个整数的每一位进行逻辑或操作。具体来说,如果两个对应位中至少有一个位为1,则结果的对应位也为1,否则为0。

    在我的代码中,| 用于将三个宏定义 LED_G_GPIO_PINLED_B_GPIO_PINLED_R_GPIO_PIN 的值进行按位或操作:这将把这三个宏定义对应的引脚值合并成一个整数,作为 GPIO_InitStruct.GPIO_Pin 的值。这种技术常用于配置多个引脚,尤其是在嵌入式系统中,可以用一个变量表示多个引脚的状态。

  7. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;:设置GPIO为推挽输出模式。

  8. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;:设置GPIO输出速度为50MHz。

  9. GPIO_Init(LED_RGB_GPIO_PORT, &GPIO_InitStruct);:根据上述配置,初始化GPIOB端口。

  10. GPIO_SetBits(LED_RGB_GPIO_PORT, LED_G_GPIO_PIN | LED_R_GPIO_PIN | LED_B_GPIO_PIN);:设置GPIOB端口的指定引脚为高电平,这里可能是点亮LED。

总体来说,这段代码是配置了一个GPIO端口,将其设置为推挽输出模式,速度为50MHz,并将指定的引脚设置为高电平,用于点亮LED灯。

led.h

#ifndef __BSP_LED_H
#define __BSP_LED_H

#include "stm32f10x.h"
#define LED_G_GPIO_PIN   GPIO_Pin_0  //如果想提高程序的可移植性,更硬件相关的都定义成宏
#define LED_B_GPIO_PIN   GPIO_Pin_1	//这样就可以修改宏来移植程序了
#define LED_R_GPIO_PIN   GPIO_Pin_5

#define LED_RGB_GPIO_PORT  GPIOB
#define LED_RGB_GPIO_CLK  RCC_APB2Periph_GPIOB

void LED_GPIO_Config(void);

#endif


  1. #ifndef __BSP_LED_H#define __BSP_LED_H:这是头文件保护宏,用于防止头文件被多次包含。如果之前没有定义 __BSP_LED_H,则定义它,防止头文件内容重复。

  2. #include "stm32f10x.h":包含了与 STM32F10x 系列微控制器相关的头文件。这是为了在这个头文件中使用 STM32F10x 系列的宏和函数。

  3. #define LED_G_GPIO_PIN GPIO_Pin_0#define LED_B_GPIO_PIN GPIO_Pin_1#define LED_R_GPIO_PIN GPIO_Pin_5:这些宏定义了三个LED的引脚号。

  4. #define LED_RGB_GPIO_PORT GPIOB#define LED_RGB_GPIO_CLK RCC_APB2Periph_GPIOB:这两个宏定义了LED的GPIO端口和相应的时钟。

  5. void LED_GPIO_Config(void);:这是一个LED GPIO配置函数的声明,函数实现在源文件中。

  6. #endif:结束头文件保护宏的定义。

这个头文件的作用是集中定义了 LED 相关的引脚和配置信息,方便其他源文件包含并使用这些信息

main.c

#include "stm32f10x.h"
#include "bsp_led.h"




int main(void)
{	
	/* LED 端口初始化 */

  LED_GPIO_Config();
//	GPIO_SetBits(LED_RGB_GPIO_PORT, LED_G_GPIO_PIN|LED_R_GPIO_PIN|LED_B_GPIO_PIN);
//	GPIO_SetBits(LED_RGB_GPIO_PORT, LED_R_GPIO_PIN);
//	GPIO_SetBits(LED_RGB_GPIO_PORT, LED_B_GPIO_PIN);
	
	while (1)
	{
	GPIO_ResetBits(LED_RGB_GPIO_PORT,LED_R_GPIO_PIN|LED_G_GPIO_PIN|LED_B_GPIO_PIN);
		Delay(0xFFFFF);
	GPIO_SetBits(LED_RGB_GPIO_PORT,LED_R_GPIO_PIN|LED_G_GPIO_PIN|LED_B_GPIO_PIN);
		Delay(0xFFFFF);
	}
}

void Delay(__IO uint32_t nCount)	 //简单的延时函数
{
	for(; nCount != 0; nCount--);
}
  1. #include "stm32f10x.h"#include "bsp_led.h":引入 STM32F10x 系列的头文件和自定义的 LED 头文件。

  2. void Delay(__IO u32 nCount);:延时函数的声明。

  3. int main(void):主函数。

  4. LED_GPIO_Config();:调用 LED 初始化配置函数。

  5. GPIO_ResetBits(LED_RGB_GPIO_PORT, LED_R_GPIO_PIN | LED_G_GPIO_PIN | LED_B_GPIO_PIN);:将 LED 端口的引脚置为低电平,熄灭 LED。

  6. while (1):无限循环。

  7. GPIO_ResetBits(LED_RGB_GPIO_PORT, LED_R_GPIO_PIN | LED_G_GPIO_PIN | LED_B_GPIO_PIN);:这里用到了按位或的操作“|”将 三组数据合并成一组二进制数据,使得一次将多个LED 端口的引脚置为低电平,熄灭 LED。

  8. Delay(0xFFFFF);:延时。

  9. GPIO_SetBits(LED_RGB_GPIO_PORT, LED_R_GPIO_PIN | LED_G_GPIO_PIN | LED_B_GPIO_PIN);:将 LED 端口的引脚置为高电平,点亮 LED。

  10. Delay(0xFFFFF);:延时。

这个程序的基本逻辑是通过循环,在每个循环中点亮 LED,然后进行延时,接着熄灭 LED,再进行延时,如此循环。这样实现了三个 LED 灯同时周期性闪烁

你可能感兴趣的:(stm32,嵌入式硬件,单片机)