当前位置: 首页 > news >正文

GD32VW553-IOT V2开发版【温湿度检测】

一、硬件介绍

1、产品特点

萤火工场基于兆易创新GD32VW553(GD32VW553HMQ7)无线双模MCU研发、RISC-V内核的32位MCU的开源硬件

GD32VW553系列MCU采用了全新的开源指令集架构RISC-V处理器内核,主频可达160MHz。集成了高达4MB Flash及320KB SRAM,另有32KB可配置指令高速缓存(I-Cache),大幅提升了CPU处理效率,支持2.4GHz Wi-Fi 6及BLE5.2无线连接标准;

性能参数

功能参数
FLASH(KB)4096
SRAM(KB)320
时钟———————————
General Timer(16-bit)2
General Timer(32-bit)2
Advanced Timer(16-bit)1
Basic Timer(16-bit)1
SysTick(64-bit)1
Watchdog2
RTC1
接口———————————
USART1
UART2
I2C2
SPI1
QSPI1
Wi-Fi 61
BLE 5.21
12bit ADC Units(Channels)1(9)

2、硬件升级优化

经过一年,对比上一代,硬件布局升级,进行了系统性优化,更加的方便好用了;

Type-C 口升级: 集成串口功能, 简化调试与程序下载流程, 提升开发便捷性;
新增开关: 增设用户可自定义按键及指示灯, 拓展交互控制与状态显示功能;
板面布局优化: 背面增加引脚丝印, 正面仅保留关键器件丝印, 布局清晰及信息聚焦;
FLASH 焊接位: 移至背面, 减少焊接风险, 增加开源二次开发的灵活性;
BOOT 开关优化: 升级为拔码式设计, 简化操作逻辑, 提升切换效率;
稳固性增强: 板厚增至 1mm, 提升了整体结构强度与抗变形能力 ;

实物如下:

GD32VW55x系列 支持 cJTAG 和 JTAG,不支持 SWD 的调试接口
需使用GDLink / JLink 调试器

在这里插入图片描述

3、功能引脚示意图 / 原理图

开发板相关手册 / 资料下载

板载LED灯

LED1:电源指示灯 🔴

USR_LED:PB2 🔴

BOOT选择 (SW1切换)

BOOT0:PC8

BOOT1:PB1

按键

KEY1:复位按钮

KEY2:PB11 (USR_KEY)

在这里插入图片描述

引脚定义

板载Type-C串口功能: PB15 / PA8 (UART1_RX / TX)
USART0(PB15 和 PA8), UART1(PA4 和 PA5),UART2(PA6 和 PA7)

引脚复用功能
PC8(BOOT0)TIMER2_CH2, I2C0_SDA, I2C1_SDA, USART0_TX, UART1_TX
PB0TIMER0_CH1_ON, TIMER0_CH0, TIMER0_CH2, UART1_TX, I2C0_SCL, TIMER2_ETI, TIMER16_CH0, UART2_CTS, TIMER0_BRKIN
附加功能:ADC_IN8
PA9SPI_MOSI, TIMER0_CH1, QSPI_SCK, USART0_TX, TIMER15_CH0_ON
PA10SPI_MISO, TIMER0_CH2, QSPI_CSN, TIMER16_CH0, USART0_RX
PA11SPI_SCK, TIMER0_CH3, QSPI_IO0, TIMER16_BRKIN, TIMER1_CH3
PA12(WKUP3)TIMER0_ETI, TIMER0_CH3, QSPI_IO1, SPI_NSS, USART0_CK, TIMER1_CH2, TIMER16_CH0_ON
PB13TIMER0_CH0_ON, TIMER1_CH3, I2C1_SDA, TIMER15_CH0
PB12TIMER0_BRKIN, TIMER0_CH3, TIMER1_CH2, I2C1_SCL
PB4(NJTRST)TIMER1_CH0, TIMER1_ETI, QSPI_IO3, USART0_TX, UART1_TX
PB3(JTDO)TIMER1_CH1, QSPI_IO2, USART0_RX, UART1_RX, TIMER15_BRKIN
PA15(JTDI)TIMER1_CH0, TIMER1_ETI, I2C0_SCL, I2C1_SCL, USART0_RX, UART1_RX
附加功能:ADC_IN8
PA14(JTCK)I2C1_SMBA, I2C1_SDA, USART0_RTS, UART1_RTS
PA13(JTMS)I2C0_SMBA, I2C1_SCL, USART0_CTS, UART1_CTS
PB15(UART1_TX)RTC_REFIN, TIMER0_CH2_ON, TIMER2_CH0, I2C0_SCL, I2C1_SCL, USART0_TX, IFRP_OUT
PA8(UART1_RX)CK_OUT0, TIMER0_CH0, USART0_RX, I2C0_SDA, I2C1_SDA, USART0_CK, TIMER15_CH0, RTC_OUT, TIMER0_CH2_ON
PA7(WAKEUP2)I2C1_SDA, TIMER0_CH0_ON, TIMER2_CH1, QSPI_IO1, SPI_NSS, SPI_MOSI, TIMER0_CH1_ON, UART2_RX, TIMER1_CH2
附加功能:ADC_IN7
PA6TIMER2_CH0, QSPI_IO0, I2C1_SCL, SPI_MISO, SPI_SCK, TIMER0_CH1, TIMER1_CH1, UART2_TX
附加功能:ADC_IN6
PA5UART1_RX, TIMER2_ETI, QSPI_CSN, SPI_MISO, SPI_SCK, TIMER0_CH1_ON
附加功能:ADC_IN5
PA4UART1_TX, SPI_MOSI, QSPI_SCK, SPI_NSS, TIMER0_CH1
附加功能:ADC_IN4
PA3USART0_RTS, TIMER1_CH3, I2C0_SDA, SPI_NSS, TIMER0_CH0_ON, UART1_RX, RTC_OUT
附加功能:ADC_IN3
PA2USART0_CTS, TIMER1_CH2, I2C0_SCL, SPI_SCK, TIMER0_CH0, UART1_TX
附加功能:ADC_IN2
PA1USART0_RX, TIMER1_CH1, SPI_MISO, UART1_RTS
PA0(WAKEUP0)USART0_TX, TIMER1_CH0, TIMER1_ETI, SPI_MOSI, UART1_CTS, TIMER0_ETI
附加功能:ADC_IN0, RTC_TAMP1
PB1TIMER0_CH2_ON, TIMER0_CH0_ON, TIMER2_CH2, UART1_RX, I2C0_SDA, TIMER16_CH0_ON, UART2_RTS
附加功能:BOOT1

