sht30传感器gd32f425
时间: 2024-12-30 22:30:38 浏览: 12
### 使用GD32F425与SHT30温湿度传感器
为了在GD32F425上使用SHT30温湿度传感器进行数据采集,主要涉及I²C接口配置以及相应的寄存器操作来获取温度和湿度信息。下面提供了一个完整的流程说明及示例代码。
#### I²C 接口初始化设置
首先需要确保已经正确设置了I²C外设参数以便能够同SHT30通信。这里假设采用的是硬件I²C模式而非软件模拟方式:
```c
#include "gd32f4xx.h"
void iic_gpio_config(void){
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_AF);
gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); // PB6->SDA;PB7->SCL
}
void iic_config(void){
/* Enable clocks */
rcu_periph_clock_enable(RCU_I2C1);
/* Configure the I2Cx functional parameters */
i2c_parameter_struct i2c_initpara;
i2c_struct_para_init(&i2c_initpara);
i2c_initpara.i2c_analog_filter = I2C_ANALOGFILTER_ENABLE;
i2c_initpara.i2c_digital_filter_cfg = 0x00;
i2c_initpara.i2c_ack = I2C_ACK_ENABLE;
i2c_initpara.i2c_own_addr1 = 0xA0;
i2c_initpara.i2c_timing = 0x20908EFD;
i2c_init(I2C1,&i2c_initpara);
i2c_enable(I2C1);
}
```
上述代码完成了GPIO端口和IIC模块的基本设定工作[^1]。
#### SHT30 数据读取函数定义
接下来编写用于向SHT30发送测量命令并接收返回的数据包处理逻辑:
```c
#define SHT30_ADDR_WRITE (0x44 << 1)
#define SHT30_ADDR_READ (0x45 << 1)
uint16_t read_temperature_humidity(float *temperature,float *humidity){
uint8_t cmd[] = {0x2C, 0x06}; // High repeatability measurement command
if(i2c_start_on_bus(I2C1,SHT30_ADDR_WRITE,I2C_MASTER_TRANSMITTER)!=SUCCESS)return ERROR;
i2c_master_send_data(I2C1,cmd[0]);
i2c_master_send_data(I2C1,cmd[1]);
delay_ms(50); // Wait for conversion complete
if(i2c_restart_on_bus(I2C1,SHT30_ADDR_READ,I2C_MASTER_RECEIVER)!=SUCCESS)return ERROR;
uint8_t data[6];
for(int i=0;i<6;i++){
data[i]=i2c_master_recv_data(I2C1);
i2c_ack_config(I2C1,(i!=5)?ENABLE:DISABLE);
}
i2c_stop(I2C1);
uint16_t temp_raw=((data[0]<<8)|data[1])&0xFFFC;
uint16_t humi_raw=((data[3]<<8)|data[4])&0xFFFC;
*temperature=-45.0+(175.0/65535)*temp_raw;
*humidity=(100.0/65535)*humi_raw;
return SUCCESS;
}
```
此部分实现了针对SHT30的具体交互协议,并计算出了实际物理量值[^2]。
#### 主程序调用实例
最后,在主循环里可以周期性的调用`read_temperature_humidity()`方法来进行实时监测:
```c
int main(){
float temperature,humidity;
rcu_periph_clock_enable(RCU_I2C1);
iic_gpio_config();
iic_config();
while(1){
if(read_temperature_humidity(&temperature,&humidity)==SUCCESS){
printf("Temperature:%.2f°C Humidity:%.2f%%\r\n",temperature,humidity);
}else{
printf("Error reading sensor.\r\n");
}
delay_1ms(1000); // Delay between measurements
}
}
```
这段代码展示了如何将前面准备好的各个组件组合起来形成一个简单的应用案例。
阅读全文