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还是1
    timeout = DHT11_TIMEOUT;
    while(DATA_GPIO_IN && timeout--)
    {
        timeCount++;
        delay_us(1); // 等待1us
        if(timeout == 0)
        {
            printf("DHT11_ReadBit Failed[2]!!\r\n");
            return 0; // 失败
        }
    }
    // 只要大于30us的高电平即可判断为数据1
    if(timeCount >= 30)
        bit = 1; // 数据1
    else
        bit = 0; // 数据0
    return 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();
    // 初始化串口 USART0
    gd_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文件后下载;
在这里插入图片描述

五、演示效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值