RT-Thread对GPIO操作两种方式的区别:1)通过设备操作接口2)直接通过通用GPIO设备驱动

在学习RT-Thread设备驱动框架时,看到潘多拉开发板的RT-Thread例程资料中的文档《AN0002-RT-Thread-通用 GPIO 设备应用笔记》有如下描述,因此产生使用文档中未使用的方式1)通过设备操作接口 方法实现GPIO操作的想法!

使用潘多拉开发板进行两种不同的对GPIO操作方式的实现,打开潘多拉开发板自带例程的例程03_basic_key,可以发现例程是使用方式2即直接通过通用GPIO设备驱动实现对GPIO的操作,因此我们需要实现方式1通过设备操作接口对GPIO的操作。

如下图所示,左边箭头为方式1,右边的箭头为方式2:

例程03_basic_key的main函数使用方式2)直接通过通用GPIO设备驱动 的代码如下:

/** Copyright (c) 2006-2018, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-08-23     balanceTWK   first implementation*/#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>int main(void)
{unsigned int count = 1;/* 设置 RGB 红灯引脚的模式为输出模式 */rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);/* 设置 KEY0 引脚的模式为输入模式 */rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);while (count > 0){/* 读取按键 KEY0 的引脚状态 */if (rt_pin_read(PIN_KEY0) == PIN_LOW){rt_thread_mdelay(50);if (rt_pin_read(PIN_KEY0) == PIN_LOW){/* 按键已被按下,输出 log,点亮 LED 灯 */LOG_D("KEY0 pressed!");rt_pin_write(PIN_LED_R, PIN_LOW);}}else{/* 按键没被按下,熄灭 LED 灯 */rt_pin_write(PIN_LED_R, PIN_HIGH);}rt_thread_mdelay(10);count++;}return 0;
}

现在我们使用方式1)通过设备操作接口 实现潘多拉板载绿色LED的闪烁:

/** Copyright (c) 2006-2018, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-08-23     balanceTWK   first implementation*/#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>#define PIN_DEVICE_NAME		"pin"		/* 查找的pin设备的名称 */
static rt_device_t pin_dev;				/* pin设备句柄 */int main(void)
{rt_err_t res = RT_EOK;struct rt_device_pin_status pin_status;	/* 如果是在结构体定义时进行初始化,一定要注意元素顺序!!! */struct rt_device_pin_mode pin_mode;pin_status.pin = PIN_LED_G;pin_status.status = PIN_HIGH;pin_mode.pin = PIN_LED_G;pin_mode.mode = PIN_MODE_OUTPUT;/* 根据设备名称查找pin设备,获取设备句柄 */pin_dev = rt_device_find(PIN_DEVICE_NAME);if (!pin_dev){rt_kprintf("find %s failed!\n", PIN_DEVICE_NAME);return RT_ERROR;}/* 打开设备会将ref_count的值加1,只有ref_count不为0才能对设备进行读写操作 */res = rt_device_open(pin_dev, RT_DEVICE_OFLAG_RDWR);if (res != RT_EOK){rt_kprintf("open %s failed!\n", PIN_DEVICE_NAME);return RT_ERROR;}/* 设置pin模式 */res = rt_device_control(pin_dev, 0, &pin_mode);if (res != RT_EOK){rt_kprintf("set %s mode failed!\n", PIN_DEVICE_NAME);return RT_ERROR;}while (1){pin_status.status = PIN_LOW;rt_device_write(pin_dev, 0, &pin_status, sizeof(pin_status));rt_thread_mdelay(500);pin_status.status = PIN_HIGH;rt_device_write(pin_dev, 0, &pin_status, sizeof(pin_status));rt_thread_mdelay(500);}
}

编译后下载至开发板,发现绿灯以1HZ的频率闪烁。使用putty和开发板对应的串口进行通讯,发送list_device命令可以看到pin设备的ref_count为1表示被引用了一次。

