基于RTThread嵌入式物联网应用开发第二章GPIO操作实
第二章GPIO操作实验
本章主要内容为通过使用RTThread中的PIN设备接口函数对开发板上板载的LED灯进行操作。主要实现功能为点亮LED灯让其规律闪烁。1。1硬件介绍
在IOT开发板上已经为我们集成焊接了一个三色的RGB灯,具体位置如下图所示:
RGB灯图示
在官方给的原理图资料中我们也可以找到LED模块的电路图。如电路图所示,我们可以发现3个LED灯外接了一个3V的直流电源接口,后面的引脚接入到了单片机的引脚,所以我只需要将单片机的引脚输出改为低电平输出即可点亮LED灯。
LED灯电路原理图
LED灯单片机引脚图
1。2软件设计1。2。1单色灯点亮测试a)功能实现思路分析
从电路原理图中我们可以发现,LEDG对应了单片机的39号引脚(GPIOPE8)。若不想查看原理图,也可以查看官方给出的IO引脚分配表。分配表中也给出了LEDG对应的GPIO引脚为PE8。
所以我们只需要利用RTThread为我们提供的通用GPIO驱动来将PE8设置为低电平输出即可点亮LED灯。
我们需要使用的API函数主要有以下两个,功能分别为设置引脚模式与设置引脚电平。在stuido创建的工程下,有一个drivers的目录,此目录是RTThread为用户封装好的一些常用驱动库。此章节需要使用的为gpio驱动库。关于驱动库的使用方式以及介绍我们可以前往RTThread官方文档中进行查看,此部分内容为设备和驱动下的PIN设备。
在基于传统HAL库开发中,我们总的开发流程可总结为以下步骤:1。对GPIO口进行配置;2。GPIO口初始化;3。设置GPIO口工作模式;4。设置GPIO口引脚电平状态。使用RTThread进行开发也可总结为以下几个步骤:1。定义引脚编号映射;2。设置引脚工作模式;3。设置引脚电平状态。基于此流程我们可以对软件进行设计。总流程图如图所示:
软件设计流程图
在RTThread中获取引脚编号的方式有三种,一种是利用API函数的方式、一种是利用宏定义的方式还有一种是查看驱动文件来获取引脚编号。此历程采用查看驱动文件来获取引脚编号,其他方式的使用场景请自行前往官方文档查看。
查看驱动文件来获取引脚编号具体实现步骤如下:
1。打开drivers目录下的drvgpio。c文件。打开过后我们可以看到已经给我们定义了非常多的相关宏定义以及结构体
2。找到staticconststructpinindexpins〔〕结构体,此结构体中为我们设置了单片机与操作系统引脚编号的映射关系。
3。找寻自己需要的端口号。以STM32PIN(72,E,8)为例,E为GPIO口名称,即GPIOE。8为引脚号,即PE8。则72就是对应的引脚编号。所以PE8端口在RTThread中对应的引脚编号为72。我们在使用过程中只需要定义一个宏定义值为72即可对应单片机的PE8端口。
在我们得到了引脚编号后,即可进行代码编写,调用想用的API函数进行GPIO口的工作模式设定以及电平工作状态设定。b)设置引脚模式
引脚在使用前需要先设置好其工作模式是输入模式还是输出模式,需要调用的API函数接口如下:voidrtpinmode(rtbasetpin,rtbasetmode);
具体参数详解如下表:
参数
描述
pin
引脚编号
mode
引脚工作模式
引脚编号即为我们在上一步中在驱动文件中查询到的引脚编号,比如PE8为72,我们只需要传入72即可。引脚的工作模式目前RTThread支持的宏定义为5中宏定义。具体解释如下表所示:
参数
描述
definePINMODEOUTPUT0x00
输出
definePINMODEINPUT0x01
输入
definePINMODEINPUTPULLUP0x02
上拉输入
definePINMODEINPUTPULLDOWN0x03
下拉输入
definePINMODEOUTPUTOD0x04
开漏输出
所以参数mode我们只需要传入定义好的宏定义即可。c)设置引脚电平
上一步我们设置完了引脚的工作模式为输出模式,这一步我们需要对引脚的电平进行设置,从9。1节中我们可以得到只需要将GPIO引脚设置为低电平即可点亮LED灯。所以我们只需要利用API函数将其设置成为低电平即可完成此功能。
需要使用的API函数接口如下:voidrtpinwrite(rtbasetpin,rtbasetvalue);
参数讲解如下:
参数
描述
pin
引脚编号
value
电平逻辑值,可取2种宏定义值之一:PINLOW低电平,PINHIGH高电平d)具体代码实现
在上一小节中,我们已经将从硬件到使用API函数接口去实现功能做了完整的分析。下面我们将开始着手编写代码,进行实际操作。
具体实现步骤如下:
1。打开我们新建的工程,新建一个led的源文件。
2。在源文件中导入需要的头文件includertthread。h,includertdevice。h;定义led线程句柄、定义相关宏定义的值;
3。编写led线程入口函数,入口函数里实现在上一小节中梳理的引脚设置模式。
4。编译、下载运行。导入头文件includertthread。hincludertdevice。h定义线程句柄与GPIO引脚宏定义staticrtthreadtLEDGThreadRTNULL;defineLEDG72defineTHREADPRIORITY25defineTHREADSTACKSIZE512defineTHREADTIMESLICE5编写入口函数staticvoidLEDGThreadEntry(voidparmas){设置引脚模式rtpinmode(LEDG,PINMODEOUTPUT);设置引脚电平状态rtpinwrite(LEDG,PINLOW);rtkprintf(ledgon。);}intledG(void){创建线程LEDGThreadrtthreadcreate(ledthread,LEDGThreadEntry,RTNULL,THREADSTACKSIZE,THREADPRIORITY,THREADTIMESLICE);if(LEDGThreadRTNULL){rtkprintf(createledthreadfailed。);return1;}启动线程rtthreadstartup(LEDGThread);return0;}导出到msh命令列表中MSHCMDEXPORT(ledG,ledG);
5。打开终端命令行执行ledG命令,查看结果。我们可以发现在终端控制台中会打印一段话ledgon。且在开发板上会发现LED灯部分绿色的灯亮起。如下图所示:
实验结果图1。2。2呼吸灯应用a)功能实现思路分析
我们在上一小节中对开发板中单色RGB灯进行了点亮操作,从电路图中我们可以发现还有另外两只RGB灯可供使用。在此小节我们将实现三色灯交替闪烁的功能。
对于电路原理图以及单片机引脚接口都可以在原理图中以及引脚分配表中查询到,LEDB对应了PE9,LEDG对应了PE8,LEDR对应了PE7。在代码实现部分我们的步骤也分为以下三步:1。定义引脚编号映射;2。设置引脚工作模式;3。设置引脚电平状态。在设置引脚电平状态时我们需要对另外两个RGB灯进行关闭,确保在一个时间段能开启一个RGB灯,依次循环即可实现呼吸灯的效果。具体流程图如下所示:
软件流程图b)具体代码实现
我们需要使用的API接口函数和查看单片机引脚编号的方法已经在上小节中做了介绍,这里就不在赘述了。我们编写功能代码时,按照流程图的思路进行编写即可。
1。新建一个源文件,文件名自行更改。
2。导入相关的头文件。
3。创建RGB线程,并编写线程入口函数,入口函数中实现我们需要的功能。
4。编译、下载、运行。
具体代码实现如下:导入头文件includertthread。hincludertdevice。h定义线程句柄与GPIO引脚宏定义staticrtthreadtRGBThreadRTNULL;defineLEDB73defineLEDG72defineLEDR71defineTHREADPRIORITY25defineTHREADSTACKSIZE512defineTHREADTIMESLICE5编写入口函数staticvoidRGBThreadEntry(voidparmas){设置引脚模式rtpinmode(LEDB,PINMODEOUTPUT);rtpinmode(LEDG,PINMODEOUTPUT);rtpinmode(LEDR,PINMODEOUTPUT);设置引脚电平状态1。先打开LEDB其他关闭然后延迟500ms打开LEDG其他关闭延迟500ms,打开LEDR其他关闭while(1){rtpinwrite(LEDB,PINLOW);rtpinwrite(LEDG,PINHIGH);rtpinwrite(LEDR,PINHIGH);rtthreadmdelay(500);rtkprintf(LEDBon。);rtpinwrite(LEDB,PINHIGH);rtpinwrite(LEDG,PINLOW);rtpinwrite(LEDR,PINHIGH);rtthreadmdelay(500);rtkprintf(LEDGon。);rtpinwrite(LEDB,PINHIGH);rtpinwrite(LEDG,PINHIGH);rtpinwrite(LEDR,PINLOW);rtthreadmdelay(500);rtkprintf(LEDRon。);}}intRGBDemo(void){RGBThreadrtthreadcreate(RGBThread,RGBThreadEntry,RTNULL,THREADSTACKSIZE,THREADPRIORITY,THREADTIMESLICE);if(RGBThreadRTNULL){rtkprintf(creatergbthreadfailed);return1;}rtthreadstartup(RGBThread);return0;}MSHCMDEXPORT(RGBDemo,RGBDemo);
我们把代码编译、下载到开发板中,打开终端命令行,输入RGBDemo命令执行此线程代码。可以发现实验结果如下。
1。RGB灯部分红、蓝、绿交替闪烁。
2。在终端命令行中循环打印led灯日志。
准备买几件飞天茅台存着给儿子结婚用,整件的应该如何封装保存?谢邀!茅台酒的储存需要注意以下三个问题:第一,尽量营造密闭空间由于酒当中的酒精是具有挥发性的,酒的挥发极易受到外界环境的干扰,如果保持有密闭空间的话,外界干扰……
外媒打压华为的效果出现了都知道华为是国内最舍得投钱做研发的公司,仅2022年,华为的研发投入就超过1300亿元,位列全球前五,国内第一。而这10年下来,华为研发经费更是突破8000亿,放眼全球都是凤毛……
中国世界文化遗产预备名单的详细名单?预备名单里包含26项文化遗产:1中国白酒老作坊:杏花村汾酒老作坊(山西省汾阳市)、成都水井街酒坊(四川省成都市)、泸州老窖作坊群(四川省泸州市)、古蔺县郎酒老作坊(四川省……
山东真的没有名酒吗?山东有名酒,还很早就有,唐朝时就与山西名酒齐名。只不过山东喝酒太出名了,压过了产酒的名气。这里和酒友们分享山东值得骄傲的三种酒。第一种,鲁酒。有记载的历史是孔子喝酒。印象……
上海有哪些特色小吃?老上海的街头小吃称得上品种繁多,价廉物美、果腹饱肚、吃食方便,是深受群众喜爱的点心,从清晨的四五点钟起上市供应,随君选食。粢饭是颇受大多数人喜爱的一种大众化早点,糯米掺粳米配以……
3k价位段的不二之选!双芯旗舰vivoX80打造出色体验纵观目前的3k价位段手机市场,性能强的手机往往在影像、设计等方面的表现不太行,影像强的手机往往在性能、游戏等方面的表现不太行,各个方面都没有明显短板的全能机型真的非常少,但并不……
别信云体验!华硕无畏Pro152022到底好不好?真实用户说最近正值暑期数码产品大促期间,很多小伙伴都会选择在这个时段给自己换置一些数码设备,而作为上班族的我也不例外,由于经常需要外出出差和移动办公,我也打算为自己入手一款笔记本。目前来……
你们家的一日三餐是怎么样的,可以晒晒吗?我的家乡在山西省晋东南地区。那里的一日三餐主要是以面食为主,其次吃的最多的就是大米和黄小米。山西面食在全国都是极为著名的,它是地方地方传统特色面食文化代表之一,历史悠久,……
一碗米饭玩转营养早餐!不调味不用捏,宝宝吃一次馋一次早餐想要吃得营养,不一定要准备得多么丰盛,家里现有的食材也可以做得又健康又丰富。米饭家里都有的吧,蔬菜鸡蛋家里也是常备的吧,造型随手一凹,精致可爱的饭团便呈现在眼前,美味又吸睛……
林志玲家暴风波后生图曝光,法令纹黑眼圈抢镜,眼神憔悴状态不佳作为曾经的湾湾第一美女,林志玲的颜值一直都备受媒体的关注,近日,港媒曝光了一组林志玲拍摄广告的生图,照片中的她满脸痘印,黑眼圈、法令纹十分明显,画面曝光后,迅速引发热议。……
四川省土地面积最小的地级市,不到成都的13,人口不到320万我国南北纵横数千公里,有省市自治区数十个,拥有无数的特色城市。像三亚、厦门、大连等地,都拥有让人向往的海滩美景,而大理、丽江、西安等城市,就拥有文化底蕴深厚的古城,这些特……
为什么有的香港人喝茶喜欢喝寿眉?分享一下,我在收老白茶时了解到的情况。2008年左右,我曾经收藏一批从香港药铺买来的寿眉,据卖家当时说已经在他家存了35年。这也是我第一次喝这么老的寿眉,浓郁的老茶香气,……