Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
dht11
GPIO
NXP-MCXN947
NXP MCXN947 测评(2)基于GPIO 控制实现DHT11 温湿度采集
发布于 2024-04-25 23:59:07 浏览:320
订阅该版
[tocm] 环境搭建参考之前的文章 https://club.rt-thread.org/ask/article/48aa7894ecce66dc.html ## PIN 相关设置解析 RT-Thread 中的pin 驱动都使用了统一接口如下: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240425/56af33d1e6a7a9be879b1dfb7de65a14.png) 支持pin的模式设置、pin 状态读取、pin接口设置、使能管脚中断、设置管脚中断、取消管脚中断、使能管脚中断 这几个函数,下面针对这几个函数讲解下如何使用。 ### rt_pin_mode rt_pin_mode 主要进行管脚模式设置,主要支持如下设置 ```c #define PIN_MODE_OUTPUT 0x00 #define PIN_MODE_INPUT 0x01 #define PIN_MODE_INPUT_PULLUP 0x02 #define PIN_MODE_INPUT_PULLDOWN 0x03 #define PIN_MODE_OUTPUT_OD 0x04 ``` 分别是 输出模式 输入模式 输入上拉 输入下拉 输出开漏模式 rt_pin_mode 调用底层函数是 void mcx_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) rt_base_t pin 的输入跟管脚对应关系是 ```c pin = PortNum*32+PinNum ``` PortNum 对应 PORT0 PORT1 PORT2 PORT3 PORT4 (0 1 2 3 4) PinNum 对应管脚数 举个例子,如PORT1 PIN 14 则pin = 1*32+14 = 46 后续的管脚模拟都会用的到,目前支持的GPIO状态还相对少,后续如果增加控制可以开启RT_USING_PINCTRL 并完成相关驱动的适配 ### rt_pin_read 当把管脚配置为输入模式后,rt_pin_read 调用mcx_pin_read 获取当前管脚的逻辑状态 ```c static rt_ssize_t mcx_pin_read(rt_device_t dev, rt_base_t pin) { return GPIO_PinRead(PIN2GPIO(pin), GET_GPIO_PIN(pin)); } ``` ### rt_pin_write 当 把管脚设置为输出模式后,可通过rt_pin_write 进行管脚的电平设置,支持 高电平 低电平设置,底层调用的是mcx_pin_write ```c static void mcx_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value) { GPIO_PinWrite(PIN2GPIO(pin), GET_GPIO_PIN(pin), value); } ``` ### rt_pin_attach_irq 设置管脚的中断触发状态,支持高电平、低电平、上升沿、下降沿、边沿触发,调用底层的mcx_pin_attach_irq,可设置回调函数 ```c static rt_err_t mcx_pin_attach_irq(struct rt_device *device, rt_base_t pin, rt_uint8_t mode, void (*hdr)(void *args), void *args) { switch (mode) { case PIN_IRQ_MODE_RISING: GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptRisingEdge); break; case PIN_IRQ_MODE_FALLING: GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptFallingEdge); break; case PIN_IRQ_MODE_RISING_FALLING: GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptEitherEdge); break; case PIN_IRQ_MODE_HIGH_LEVEL: GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptLogicOne); break; case PIN_IRQ_MODE_LOW_LEVEL: GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptLogicZero); break; } pin_irq_hdr_tab[pin].pin = pin; pin_irq_hdr_tab[pin].mode = mode; pin_irq_hdr_tab[pin].hdr = hdr; pin_irq_hdr_tab[pin].args = args; return RT_EOK; } ``` ### rt_pin_detach_irq rt_pin_detach_irq 调用底层mcx_pin_detach_irq,取消当前管脚的中断设置 ```c static rt_err_t mcx_pin_detach_irq(struct rt_device *device, rt_base_t pin) { GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptStatusFlagDisabled); return RT_EOK; } ``` ### rt_pin_irq_enable rt_pin_irq_enable 可用于gpio 中断的开启及关闭,调用底层的 mcx_pin_irq_enable ```c static rt_err_t mcx_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled) { if(enabled) { EnableIRQ(PIN2IRQ(pin)); } else { DisableIRQ(PIN2IRQ(pin)); } return RT_EOK; } ``` ## 利用PIN 接口实现 DHT11 温度湿度的解析 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240425/08d5919dea152fac6ca5273cc033d356.png.webp) 相关控制时序参考 https://blog.csdn.net/qq_45863399/article/details/119982631 这里讲下如何进行dhtxx 库的移植 ### dhtxx库添加 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240425/64f468fbf7b21279f2d577f0b237a63f.png) 我这里使用的是 RT-Thread ENV V1.5.0 版本,强烈建议大家使用,舍弃了之前的menuconfig ,代替的是pyconfig ```c scons --pyconfig ``` 输入上面的命令 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240425/2b594519bbe03475d8827c568582bc55.png) 界面有常用的按钮设置,方便进行存储 、打开、搜索等设置,相当方便 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240425/907b955a3632471094732a4f0d87e6a4.png) 搜索dhtxx 选择DHTXX 点击下面的 jump 调转相应界面,按图进行设置 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240425/3accd57e7e33f577c5f7c45a3d4a8f91.png) GPIO 可以针对自己的连接进行设置,我这里使用的是PORT1 PIN 14 所以PIN=32*1+14 =46 然后点击保存,运行 ```c //更新组件 pakgs --update //重新生成keil 工程 scons --target=mdk5 ``` 生成keil 工程注意rtconfig.py keil 改成自己的keil安装位置 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240425/0e23f277bed2390f8d6a0fc99bb1a64e.png.webp) ### dhtxx库修改 1.去除 sensor_asair_dhtxx.c 及 dhtxx.c 中的 RT_WEAK void rt_hw_us_delay(rt_uint32_t us) 这里使用board.c 中的设置 2. dhtxx.h 中的 ```c #include
``` 替换为 ```c #include
``` 由于之前库使用的rt 4.0 版本,5.0 版本 sensor.h 在drivers文件夹下面 ### dhtxx 输出测试 main.c 中添加 ```c #include "dhtxx.h" dht_device_t sensor = dht_create(PKG_USING_DHTXX_SAMPLE_PIN); ``` 主循环中添加 ```c rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 1 */ for(int i=0;i<1000;i++) { rt_hw_us_delay(500); } /* Delay 500mS */ rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 0 */ for(int i=0;i<1000;i++) { rt_hw_us_delay(500); } if(dht_read(sensor)) { rt_int32_t temp = dht_get_temperature(sensor); rt_int32_t humi = dht_get_humidity(sensor); rt_kprintf("Temp: %d, Humi: %d\n", temp, humi); } else { rt_kprintf("Read dht sensor failed.\n"); } ``` 串口log 中可打印出相应的湿度及温度 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240425/9682111b8a414deb3ef4be96afedaf12.png) 相关代码在下面链接 https://gitee.com/xinshuwei/NXP_MCXN947_project.git 实现视频如下:
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
xinshuwei
这家伙很懒,什么也没写!
文章
8
回答
0
被采纳
0
关注TA
发私信
相关文章
1
drivers- pin
2
bsp 里面的drivers/gpio.c 少了一个功能
3
stm32f407移植RTT中gpio设备驱动问题
4
config PB4(NJTRST) to GPIO
5
RT-Thread的GPIO设备驱动问题
6
关于pin.c文件中语句可能出现的bug
7
RT-Thread学习笔记--线程创建与官方Pin设备驱动调用
8
【应用笔记】小白也能玩转RT-Thread之通用GPIO设备【官方出品
9
串口引脚定义中的GPIO_Pin_sources是社么意思?
10
RTT -GPIO 使用例程
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部