main.c
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>
#include "bsp_led.h"
int main(void)
{
LED_GPIO_Config(); //LED灯初始配置
while(1)
{
/*---------使用固件库函数点亮三种颜色的灯----------*/
/*
GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);
Delay(10000000);
GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);
GPIO_ResetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN);
Delay(10000000);
GPIO_SetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN);
GPIO_ResetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);
Delay(10000000);
GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);
*/
LED_COLLOUR();
}
}
bsp_led.c
#include "bsp_led.h"
/*
bsp表示Board Support Packet,表示板级支持包,适用于特定板,移植时需要注意根据硬件接口做一定调整。
本文件适用于野火指南者开发板,RGB接口为: R-PB5; G-PB0; B-PB1;
*/
void Delay(unsigned int a)
{
while(a) a--;
}
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO结构体
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK | LED_R_GPIO_CLK | LED_B_GPIO_CLK, ENABLE);
/*打开GPIO的时钟,第一个参数是要打开哪个GPIO口的时钟,
第二个参数为ENABLE时即是使能,即打开。*/
/*-------配置绿灯IO口---------*/
GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN; //配置IO口
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置为推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置速度为50MHz
GPIO_Init(LED_G_GPIO_PORT , &GPIO_InitStruct); //GPIO口初始化
GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); //关闭绿灯,若不关闭时初始化后IO口默认低电平会使绿灯亮起,下同。
/*-------配置红灯IO口---------*/
GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN; //配置IO口
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置为推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置速度为50MHz
GPIO_Init(LED_R_GPIO_PORT , &GPIO_InitStruct); //GPIO口初始化
GPIO_SetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN); //关闭红灯
/*-------配置蓝灯IO口---------*/
GPIO_InitStruct.GPIO_Pin = LED_B_GPIO_PIN; //配置IO口
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置为推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置速度为50MHz
GPIO_Init(LED_B_GPIO_PORT , &GPIO_InitStruct); //GPIO口初始化
GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN); //关闭蓝灯
}
/*
功能:让RGB灯按红黄绿青蓝紫依次亮起,但未使用PWM调节。
*/
void LED_COLLOUR(void)
{
LED_RED;
Delay(1000000);
LED_YELLOW;
Delay(1000000);
LED_GREEN;
Delay(1000000);
LED_CYAN;
Delay(1000000);
LED_BLUE;
Delay(1000000);
LED_PURPLE;
Delay(1000000);
}
bsp_led.h
#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "stm32f10x.h"
#define LED_G_GPIO_PIN GPIO_Pin_0 //绿灯IO口
#define LED_G_GPIO_PORT GPIOB
#define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB //绿灯时钟使能寄存器
#define LED_R_GPIO_PIN GPIO_Pin_5 //红灯IO口
#define LED_R_GPIO_PORT GPIOB
#define LED_R_GPIO_CLK RCC_APB2Periph_GPIOB //红灯时钟使能寄存器
#define LED_B_GPIO_PIN GPIO_Pin_1 //蓝灯IO口
#define LED_B_GPIO_PORT GPIOB
#define LED_B_GPIO_CLK RCC_APB2Periph_GPIOB //蓝灯时钟使能寄存器
#define GPIO_HIGH(PORT,PIN) {PORT->BSRR = PIN;} //输出为高电平
#define GPIO_LOW(PORT,PIN) {PORT->BRR = PIN;} //输出为低电平
#define GPIO_TOGGLE(PORT,PIN) {PORT->ODR ^= PIN;}//输出反转状态
#define LED_G_TOGGLE GPIO_TOGGLE(LED_G_GPIO_PORT, LED_G_GPIO_PIN)
#define LED_G_ON GPIO_LOW(LED_G_GPIO_PORT, LED_G_GPIO_PIN)
#define LED_G_OFF GPIO_HIGH(LED_G_GPIO_PORT, LED_G_GPIO_PIN)
#define LED_R_TOGGLE GPIO_TOGGLE(LED_R_GPIO_PORT, LED_R_GPIO_PIN)
#define LED_R_ON GPIO_LOW(LED_R_GPIO_PORT, LED_R_GPIO_PIN)
#define LED_R_OFF GPIO_HIGH(LED_R_GPIO_PORT, LED_R_GPIO_PIN)
#define LED_B_TOGGLE GPIO_TOGGLE(LED_B_GPIO_PORT, LED_B_GPIO_PIN)
#define LED_B_ON GPIO_LOW(LED_B_GPIO_PORT, LED_B_GPIO_PIN)
#define LED_B_OFF GPIO_HIGH(LED_B_GPIO_PORT, LED_B_GPIO_PIN)
//绿灯
#define LED_GREEN \
LED_G_ON;\
LED_R_OFF;\
LED_B_OFF;
//红灯
#define LED_RED \
LED_G_OFF;\
LED_R_ON;\
LED_B_OFF;
//蓝灯
#define LED_BLUE \
LED_G_OFF;\
LED_R_OFF;\
LED_B_ON;
//黄灯(绿+红)
#define LED_YELLOW \
LED_G_ON;\
LED_R_ON;\
LED_B_OFF;
//紫灯(红+蓝)
#define LED_PURPLE \
LED_G_OFF;\
LED_R_ON;\
LED_B_ON;
//青灯(绿+蓝)
#define LED_CYAN \
LED_G_ON;\
LED_R_OFF;\
LED_B_ON;
void Delay(unsigned int a);
void LED_GPIO_Config(void);
void LED_COLLOUR(void);
#endif /*__BSP_LED_H*/
总结
使用固件库点亮LED灯需要的步骤:
- 在bsp_led.h文件中配置硬件接口信息。
#define LED_G_GPIO_PIN GPIO_Pin_0 //绿灯IO口
#define LED_G_GPIO_PORT GPIOB
#define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB //绿灯时钟使能寄存器
- 在bsp_led.c文件中写led灯配置函数void LED_GPIO_Config(void);其中内容包括定义GPIO结构体,打开GPIO口的时钟,配置IO口的引脚、输出方式,速度,初始化IO口。
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO结构体
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK | LED_R_GPIO_CLK | LED_B_GPIO_CLK, ENABLE);
/*打开GPIO的时钟,第一个参数是要打开哪个GPIO口的时钟,
第二个参数为ENABLE时即是使能,即打开。该函数在stm32f10x_rcc.c中。*/
/*-------配置绿灯IO口---------*/
GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN; //配置IO口
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置为推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置速度为50MHz
GPIO_Init(LED_G_GPIO_PORT , &GPIO_InitStruct); //GPIO口初始化
GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); //关闭绿灯,若不关闭时初始化后IO口默认低电平会使绿灯亮起,下同。
}
- 在main.c函数调用led灯配置函数,即可完成配置。根据需要调用stm32f10x_gpio.h文件中的函数来操控led灯的亮灭。
代码来源于野火视频教程,有所修改。