diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 2e7a317..05be3ee 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -30,7 +30,8 @@ void task_shell_term_main_loop(void const * argument); #include "anemometer_dev.h" #include "uart_dev.h" #include "frt_protocol.h" -#include "inflash.h" +#include "inflash.h" +#include "hp203b.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -186,11 +187,13 @@ void SensorTask(void const * argument) void LEDTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ - /* Infinite loop */ + /* Infinite loop */double press=0;double altitude=0;double Temp=0; for(;;) { - osDelay(200); + osDelay(1000); HAL_GPIO_TogglePin(GPIOC,GPIO_LED_CTRL_Pin); + Hp203bReadPressureTemperature(&press, &altitude, &Temp); + term_printf("pressure:%f\r\naltitude:%f\r\ntemperature:%f\r\n\r\n", press, altitude, Temp); } /* USER CODE END StartDefaultTask */ } diff --git a/Core/Src/main.c b/Core/Src/main.c index e5b5255..63fb28f 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -41,7 +41,7 @@ #include "anemometer_dev.h" #include "uart_dev.h" -#include "sht30.h" +#include "sht30.h" #include "inflash.h" /* USER CODE END Includes */ diff --git a/Drivers/HP203B/hp203b.c b/Drivers/HP203B/hp203b.c new file mode 100644 index 0000000..db43ceb --- /dev/null +++ b/Drivers/HP203B/hp203b.c @@ -0,0 +1,93 @@ +#include "hp203b.h" +#include "i2c.h" +#include "pdebug.h" +#include "assertions.h" +#include "filter.h" +#include "cmsis_os.h" + +uint8_t hp20X_SOFT_RST = 0x06; //软复位 +uint8_t hp20X_READ_P = 0x30; //压力 +uint8_t hp20X_READ_A = 0x31; //高度 +uint8_t hp20X_READ_T = 0x32; //温度 +uint8_t hp20X_READ_PT = 0x10; //温度压力 +uint8_t hp20X_READ_AT = 0x11; //温度海拔 + +/**************************** +*名称:HP203_soft_reset +*功能:对hp203发送软复位指令 +*参数:无 +*返回:无 +*****************************/ +void HP203_soft_reset(void) +{ + HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, &hp20X_SOFT_RST, 1, 0xffff);//0xec,0x06----进行软件复位 + osDelay(30); //延时20MS thread误差+10 +} + + +/**************************** +*名称:Hp203bReadPressureTemperature +*功能:获取气压、海拔、温度数据 +*参数: Press--气压值 +* Altitude--海拔 +* Temp--温度 +*返回:无 +*****************************/ +void Hp203bReadPressureTemperature(double *Hp203bPressure,double *Hp203bAltitude,double *Hp203bTemp) +{ + uint8_t Osr_Cfg = HP20X_CONVERT_OSR1024; //0x08 + + uint8_t DataBuf[6]; + long Hp203b_Temp; + long Hp203b_Pressure; + long Hp203b_Altitude; + uint8_t status = 0xFF; + + uint8_t command = HP20X_WR_CONVERT_CMD | Osr_Cfg; + + status = HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, &command, 1, 0xffff); + while(status != HAL_OK){} +// if(HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, &command, 1, 0xffff) == HAL_OK) //0x40 | 0x08 = 0x48----010: fixed; 010: OSR = 1024; 00: sensor pressure and temperature channel; +// { + osDelay(74); //延时64MS 具体可以根据OSR值调整 thread误差+10 + + HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, &hp20X_READ_PT, 1, 0xffff); //命令:0x10----读取温度和压力数据 + + HAL_I2C_Master_Receive(&hi2c3, HP20X_ADDRESSCMD, DataBuf, 6, 0xffff); //读取6个字节数据:3个字节的温度数据和3个字节的压力数据 + + Hp203b_Temp = DataBuf[0]; //将3个字节的温度数据整合成24位的温度数据 + Hp203b_Temp <<= 8; + Hp203b_Temp |= DataBuf[1]; + Hp203b_Temp <<= 8; + Hp203b_Temp |= DataBuf[2]; + + if(Hp203b_Temp > 0x7FFFFF) //判断是否负值 + Hp203b_Temp = Hp203b_Temp - 16777216; + + *Hp203bTemp = (double)Hp203b_Temp / 100; //计算温度数据 + + Hp203b_Pressure = DataBuf[3]; //将3个字节的压力数据整合成24位的压力数据 + Hp203b_Pressure <<= 8; + Hp203b_Pressure |= DataBuf[4]; + Hp203b_Pressure <<= 8; + Hp203b_Pressure |= DataBuf[5]; + + *Hp203bPressure = (double)Hp203b_Pressure / 100; //计算压力数据 + + HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, &hp20X_READ_A, 1, 0xffff); //命令:0x31----读取高度数据 + + HAL_I2C_Master_Receive(&hi2c3, HP20X_ADDRESSCMD, DataBuf, 3, 0xffff); //读取3个字节数据:3个字节的高度数据 + + Hp203b_Altitude = DataBuf[0]; //将3个字节的高度数据整合成24位的高度数据 + Hp203b_Altitude <<= 8; + Hp203b_Altitude |= DataBuf[1]; + Hp203b_Altitude <<= 8; + Hp203b_Altitude |= DataBuf[2]; + + if(Hp203b_Altitude > 0x7FFFFF) //判断是否负值 + Hp203b_Altitude = Hp203b_Altitude - 16777216; + + *Hp203bAltitude = (double)Hp203b_Altitude / 100; //计算高度数据 +// } +} + diff --git a/Drivers/HP203B/hp203b.h b/Drivers/HP203B/hp203b.h new file mode 100644 index 0000000..27612a1 --- /dev/null +++ b/Drivers/HP203B/hp203b.h @@ -0,0 +1,21 @@ +#ifndef _HP203B_H_ +#define _HP203B_H_ +#include "i2c.h" +#include "comm_types.h" + +//#define HP20X_ADDRESSCMD 0xec //CSB PIN = 1,高电平 +#define HP20X_ADDRESSCMD 0xee //CSB PIN = 0,低电平 +#define HP20XX_RDY 0x8d + +#define HP20X_WR_CONVERT_CMD 0x40 +#define HP20X_CONVERT_OSR4096 0<<2 +#define HP20X_CONVERT_OSR2048 1<<2 +#define HP20X_CONVERT_OSR1024 2<<2 //0x08 +#define HP20X_CONVERT_OSR512 3<<2 +#define HP20X_CONVERT_OSR256 4<<2 +#define HP20X_CONVERT_OSR128 5<<2 + +void HP203_soft_reset(void); +extern void Hp203bReadPressureTemperature(double *Hp203bPressure,double *Hp203bAltitude,double *Hp203bTemp); + +#endif diff --git a/EWARM/micro_climate.ewp b/EWARM/micro_climate.ewp index a54ad63..7271bfa 100644 --- a/EWARM/micro_climate.ewp +++ b/EWARM/micro_climate.ewp @@ -189,7 +189,7 @@