手写stm32f103RGB初始化程序(2)_stm32f103手写识别-程序员宅基地

技术标签: stm32  嵌入式硬件  mcu  单片机  

主要针对 stm32f103RGB初始化程序(1)优化了:

在lec.c中RGB对应引脚的初始化函数,将三个函数合为一个。

在led.h中添加了三个引脚对应的枚举值。

在led.h中新增了一些宏。

修改了函数名,以及使用方法。

脱离了硬件层,实现软件层编程。

增加了代码的可读性,可移植性。

main.c

#include "stm32f10x.h"
#include "led.h"
#include "key.h"


int main(void) {
	//来到这里的时候,系统时钟已经被配置成72M
	RGB_GPIO_Config(RGB_R); // 初始化红色 LED
	RGB_GPIO_Config(RGB_G); // 初始化绿色 LED
	RGB_GPIO_Config(RGB_B); // 初始化蓝色 LED

	RGB_ON(RGB, RED);
	RGB_OFF(RGB,RED);

	RGB_ON(RGB,BLUE);
	RGB_OFF(RGB,BLUE);
		
	RGB_ON(RGB,GREEN);
//	RGB_OFF(RGB,GREEN);



}



led.h

#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

#define RED GPIO_Pin_5
#define BLUE GPIO_Pin_1
#define GREEN GPIO_Pin_0

#define RGB GPIOB


#define RGB_ON(Port, color)    GPIO_ResetBits(Port, color) 
#define RGB_OFF(Port, color)   GPIO_SetBits(Port, color)


/*
#define LED_OFF(A, B)       GPIO_ResetBits(A, B)
#define LED_OFF(GPIOx, GPIO_PIN)       GPIO_ResetBits(GPIOx, GPIO_PIN)

都可以,效果一样,前后对应即可

#define LED_OFF(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)       GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
这个不行,要改成下面这个
#define LED_OFF(GPIOx, GPIO_Pin)    GPIO_ResetBits(GPIOx, GPIO_Pin
在这个宏定义中,我们去掉了参数列表中的类型声明,只保留了参数名。
这样做是因为在宏定义中,我们只需要指定参数的名字而不需要具体的类型。
参数的类型应该在调用宏的地方指定。

请注意,宏定义中的参数名 GPIOx 和 GPIO_Pin 只是标识符,
用于在宏调用时接收传递的实际参数。
在调用宏的时候,你需要传递正确的参数,即正确的 GPIO 引脚和引脚编号。
*/


/*#define: 这是宏定义的关键字,它告诉编译器后面是一个宏定义。

LED_OFF: 这是宏的名称,你可以根据需要给宏取一个有意义的名称。
在这个例子中,我们将宏定义为 LED_OFF,表示用于熄灭 LED。

(A, B): 这是宏的参数列表,宏可以接受多个参数,用逗号分隔。
在这个例子中,宏有两个参数 A 和 B。这些参数是占位符,
用于在宏被调用时接收传递的实际参数。

GPIO_ResetBits(A, B): 这是宏的替换文本。宏在被调用时,
会将参数 A 和 B 替换到这里。
在这个例子中,GPIO_ResetBits(A, B) 表示调用了 GPIO_ResetBits 函数,
其中 A 和 B 分别替换为宏被调用时传递的实际参数。

通过这个宏定义,你可以在代码中使用 LED_OFF(GPIOx, GPIO_Pin) 
来熄灭 LED。在实际调用宏时,
预处理器会将 GPIOx 和 GPIO_Pin 替换为宏定义中的 A 和 B 参数,
然后展开成 GPIO_ResetBits(GPIOx, GPIO_Pin),
从而实现了简便的 LED 熄灭操作。
*/


typedef enum {
    RGB_R,
    RGB_G,
    RGB_B,
    // 可以添加其他 LED 类型
} RGB_Type;

void RGB_GPIO_Config(RGB_Type RGBType);


#endif /*__BSP_LED_H*/




关于:

typedef enum {
    RGB_R,
    RGB_G,
    RGB_B,
    // 可以添加其他 LED 类型
} RGB_Type;

这段代码定义了一个枚举类型 RGB_Type,用于表示不同颜色的 RGB LED 类型。枚举类型是一种用户自定义的数据类型,它允许你在代码中使用易读的符号来代表特定的值。在这个特定的情况下,RGB_Type 枚举用于区分不同颜色的 RGB LED。

在定义中,RGB_RRGB_GRGB_B 是枚举的三个值,分别表示红色、绿色和蓝色的 LED 类型。你可以通过这些符号来指定你希望初始化和控制的不同颜色的 RGB LED。这样,当在代码中使用 RGB_R 时,实际上代表的是数字 0(默认从 0 开始递增),当你使用 RGB_G 时,代表的是数字 1,以此类推。