BOOT 引导模式配置

启动时,使用 BOOT0 和 BOOT1 引脚选择引导存储器地址
选择从 ROM 启动,FLASH 启动或者 SRAM 启动

BOOT0BOOT1引导地址引导区域
0-0x08000000SIP Flash
0-0x0BF46000secure boot
100x0BF40000Bootloader / ROM
110x20000000SRAM
1-0x0BF40000Bootloader / ROM

主要原理图:

在这里插入图片描述

系统框图
在这里插入图片描述

4、温湿度传感器【DHT11】

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
可以测量相对湿度和温度测量,并可以只使用一根数据线进行温湿度采集。

在这里插入图片描述

规格参数

性能参数
工作电压3-5.5V
测量分辨率8 bit
湿度量程20 - 90 %RH
湿度精度±5 %RH
温度量程0 - 50 ℃
温度精度±2 ℃
通信协议单总线

通讯协议

DHT11使用的是单总线通信,即发送数据与接收数据都在一根数据线上,通过规定的时序进行控制。

图 1

从左向右看,时序一开始,主机信号就保持着高电平,所以引脚初始化完毕时,及时给引脚输出高电平。因为模块的数据线要求空闲时,要保持高电平状态。(模块上已经接了上拉电阻,使数据线一直保持高电平)

根据时序图可以知道,主机发送一次开始信号,待主机开始信号结束后,DHT11 发送响应信号,送出温湿度数据,并触发一次数据采集给下一次数据读取作准备。因此完成一次数据读取需要进行起始信号、响应信号、数据接收、结束信号。

读取数据步骤

起始信号:主机接入数据线的I/O输出低电平,且低电平保持时间不能小于 18ms。

图 2

响应信号:等待模块的响应信号到来。将数据线改为输入模式,如果接入到低电平,说明接收到模块的响应。

图 3

数据传输:主机接收模块发送的40位数据,其中,位数据 ‘0’ 表示54us的低电平,27us的高电平;位数据 ‘1’ 表示54us的低电平,74us的高电平。两个格式的分辨主要是高电平的输出时长不同。

图 4

结束信号:模块的数据线输出 40 位数据后,是以低电平结束,它会继续输出低电平 54 微秒后转为输入状态,主机需要转为输出状态,输出高电平释放总线。

DHT11模块一次完整的数据传输为40bit,高位先出。

数据格式

8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据 + 8bit校验和

二、硬件连接

连接方式

硬件引脚--
开发板VUSBGNDPA5
DHT11VCCGNDDATA

实物效果

在这里插入图片描述

三、代码编写

实现效果:将温湿度模块,检测到的温湿度数据通过串口输出到上位机显示;

DHT11.h

