002 - STM32学习笔记 - 操作LED灯
1、创建板级支持包文件
在User目录下创建LED文件夹,包含bsp_led.c及头文件bsp_led.h,之后在Keil中将bsp_led.c加入
2、程序代码
bsp_led.c
#include ".\LED\bsp_led.h" //相对路径访问,可以在工程配置内将此路径加入
void Led_Config(void)
{
// 创建GPIO_InitTypeDef类型结构体
GPIO_InitTypeDef LED_InitStructure;
//使能LED所在的GPIO外设时钟
RCC_AHB1PeriphClockCmd(LED_R_CLK|LED_G_CLK|LED_B_CLK,ENABLE);
//设置LED为输出模式
LED_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
//设置LED输出类型为推挽输出
LED_InitStructure.GPIO_OType = GPIO_OType_PP;
//设置LED引脚为上拉
LED_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
//设置LED输出速率围殴25MHz
LED_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
/*--------以上配置RGB均相同,配置一次即可--------*/
//选择红灯引脚
LED_InitStructure.GPIO_Pin = LED_R_PIN;
//初始化红灯引脚
GPIO_Init(LED_R_PORT,&LED_InitStructure);
//选择绿灯引脚
LED_InitStructure.GPIO_Pin = LED_G_PIN;
//初始化绿灯引脚
GPIO_Init(LED_G_PORT,&LED_InitStructure);
//选择蓝灯引脚
LED_InitStructure.GPIO_Pin = LED_G_PIN;
//初始化蓝灯引脚
GPIO_Init(LED_G_PORT,&LED_InitStructure);
//配置完成后将所有灯关闭
LED_OFF;
}
bsp_led.h
#ifndef __BSP_LED_H__
#define __BSP_LED_H__
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
// 红灯
#define LED_R_PIN GPIO_Pin_10
#define LED_R_PORT GPIOH
#define LED_R_CLK RCC_AHB1Periph_GPIOH //此处最开始直接复制了标准库对于H端口的时钟使能宏,但是标准库中H端口错写成G口,导致LED不点亮
// 绿灯
#define LED_G_PIN GPIO_Pin_11
#define LED_G_PORT GPIOH
#define LED_G_CLK RCC_AHB1Periph_GPIOH //此处最开始直接复制了标准库对于H端口的时钟使能宏,但是标准库中H端口错写成G口,导致LED不点亮
// 蓝灯
#define LED_B_PIN GPIO_Pin_12
#define LED_B_PORT GPIOH
#define LED_B_CLK RCC_AHB1Periph_GPIOH //此处最开始直接复制了标准库对于H端口的时钟使能宏,但是标准库中H端口错写成G口,导致LED不点亮
//操作寄存器方法控制LED输出
#define OutH(Port,Pin) {Port->BSRRL = Pin;} //输出高电平
#define OutL(Port,Pin) {Port->BSRRH = Pin;} //输出低电平
#define Toggle(Port,Pin) {Port->ODR ^= Pin;} //反转
//定义LED宏
#define LED_R_ON OutL(LED_R_PORT,LED_R_PIN)
#define LED_R_OFF OutH(LED_R_PORT,LED_R_PIN)
#define LED_R_TOGGLE Toggle(LED_R_PORT,LED_R_PIN)
#define LED_G_ON OutL(LED_G_PORT,LED_G_PIN)
#define LED_G_OFF OutH(LED_G_PORT,LED_G_PIN)
#define LED_G_TOGGLE Toggle(LED_G_PORT,LED_G_PIN)
#define LED_B_ON OutL(LED_B_PORT,LED_B_PIN)
#define LED_B_OFF OutH(LED_B_PORT,LED_B_PIN)
#define LED_B_TOGGLE Toggle(LED_B_PORT,LED_B_PIN)
//基本色
#define LED_RED LED_R_ON;LED_G_OFF;LED_B_OFF //红灯亮
#define LED_GREEN LED_R_OFF;LED_G_ON;LED_B_OFF //绿灯亮
#define LED_BLUE LED_R_OFF;LED_G_OFF;LED_B_ON //蓝灯亮
#define LED_OFF LED_R_OFF;LED_G_OFF;LED_B_OFF //所有灯灭
void Led_Config(void);
#endif /* __BSP_LED_H__ */
main.c
#include "stm32f4xx.h"
#include ".\LED\bsp_led.h"
//延时函数
void Delay(__IO uint32_t nCount)
{
for(;nCount != 0;nCount--);
}
int main(void)
{
Led_Config();
while(1)
{
#if 0
LED_R_ON;
Delay(0xFFFFFF);
LED_R_OFF;
LED_G_ON;
Delay(0xFFFFFF);
LED_G_OFF;
LED_B_ON;
Delay(0xFFFFFF);
LED_B_OFF;
#else
LED_RED;
Delay(0xFFFFFF);
LED_GREEN;
Delay(0xFFFFFF);
LED_BLUE;
Delay(0xFFFFFF);
#endif
}
}
下载验证
验证总结:
1、标准库中,对于H端口的时钟使能宏定义写错了(错写为G端口),没有注意复制过去,调试过程中发现LED不点亮,在Debug下才发现;
2、在bsp_led.h中有宏定义基色操作,但是第一次没有用基色宏去操作,而是使用LED_R/G/B_ON的方式去循环点亮,但是自己又忘了没用OFF宏关掉,所以第一次验证未达到预期效果。