0


使用Renesas R7FA8D1BH (Cortex®-M85)实现多功能UI

测试视频

使用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

  1. 读取MCU内部的各类应用模块参数

2.1.3 MCU底层驱动

1)实现I2C驱动(用于驱动I2C接口设备)

2)实现UART驱动(用于debug)

  1. 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文件,编写如下代码:

  1. /*
  2. FILE NAME : app_state.c
  3. Description: app UI
  4. Author : tangmingfei2013@126.com
  5. Date : 2024/06/03
  6. */
  7. #include "bsp_i2c.h"
  8. #include "hal_data.h"
  9. #include "oled_drv.h"
  10. #include "bsp_led.h"
  11. #include "bsp_timer.h"
  12. #include "bsp_uart.h"
  13. #include "bsp_adc.h"
  14. #include "ds18b20.h"
  15. #include "app_ui.h"
  16. #include "key.h"
  17. #include "app_state.h"
  18. typedef enum{
  19. INIT_DQ = 0,
  20. NEXT_0,
  21. NEXT_1,
  22. NEXT_2,
  23. NEXT_3,
  24. BACK,
  25. }APP_STATE;
  26. static void dispADC_state( void *ptr );
  27. static void dispDS18B20_state( void *ptr );
  28. static void dispISL29035_state( void *ptr );
  29. static void dispSHT2X_state( void *ptr );
  30. STATE_FUNC pSt_State = dispADC_state;
  31. uint8_t key_getState( void )
  32. {
  33. static uint8_t run_state = INIT_DQ;
  34. if( Key_Scan(KEY1_SW2_PIN) == KEY_ON){
  35. run_state++;
  36. }
  37. else if( Key_Scan(KEY2_SW3_PIN) == KEY_ON){
  38. run_state--;
  39. }
  40. if( run_state >= NEXT_3 )
  41. {
  42. run_state = NEXT_3;
  43. }
  44. if( run_state <= NEXT_0 )
  45. {
  46. run_state = NEXT_0;
  47. }
  48. return run_state;
  49. }
  50. void state_machine(void)
  51. {
  52. pSt_State((void *)pSt_State);
  53. }
  54. void run_action( uint8_t state )
  55. {
  56. switch( state )
  57. {
  58. case NEXT_0:
  59. pSt_State = dispADC_state;
  60. return;
  61. case NEXT_1:
  62. pSt_State = dispDS18B20_state;
  63. return;
  64. case NEXT_2:
  65. pSt_State = dispISL29035_state;
  66. return;
  67. case NEXT_3:
  68. pSt_State = dispSHT2X_state;
  69. return;
  70. default:
  71. break;
  72. }
  73. }
  74. static void dispADC_state( void *ptr )
  75. {
  76. uint8_t run_state;
  77. (void)ptr;
  78. oled_Clear();
  79. oled_SetCharSize( FONT_16 );
  80. oled_PrintfString(13,0,(uint8_t*)"Renesas MCU ");
  81. while(1)
  82. {
  83. run_state = key_getState();
  84. if( run_state != NEXT_0 ){
  85. run_action( run_state );
  86. return;
  87. }
  88. ui_active();
  89. }
  90. }
  91. static void dispDS18B20_state( void *ptr )
  92. {
  93. uint8_t run_state;
  94. (void)ptr;
  95. oled_Clear();
  96. oled_SetCharSize( FONT_16 );
  97. oled_PrintfString(13,0,(uint8_t*)"Renesas MCU ");
  98. while(1)
  99. {
  100. run_state = key_getState();
  101. if( run_state != NEXT_1 ){
  102. run_action( run_state );
  103. return;
  104. }
  105. ui_dispDS18b20();
  106. }
  107. }
  108. static void dispISL29035_state( void *ptr )
  109. {
  110. uint8_t run_state;
  111. (void)ptr;
  112. oled_Clear();
  113. oled_SetCharSize( FONT_16 );
  114. oled_PrintfString(13,0,(uint8_t*)"Renesas MCU ");
  115. while(1)
  116. {
  117. run_state = key_getState();
  118. if( run_state != NEXT_2 ){
  119. run_action( run_state );
  120. return;
  121. }
  122. ui_disISL29035();
  123. }
  124. }
  125. static void dispSHT2X_state( void *ptr )
  126. {
  127. uint8_t run_state;
  128. (void)ptr;
  129. oled_Clear();
  130. oled_SetCharSize( FONT_16 );
  131. oled_PrintfString(13,0,(uint8_t*)"Renesas MCU ");
  132. while(1)
  133. {
  134. run_state = key_getState();
  135. if( run_state != NEXT_3 ){
  136. run_action( run_state );
  137. return;
  138. }
  139. ui_disSht2x();
  140. }
  141. }

创建app_state.h文件,编写如下代码:

  1. /*
  2. FILE NAME : app_state.h
  3. Description: app ui interface
  4. Author : tangmingfei2013@126.com
  5. Date : 2024/06/03
  6. */
  7. #ifndef APP_STATE_H
  8. #define APP_STATE_H
  9. #include "hal_data.h"
  10. typedef void (*STATE_FUNC)(void *ptr);
  11. extern STATE_FUNC pSt_State;
  12. void state_machine(void);
  13. #endif /* APP_STATE_H */

5 功能测试

5.1 软件的代码结构

代码结构分为3个部分

1) MCU的驱动层

2) Device的驱动层

3) 功能应用层

5.2 功能测试

1)页面一

2)页面二

3)页面三

4)页面四


本文转载自: https://blog.csdn.net/mftang/article/details/142395854
版权归原作者 mftang 所有, 如有侵权,请联系我们删除。

“使用Renesas R7FA8D1BH (Cortex®-M85)实现多功能UI”的评论:

还没有评论