目录
概述
1 系统框架介绍
1.1 模块功能介绍
1.2 UI页面功能
2 软件框架结构实现
2.1 软件框架图
2.1.1 应用层API
2.1.2 硬件驱动层
2.1.3 MCU底层驱动
2.2 软件流程图
4 软件功能实现
4.1 状态机功能核心代码
4.2 页面功能函数
4.3 源代码文件
5 功能测试
5.1 软件的代码结构
5.2 功能测试
测试视频
使用Renesas R7FA8D1BH (Cortex®-M85)控制多类i2c类型设备,实时读取数据显示在OLED 屏幕,按键实现页面切换
概述
本文主要介绍使用Renesas R7FA8D1BH (Cortex®-M85)实现多功能UI,包括整个系统的硬件框架,软件框架结构,还介绍了软件实现的逻辑,包括:状态机跳转的核心代码,源代码等内容。
1 系统框架介绍
1.1 模块功能介绍
1)数据采集部分
SHT20: 温湿度传感器,采集环境温度和湿度
ISL29035: 光照传感器,采集环境的光照强度
DS18B20: 高精度温度传感器,设备工作环境温度监测
ADC(Temperatre): MCU内部温度监测
ADC(可调电阻): 模拟数据输入
2)显示部分
OLED: 实时显示传感器的数据
3)模式切换
KEY-UP: 物理按键,正方向切换UI
KEY-DOWM: 物理按键,反方向切换UI
1.2 UI页面功能
1)页面一显示数据
2)页面二数据
3)页面三数据
4)页面四数据
2 软件框架结构实现
2.1 软件框架图
2.1.1 应用层API
1) 实时读取各类sensor的数据
2)实时获取按键的状态
3)处理sensor数据,根据按键状态实现UI页面的切换
2.1.2 硬件驱动层
1)实现外围驱动的driver
2) 读取MCU内部的各类应用模块参数
2.1.3 MCU底层驱动
1)实现I2C驱动(用于驱动I2C接口设备)
2)实现UART驱动(用于debug)
3) IO层驱动实现
4)内部各个模块驱动(ADC,RTC)
2.2 软件流程图
4 软件功能实现
4.1 状态机功能核心代码
1)定义函数指针
代码第12行: 定义状态跳转函数指针
代码第13行:外部引用的函数指针变量
2)入口函数
代码65行: 系统启动后,跳转到第一个页面为ADC数据显示功能
3)根据按键值判断页面的位置
4)页面功能函数
4.2 页面功能函数
1)显示ADC数据
代码第110行: 实时显示ADC的数据
2)显示DS18B20 数据页面
显示数据函数:
3)显示ISL29035数据页面
4)显示SHT20数据页面
数据显示函数
4.3 源代码文件
创建app_state.c文件,编写如下代码:
/*FILE NAME : app_state.cDescription: app UIAuthor : tangmingfei2013@126.comDate : 2024/06/03*/
#include "bsp_i2c.h"
#include "hal_data.h"
#include "oled_drv.h"
#include "bsp_led.h"
#include "bsp_timer.h"
#include "bsp_uart.h"
#include "bsp_adc.h"
#include "ds18b20.h"
#include "app_ui.h"
#include "key.h"
#include "app_state.h" typedef enum{INIT_DQ = 0,NEXT_0,NEXT_1,NEXT_2,NEXT_3,BACK,}APP_STATE;static void dispADC_state( void *ptr );
static void dispDS18B20_state( void *ptr );
static void dispISL29035_state( void *ptr );
static void dispSHT2X_state( void *ptr );STATE_FUNC pSt_State = dispADC_state;uint8_t key_getState( void )
{static uint8_t run_state = INIT_DQ;if( Key_Scan(KEY1_SW2_PIN) == KEY_ON){run_state++;}else if( Key_Scan(KEY2_SW3_PIN) == KEY_ON){run_state--;}if( run_state >= NEXT_3 ){run_state = NEXT_3;}if( run_state <= NEXT_0 ){run_state = NEXT_0;}return run_state;
}void state_machine(void)
{pSt_State((void *)pSt_State);
}void run_action( uint8_t state )
{switch( state ){case NEXT_0:pSt_State = dispADC_state;return;case NEXT_1:pSt_State = dispDS18B20_state;return;case NEXT_2:pSt_State = dispISL29035_state;return;case NEXT_3:pSt_State = dispSHT2X_state;return;default:break;}
}static void dispADC_state( void *ptr )
{uint8_t run_state;(void)ptr;oled_Clear();oled_SetCharSize( FONT_16 ); oled_PrintfString(13,0,(uint8_t*)"Renesas MCU "); while(1){run_state = key_getState();if( run_state != NEXT_0 ){run_action( run_state );return;}ui_active();}
}static void dispDS18B20_state( void *ptr )
{uint8_t run_state;(void)ptr;oled_Clear();oled_SetCharSize( FONT_16 ); oled_PrintfString(13,0,(uint8_t*)"Renesas MCU "); while(1){run_state = key_getState();if( run_state != NEXT_1 ){run_action( run_state );return;}ui_dispDS18b20();}
}static void dispISL29035_state( void *ptr )
{uint8_t run_state;(void)ptr;oled_Clear();oled_SetCharSize( FONT_16 ); oled_PrintfString(13,0,(uint8_t*)"Renesas MCU "); while(1){run_state = key_getState();if( run_state != NEXT_2 ){run_action( run_state );return;}ui_disISL29035();}
}static void dispSHT2X_state( void *ptr )
{uint8_t run_state;(void)ptr;oled_Clear();oled_SetCharSize( FONT_16 ); oled_PrintfString(13,0,(uint8_t*)"Renesas MCU "); while(1){run_state = key_getState();if( run_state != NEXT_3 ){run_action( run_state );return;}ui_disSht2x();}
}
创建app_state.h文件,编写如下代码:
/*FILE NAME : app_state.hDescription: app ui interfaceAuthor : tangmingfei2013@126.comDate : 2024/06/03*/#ifndef APP_STATE_H#define APP_STATE_H#include "hal_data.h"typedef void (*STATE_FUNC)(void *ptr);
extern STATE_FUNC pSt_State;void state_machine(void);#endif /* APP_STATE_H */
5 功能测试
5.1 软件的代码结构
代码结构分为3个部分
1) MCU的驱动层
2) Device的驱动层
3) 功能应用层
5.2 功能测试
1)页面一
2)页面二
3)页面三
4)页面四