通过使用枚举类型,可以提高代码的可读性和易用性,因为使用可读的符号比使用数字更加直观和易于理解。在这种情况下,RGB_Type 枚举可以帮助识别和区分不同颜色的 RGB LED,使代码更具有可维护性。

 

led.c

#include "led.h"



void RGB_GPIO_Config(RGB_Type RGBType) {
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    if (RGBType == RGB_R) {
        GPIO_InitStruct.GPIO_Pin = RED;
    } else if (RGBType == RGB_G) {
        GPIO_InitStruct.GPIO_Pin = GREEN;
    } else if (RGBType == RGB_B) {
        GPIO_InitStruct.GPIO_Pin = BLUE;
    }
    
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

		RGB_OFF(RGB,GPIO_InitStruct.GPIO_Pin);// 电路原因,让灯不会因为 GPIO 引脚初始化而亮
}



这里主要讲解led.c里面的内容

这段代码用于初始化不同颜色的 RGB LED,并在初始化后将其熄灭。下面是代码的逐步解释:

void RGB_GPIO_Config(RGB_Type RGBType) {
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

这部分代码定义了一个函数 RGB_GPIO_Config,它接受一个参数 RGBType,表示要初始化的 RGB LED 类型。然后创建了一个名为 GPIO_InitStruct 的结构体,用于配置 GPIO 引脚。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 这行代码开启了 GPIOB 的时钟,以便在初始化时使用。

    if (RGBType == RGB_R) {
        GPIO_InitStruct.GPIO_Pin = RED;
    } else if (RGBType == RGB_G) {
        GPIO_InitStruct.GPIO_Pin = GREEN;
    } else if (RGBType == RGB_B) {
        GPIO_InitStruct.GPIO_Pin = BLUE;
    }

这一部分根据传递给函数的 RGBType 参数,设置了对应颜色的引脚。假设 REDGREENBLUE 分别表示红色、绿色和蓝色的引脚。

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

这部分配置了 GPIO 引脚的模式为推挽输出(GPIO_Mode_Out_PP)和输出速度为 50MHz。然后使用 GPIO_Init 函数将配置应用于 GPIOB 引脚。

    RGB_OFF(RGB, GPIO_InitStruct.GPIO_Pin); // 电路原因,让灯不会因为 GPIO 引脚初始化而亮
}

最后,这行代码调用了 RGB_OFF 宏来将初始化后的引脚熄灭。这里的 RGB_OFF 宏与led.h定义的宏相对应,用于将指定的颜色引脚设置为低电平,以避免初始化引脚时灯亮起。

总的来说,lec.c里代码的作用是根据传入的 RGB 类型初始化对应颜色的 LED 引脚,然后将引脚设置为熄灭状态。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_65575911/article/details/132158451

智能推荐

PCL_Tutorial2-1.7-点云保存PNG_pcl::io:savepng-程序员宅基地

文章浏览阅读4.4k次。1.7-savingPNG介绍代码详情函数详解savePNGFile()源码savePNGFile()源码提示savePNGFile()推荐用法处理结果代码链接介绍PCL提供了将点云的值保存到PNG图像文件的可能性。这只能用有有序的云来完成,因为结果图像的行和列将与云中的行和列完全对应。例如,如果您从类似Kinect或Xtion的传感器中获取了点云,则可以使用它来检索与该云匹配的640x480 RGB图像。代码详情#include <pcl / io / pcd_io.h>#incl_pcl::io:savepng

知乎问答:程序员在咖啡店编程,喝什么咖啡容易吸引妹纸?-程序员宅基地

文章浏览阅读936次。吸引妹子的关键点不在于喝什么咖啡,主要在于竖立哪种男性人设。能把人设在几分钟内快速固定下来,也就不愁吸引对口的妹子了。我有几个备选方案,仅供参考。1. 运动型男生左手单手俯卧撑,右手在键盘上敲代码。你雄壮的腰腹肌肉群活灵活现,简直就是移动的春药。2.幽默男生花 20 块找一个托(最好是老同学 or 同事)坐你对面。每当你侃侃而谈,他便满面涨红、放声大笑、不能自已。他笑的越弱_咖啡厅写代码

【笔试面试】腾讯WXG 面委会面复盘总结 --一次深刻的教训_腾讯面委会面试是什么-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏5次。今天 (应该是昨天了,昨晚太晚了没发出去)下午参加了腾讯WXG的面委会面试。前面在牛客上搜索了面委会相关的面经普遍反映面委会较难,因为都是微信的核心大佬,问的问题也会比较深。昨晚还蛮紧张的,晚上都没睡好。面试使用的是腾讯会议,时间到了面试官准时进入会议。照例是简单的自我介绍,然后是几个常见的基础问题:例如数据库索引,什么时候索引会失效、设计模式等。这部分比较普通,问的也不是很多,不再赘述。现在回想下,大部分还是简历上写的技能点。接下来面试官让打开项目的代码,对着代码讲解思路。我笔记本上没有这部分代码,所_腾讯面委会面试是什么