#ifndef _DHT11_H_
#define _DHT11_H_#define delay_ms(x) delay_1ms(x)
#define delay_us(x) delay_1us(x)#define DHT11_DAT_GPIO_RCU       RCU_GPIOA   // DHT11数据引脚
#define DHT11_DAT_GPIO_PORT      GPIOA       // DHT11数据端口
#define DHT11_DAT_GPIO_PIN       GPIO_PIN_5  // DHT11数据引脚// 开启DHT11数据引脚时钟
#define DHT11_DAT_GPIO_CLK_ENABLE()   rcu_periph_clock_enable(DHT11_DAT_GPIO_RCU)// 设置DHT11输出高或低电平
#define DATA_GPIO_OUT(x)    gpio_bit_write(DHT11_DAT_GPIO_PORT, DHT11_DAT_GPIO_PIN, x)// 获取DHT11数据引脚高低电平状态
#define DATA_GPIO_IN        gpio_input_bit_get(DHT11_DAT_GPIO_PORT, DHT11_DAT_GPIO_PIN)void DHT11_Init(void);//初始化DHT11
uint8_t DHT11_Read_Data(float *temperature, float *humidity);void delay_1us(uint32_t count);	//us延时#endif

DHT11.c

#include "dht11.h"#define DHT11_TIMEOUT   1000    // 超时阈值void DHT11_Init(void)
{/* 使能DHT11数据引脚时钟 */DHT11_DAT_GPIO_CLK_ENABLE();/* 配置DHT11数据引脚为上拉输出模式 */gpio_mode_set(DHT11_DAT_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, DHT11_DAT_GPIO_PIN);/* 设置DHT11数据引脚为推挽输出,速度25MHz */gpio_output_options_set(DHT11_DAT_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, DHT11_DAT_GPIO_PIN);/* 设置DHT11数据引脚输出高电平 */DATA_GPIO_OUT(1);delay_1ms(100); // 等待DHT11稳定
}void DHT11_GPIO_Mode_OUT(void)
{/* 配置DHT11数据引脚为输出模式 */gpio_mode_set(DHT11_DAT_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, DHT11_DAT_GPIO_PIN);/* 设置DHT11数据引脚为推挽输出,速度25MHz */gpio_output_options_set(DHT11_DAT_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, DHT11_DAT_GPIO_PIN);
}void DHT11_GPIO_Mode_IN(void)
{/* 配置DHT11数据引脚为上拉输入模式 */gpio_mode_set(DHT11_DAT_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, DHT11_DAT_GPIO_PIN);
}void DHT11_Start(void)
{DHT11_GPIO_Mode_OUT(); // 输出模式DATA_GPIO_OUT(1);DATA_GPIO_OUT(0);delay_ms(20);        // 保持18+ms低电平DATA_GPIO_OUT(1);delay_us(25);        // 主机释放总线DHT11_GPIO_Mode_IN(); // 切换输入模式
}uint8_t DHT11_CheckResponse(void)
{uint32_t timeout = 0;// 等待从机响应发送电平响应(低电平)(80µs)timeout = DHT11_TIMEOUT;while(DATA_GPIO_IN && timeout--){if(timeout == 0){printf("DHT11_CheckResponse Failed[1]!!\r\n");return 0; // 失败}}// 等待从机响应发送电平响应(高电平)(80µs)timeout = DHT11_TIMEOUT;while((!DATA_GPIO_IN) && timeout--){if(timeout == 0){printf("DHT11_CheckResponse Failed[2]!!\r\n");return 0; // 失败}}// 进入前导低电平timeout = DHT11_TIMEOUT;while(DATA_GPIO_IN && timeout--){if(timeout == 0){printf("DHT11_CheckResponse Failed[3]!!\r\n");return 0; // 失败}}return 1;
}uint8_t DHT11_ReadBit(void)
{uint8_t bit = 0;uint8_t timeCount = 0;uint32_t timeout;// 等待前导低电平过去// 等待信号线由低变高timeout = DHT11_TIMEOUT;while((!DATA_GPIO_IN) && timeout--){if(timeout == 0){printf("DHT11_ReadBit Failed[1]!!\r\n");return 0;}}// 判断是0还是1timeout = DHT11_TIMEOUT;while(DATA_GPIO_IN && timeout--){timeCount++;delay_us(1); // 等待1usif(timeout == 0){printf("DHT11_ReadBit Failed[2]!!\r\n");return 0; // 失败}}// 只要大于30us的高电平即可判断为数据1if(timeCount >= 30)bit = 1; // 数据1elsebit = 0; // 数据0return bit;
}uint8_t DHT11_Read_Data(float *temperature, float *humidity)
{int i;uint8_t data[5] = {0};uint64_t val = 0;// 开始起始信号DHT11_Start();// 检查响应是否合规if(0 == DHT11_CheckResponse()){printf("DHT11_CheckResponse Failed!!\r\n");return 0;}// 数据读取核心(40-bit)for(i = 0; i < 40; i++){val <<= 1;val |= DHT11_ReadBit();}// 校验与数据提取data[0] = (val >> 32) & 0xFF; // 湿度整数data[1] = (val >> 24) & 0xFF; // 湿度小数data[2] = (val >> 16) & 0xFF; // 温度整数data[3] = (val >> 8)  & 0xFF; // 温度小数data[4] = val & 0xFF;         // 校验和// 校验计算:前4字节和 = 第5字节if ((data[4] != (data[0] + data[1] + data[2] + data[3])) ||(data[4] == 0)) {printf("CheckSum Failed!!!\r\n");return 0; // 校验失败}// 保存温湿度*humidity    = data[0] + (data[1] * 0.1f);  // 湿度(%)*temperature = data[2] + (data[3] * 0.1f);  // 温度(℃)return 1;
}void delay_1us(uint32_t count)
{uint64_t ticks;uint64_t told, tnow;uint64_t tcnt = 0;uint64_t reload = SysTimer_GetCompareValue(); // 获取比较值作为重载值/* 获得延时经过的 tick 数 *//* CPUTimer 时钟源是40MHz,是SystemCoreClock的1/4 */ticks = (uint64_t)count * ((SystemCoreClock / 4) / 1000000);/* 获取当前时间 */told = (uint64_t)SysTimer->MTIMER;while (1){/* 循环获得当前时间,直到达到指定的时间后退出循环 */tnow = (uint64_t)SysTimer->MTIMER;if (tnow != told){if (tnow < told){/* 处理计数器回绕 */tcnt += (reload - told) + tnow;}else{tcnt += tnow - told;}told = tnow;if (tcnt >= ticks){break;}}}
}