至此,实现通过方式1)通过设备操作接口 对GPIO的操作!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语----情态动词(下)

should 应该 竟然 Youd should go to school right now. I should help him. How should i know. Im surprised tha he that he should be so rude to you. it worries me its a pity. You cant imagine.... ought to // 用在比较严肃的场合 You ought to take car…

清华大学-曾鸣-《ARM微控制器与嵌入式系统》I2C总线(一)

I2C是一种双向2线制同步串行通讯接口&#xff0c;是一类非常经典的串行总线通讯&#xff0c;理解好I2C通讯会帮助理解USB通讯、以太网通讯中的握手、数据帧等环节。 I2C的发展历史&#xff1a; SPI串行通讯主要是由MOTOROLA公司提出的&#xff0c;MOTOROLA公司的半导体部门独立…

清华大学-曾鸣-《ARM微控制器与嵌入式系统》I2C总线(二)

I2C&#xff08;Inter IC Bus&#xff09;的通讯数据帧&#xff1a; SCL线无方向区分&#xff0c;SDA线上有数据的流动方向。上图中灰色的代表的是主机向从机发送数据&#xff0c;此时SDA线的电平控制权由主机掌控&#xff0c;从机只能监听该线上的电平状态。白色代表的是从机向…

window.open 和showModalDialog的返回值

方法&#xff1a; 1: 在父级页面 test.aspx 的点击<input type"button" id"btnShow" οnclick"showItem();" value"显示子窗体"/>按钮触发 &#xff0c;然后 &#xff1a; <script language"JavaScript" type&qu…

RT-Thread I2C设备驱动框架的对接使用

I2C和SPI是MCU和板载芯片之间最常用的通讯方式&#xff0c;现在先介绍下I2C总线。I2C的基本原理也很简单&#xff0c;只需要两根线&#xff08;时钟线SCL和信号线SDA&#xff09;即可实现挂载在I2C总线上设备之间的相互通讯。I2C协议并未规定I2C总线上哪个是主机&#xff1f;哪…

给lnmp一键包中的nginx安装openresty的lua扩展

lnmp一键包&#xff08;https://lnmp.org&#xff09;本人在使用之后发现确实好用&#xff0c;能帮助我们快速搭建起lnmp、lamp和lnmpa的web生产环境&#xff0c;因此推荐大家可以多试试。但有的朋友可能需要使用openresty的lua扩展&#xff0c;这篇文章就会教你们怎么在军哥的…

RT-Thread 简介及架构

RT-Thread&#xff0c;全称是 Real Time-Thread&#xff0c;顾名思义&#xff0c;它是一个嵌入式实时多线程操作系统&#xff0c;基本属性之一是支持多任务&#xff0c;允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上&#xff0c;一个处理器核心在…

Linux中通过Socket文件描述符寻找连接状态介绍

针对下文的总结&#xff1a;socket是一种文件描述符 进程的打开文件描述符表 Linux的三个系统调用&#xff1a;open&#xff0c;socket&#xff0c;pipe 返回的都是一个描述符。不同的进程中&#xff0c;他们返回的描述符可以相同。那么&#xff0c;在同一个进程中&#xff0c;…

iOS HTML标签字符实体,转译字符串归类大全 【转载】

为什么要用转义字符串&#xff1f; HTML中<&#xff0c;>&#xff0c;&等有特殊含义&#xff08;<&#xff0c;>&#xff0c;用于链接签&#xff0c;&用于转义&#xff09;&#xff0c;不能直接使用。这些符号是不显示在我们最终看到的网页里的&#xff0c…

RT-Thread在github上的教程中图片显示不出来问题的解决方法

在github上查看RT-Thread STM32系列BSP制作教程时发现教程中所有的图片都加载不出来&#xff0c;非常影响教程的阅读使用。 使用记事本打开文件&#xff1a; C:\Windows\System32\drivers\etc\hosts 将如下内容复制粘贴到hosts文件末尾&#xff1a; # GitHub Start 140.82.11…