AI绘画自动生成器:艺术创作的新浪潮-程序员宅基地

文章浏览阅读382次,点赞3次,收藏4次。AI绘画自动生成器是一种利用人工智能技术,特别是深度学习算法,来自动创建视觉艺术作品的软件工具。这些工具通常基于神经网络模型,如生成对抗网络(GANs),通过学习大量的图像数据来生成新的图像。AI绘画自动生成器作为艺术与科技结合的产物,正在开启艺术创作的新篇章。它们不仅为艺术家和设计师提供了新的工具,也为普通用户提供了探索艺术的机会。随着技术的不断进步,我们可以预见,AI绘画自动生成器将在未来的创意产业中发挥越来越重要的作用。

获取list集合中重复的元素_list找到重复的元素-程序员宅基地

文章浏览阅读1.6w次,点赞3次,收藏13次。老规矩,二话不说直接上代码:package com.poinne17.test;import org.apache.commons.collections.CollectionUtils;import org.junit.Test;import java.util.*;/** * @author:Pionner17 * @date: 2017/9/3 22:41 * @em_list找到重复的元素

系统运维—1.0 解压缩_winzip收费-程序员宅基地

文章浏览阅读1k次。一、zip和unzip  一般情况下,windows中的压缩包都是rar或者zip格式,对应的压缩软件为winzip和winrar。winzip是免费的,winrar是收费的。rar比zip压缩率更高,即同样的文件压缩完后体积更小,同时因为国内盗版,以及winrar安装后,右击默认压缩为rar的原因,导致国内的rar的使用率远超zip。  放眼全世界,zip的使用率反而远超rar,在ubuntu中,zip是默认安装的,免费使用,而rar需要额外安装,并且收费。故在linux中一般情况下,我们使用zip格_winzip收费

随便推点

Flutter ListView ListView.build ListView.separated_flutter listview.separated和listview.builder-程序员宅基地

文章浏览阅读1.7k次。理解为ListView 的三种形式吧ListView 默认构造但是这种方式创建的列表存在一个问题:对于那些长列表或者需要较昂贵渲染开销的子组件,即使还没有出现在屏幕中但仍然会被ListView所创建,这将是一项较大的开销,使用不当可能引起性能问题甚至卡顿直接返回的是每一行的Widget,相当于ios的row。行高按Widget(cell)高设置ListView.build 就和io..._flutter listview.separated和listview.builder

2021 最新前端面试题及答案-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏14次。废话不多说直接上干货1.js运行机制JavaScript单线程,任务需要排队执行同步任务进入主线程排队,异步任务进入事件队列排队等待被推入主线程执行定时器的延迟时间为0并不是立刻执行,只是代表相比于其他定时器更早的被执行以宏任务和微任务进一步理解js执行机制整段代码作为宏任务开始执行,执行过程中宏任务和微任务进入相应的队列中整段代码执行结束,看微任务队列中是否有任务等待执行,如果有则执行所有的微任务,直到微任务队列中的任务执行完毕,如果没有则继续执行新的宏任务执行新的宏任务,凡是在..._前端面试

linux基本概述-程序员宅基地

文章浏览阅读1k次。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。_linux

JavaScript学习手册十三:HTML DOM——文档元素的操作(一)_javascript学习手册十三:html dom——文档元素的操作(一)-程序员宅基地

文章浏览阅读7.9k次,点赞26次,收藏66次。HTML DOM——文档元素的操作1、通过id获取文档元素任务描述相关知识什么是DOM文档元素节点树通过id获取文档元素代码文件2、通过类名获取文档元素任务描述相关知识通过类名获取文档元素代码文件3、通过标签名获取文档元素任务描述相关知识通过标签名获取文档元素获取标签内部的子元素代码文件4、html5中获取元素的方法一任务描述相关知识css选择器querySelector的用法代码文件5、html5中获取元素的方法二任务描述相关知识querySelectorAll的用法代码文件6、节点树上的操作任务描述相关_javascript学习手册十三:html dom——文档元素的操作(一)

《LeetCode刷题》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量-程序员宅基地

文章浏览阅读132次。《LeetCode学习》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量

php 公众号消息提醒,如何开启公众号消息提醒功能-程序员宅基地

文章浏览阅读426次。请注意,本文将要给大家分享的并不是开启公众号的安全操作风险提醒,而是当公众号粉丝给公众号发消息的时候,公众号的管理员和运营者如何能在手机上立即收到消息通知,以及在手机上回复粉丝消息。第一步:授权1、在微信中点击右上角+,然后选择“添加朋友”,然后选择“公众号”,然后输入“微小助”并关注该公众号。2、进入微小助公众号,然后点击底部菜单【新增授权】,如下图所示:3、然后会打开一个温馨提示页面。请一定要..._php微信公众号服务提示

推荐文章

热门文章

相关标签