【前言】
前一期,用toucgfxGUI来控制了开发板的LED灯实现了View-Persenter-Model的功能步骤。这次我采集温度来实现Model->Persenter->View的功能。
【实验器材】
Stm32U599j-DK开发板。
板载的温度传感器stts22h。
【开发环境】
TouchGFX 4.22.1
Stm32CubeIde1.13
【温度计介绍】
STTS22H是一款超低功耗的高精度数字温度传感器,在整个工作温度范围内提供高性能输出
STTS22H是一款带隙温度传感器,在单一ASIC中集成了A/D转换器、信号处理逻辑和一个I²C/SMBus 3.0接口。
该传感器采用小型2 x 2 x 0.50 mm 6引线UDFN封装,裸露焊盘向下,以便更好地匹配周围环境的温度。
STTS22H经过工厂校准,客户不需要进行额外校准。
【开发板原理图】
这里我们需要特别注意stts22h的addr引角的接线,stts22h可以通过个地址跳线来设置不同的i2c地址,具体的地址如下:
由原理图,我们得知,开发板的addr引角是与GND相连,所以他的从机地址为0x7E,因此我们在设置宏定义时需要义为0xFE,我因为这个地址的问题,调试了好久。
【stts22h驱动库】
【驱动实现】
我们需要把下载下来的驱动包的.c放到目录core/src目录下面,同时把.h放到core/inc下面。我原来直接复制粘帖进工程,在stm32CubeIde下面可以编译通过,但是在touchGFX下面提示没有找到头文件。后面分板了原因,stm32Cubide与touchGFX的编译使用的不是同一个s配置文件。当然也可以做成BSP包放到目录BSP/components下面,但是要在makefile下面手工添加文件路径。
【获取温度值】
在freertos中的任务中,我们添加获取温度的值,同时在freertos增加一个信号量,用来告之touchGFX已经生成温度,并更新到显示界面。
具体代码如下:
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN defaultTask */
static int16_t data_raw_temperature;
static uint8_t whoamI;
stmdev_ctx_t dev_ctx;
dev_ctx.write_reg = platform_write;
dev_ctx.read_reg = platform_read;
dev_ctx.handle = &SENSOR_BUS;
/* Check device ID */
stts22h_dev_id_get(&dev_ctx, &whoamI);
if (whoamI != STTS22H_ID)
while (1)
{
osDelay(10);
}
/* Infinite loop */
for(;;)
{
uint8_t flag;
stts22h_temp_flag_data_ready_get(&dev_ctx, &flag);
if (flag) {
/* Read temperature data */
memset(&data_raw_temperature, 0, sizeof(int16_t));
stts22h_temperature_raw_get(&dev_ctx, &data_raw_temperature);
temperature_degC = stts22h_from_lsb_to_celsius(
data_raw_temperature);
osSemaphoreRelease(myBinarySemtempHandle);
osDelay(1000);
}
}
【添加GUI显示界面】
在touchGFX中添加一个显示文本框:
【编写MPV逻辑代码】
1、我们遵循M-P-V逻辑,先在modelListen.hpp中定义虚拟函数:
virtual void NotifyTempValudChanged(float value) {}
然后在model.cpp中实现,在tick函数中,我们获取信号量,如果有信号来到,就把温度发送给screen1presenter。
void Model::tick()
{
if(osSemaphoreGetCount(myBinarySemtempHandle)>0)
{
modelListener->NotifyTempValudChanged(temperature_degC);
}
}
- 在screen1presenter.hpp中,定义虚拟函数:
virtual void NotifyTempValudChanged(float value);
- 在screen1.presenter.cpp中实现他:
void Screen1Presenter::NotifyTempValudChanged(float value)
{
view.setTempValud(value);
}
- 我在们screen1view.hpp中定义虚拟函数:
virtual void setTempValud(float value);
- 在screen1view.cpp中实现对GUI中的文本的个改:
void Screen1View::setTempValud(float value)
{
Unicode::snprintfFloat(textAreaTempBuffer, TEXTAREATEMP_SIZE, "%2.2f", value);
textAreaTemp.invalidate();
}
【实现效果】
【总结】
touchGFX+stm32CubeIDE提供了强大的开发环境,使得我在极少代码的情况下,实现温度采集与显示的工程。