main.c

int main(void)
{// 时钟配置systick_config();// 初始化串口 USART0gd_eval_com_init(USART0);DHT11_Init();/* 空读两次 */DHT11_Read_Data(NULL, NULL);delay_1ms(1000); // 等待DHT11稳定DHT11_Read_Data(NULL, NULL);delay_1ms(1000); // 等待DHT11稳定while (1){float temperature = 0.0;float humidity = 0.0;if (DHT11_Read_Data(&temperature, &humidity)){printf("\n");printf("Temperature = %.2f\r\n", temperature);printf("Humidity    = %.2f\r\n", humidity);}else{printf("\r\nRead Error!!\r\n");}delay_ms(1000);}
}

四、程序烧录

1、用Type-C数据线连接开发板至电脑上;

2、打开烧录工具GD32AllInOneProgrammer.exe

3、根据图示Type-C口向上,将BOOT0接VCC (向上),BOOT1接GND (向下)

烧录完成后,需恢复(都向下
在这里插入图片描述

4、连接开发板,按照图示,导入编译好的.hex文件后下载;
在这里插入图片描述

五、演示效果

http://www.dtcms.com/a/392196.html

相关文章:

  • Perplexica - 开源AI搜索引擎,让搜索更智能
  • Windows在VSCode Cline中安装Promptx
  • 深入解析 Spring AI 系列:解析返回参数处理
  • LeetCode:34.合并K个升序链表
  • 精细化关键词优化:提升SEO效果的长尾策略解析
  • Go基础:Go语言详细介绍,环境搭建,及第一个程序详解
  • 【开题答辩全过程】以 HL新闻为例,包含答辩的问题和答案
  • docker运行wonderShaper实现网卡限速
  • Windows 安装 Docker Desktop 到 D 盘完整教程(含迁移方案)
  • 基于陌讯AI检测算法本地化部署教程:基于Docker的环境配置与性能测试
  • Docker Docker Compose 完整入门与实用技巧
  • ARP协议工作原理分析(基于Wireshark)
  • CKS-CN 考试知识点分享(14) Istio网络策略
  • TCP 协议全解析:握手、挥手、重传与流控的深度剖析
  • 计算机视觉(opencv)实战二十七——目标跟踪
  • 深度学习中神经网络与损失函数优化
  • 整体设计 完整的逻辑链条 之1 点dots/线lines/面faces 的三曲:三进三出的三个来回
  • 微调基本理论
  • LeetCode算法日记 - Day 48: 课程表II、火星词典
  • 【面板数据】地级市中国方言多样性指数数据集
  • C++编程学习(第35天)
  • SS443A 霍尔效应传感器:高性能磁感应解决方案
  • MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
  • GitHub 热榜项目 - 日榜(2025-09-20)
  • 怎么判断 IP是独享的
  • Linux多进程编程(上)
  • 如何在Spring Boot项目中添加自定义的配置文件?
  • 【MySQL初阶】01-MySQL服务器和客户端下载与安装
  • AI搜索的下一站:多模态、个性化与GEO的道德指南
  • OpenLayers地图交互 -- 章节四:修改交互详解