打印
[其他ST产品]

STM32学习笔记 - 操作LED灯

[复制链接]
225|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qn7a12|  楼主 | 2023-7-27 23:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM32学习笔记 - 操作LED灯1、创建板级支持包文件

在User目录下创建LED文件夹,包含bsp_led.c及头文件bsp_led.h,之后在Keil中将bsp_led.c加入


使用特权

评论回复
评论
qn7a12 2023-7-27 23:36 回复TA
———————————————— 版权声明:本文为CSDN博主「放学校门口见」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/guanxiaozhi/article/details/130726092 
沙发
qn7a12|  楼主 | 2023-7-27 23:36 | 只看该作者
程序代码
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;
}

使用特权

评论回复
板凳
qn7a12|  楼主 | 2023-7-27 23:36 | 只看该作者
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__ */


使用特权

评论回复
地板
qn7a12|  楼主 | 2023-7-27 23:36 | 只看该作者
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
    }
}

使用特权

评论回复
5
qn7a12|  楼主 | 2023-7-27 23:36 | 只看该作者
下载验证

验证总结:
1、标准库中,对于H端口的时钟使能宏定义写错了(错写为G端口),没有注意复制过去,调试过程中发现LED不点亮,在Debug下才发现;
2、在bsp_led.h中有宏定义基色操作,但是第一次没有用基色宏去操作,而是使用LED_R/G/B_ON的方式去循环点亮,但是自己又忘了没用OFF宏关掉,所以第一次验证未达到预期效果。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

518

帖子

1

粉丝