贝叶斯原理及其推断简介

1、贝叶斯公式及应用&#xff1a; 详见&#xff1a;链接ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.html 转载于:https://www.cnblogs.com/1995hxt/p/6527604.html

在STM32CubeMX生成的MDK5工程上添加RT-Thread Nano后双击工程名无法打开.map文件的解决方法

当我们基于STM32CubeMx完成芯片的基础配置&#xff0c;再将RT-Thread Nano添加到工程编译完成之后。双击工程名称发现无法打开工程的.map文件&#xff0c;.map文件是STM32开发中非常重要的一个文件&#xff0c;map文件中详细描述了各个函数在ROM中的存储地址和大小&#xff0c;…

Oracle trunc()函数的用法

1、取当年的第一天和当年的最后一天 select trunc(sysdate,YYYY),add_months(trunc(sysdate,YYYY),12)-1 from dual tselect to_char(trunc(add_months(last_day(sysdate), -1) 1), yyyy-mm-dd) "本月第一天", to_char(last_day(sysdate), yyyy-mm-dd) "本月最…

STM32实现USB虚拟串口原理(下)

中断传输应用如主机定期间隔送鼠标读取当前的输入信息&#xff0c;或键盘的输入键值 同步传输应用于音视频等对延迟有严格要求的场合 大容量传输对实时性没有太高要求&#xff0c;对延迟有较大的容忍&#xff0c;且在协议层面并未规定最大的容忍延迟时间&#xff0c;但能从协议…

js下载

下载用ajax不好使,得用表单提交的方式 download:function(url,paramObj){var doc document;//使用一个隐藏的form表单执行提交&#xff0c;没有则创建var downloadForm doc.getElementById(_downloadForm);if(!downloadForm){downloadForm doc.createElement(form);download…

RT-Thread中堆和栈内存的分配

在嵌入式软件开发中&#xff0c;我们经常会提到堆和栈&#xff0c;实际上堆和栈都是RAM上的物理内存空间&#xff0c;只是使用方式不同而已。栈和堆都是单片机RAM中一段连续的存储空间&#xff0c;该段空间一般在启动文件或链接脚本中指定&#xff0c;最后在C库的_main函数中进…

RT-Thread Nano版本和RT-Thread Master版本的关系

RT-Thread Nano版本和RT-Thread Master版本的关系&#xff1a; RT-Thread Master版本不仅仅是一个实时内核&#xff0c;还包含了丰富的中间层组件。 RT-Thread Nano是RT-Thread Master之上进行剪裁后形成的精简版&#xff0c;去掉了一些组件和各种开发板的BSP&#xff0c;仅保…

VSCODE修改文字编码格式为GB2312和TAB键为2个空格(MDK5和VSCODE联合开发STM32程序)

在MDK5中&#xff0c;代码、变量等的高亮显示或代码自动补全做的不是很好&#xff0c;经常会出现在A函数中有变量的高亮功能&#xff0c;在B函数中就没有了。特别是在RT-Thread创建的多个线程中&#xff0c;发现同一文件中的其它函数中的变量都有同一变量高亮&#xff0c;在RT-…

IP选路

一、IP层工作流程 &#xfffc; 二、 简单路由表 输入netstate -rn&#xff0c;得到如下&#xfffc; 其中flag的标志如下 U 该路由可以使用G 该路由是到一个网管&#xff08;路由器&#xff09;&#xff0c;否则&#xff0c;说明目的地是直接相连的 该标志区分了间接路由和…

[转]微信小程序安全浅析

本文转自&#xff1a;http://blog.csdn.net/baize_security/article/details/54582854 引言 近期微信小程序重磅发布&#xff0c;在互联网界掀起不小的波澜&#xff0c;已有许多公司发布了自己的小程序&#xff0c;涉及不同的行业领域。大家在体验小程序用完即走便利的同时&…