当前位置: 首页 > news >正文

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

目录

概述

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)页面四

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Scrapy爬虫框架 Pipeline 数据传输管道
  • 在 CentOS 8 上安装和部署 OpenSearch 2.17 的实战指南20240924
  • 鼎曼白茶贡眉:贮留芳香记忆,书写老茶传奇
  • 基于量子通讯进行安全认证
  • IPsec-Vpn
  • Flink 与 Kubernetes (K8s)、YARN 和 Mesos集成对比
  • 【vue3】vue3.3新特性真香
  • 为什么现在的LLM都是Decoder only的架构?
  • LeetCode 399. 除法求值
  • ssh 免密登陆服务器故障
  • qs(Query String)查询字符串框架
  • 数据结构_1.1、数据结构的基本概念
  • java mybaits oracle插入返回主键
  • 『功能项目』窗口可拖拽脚本【59】
  • [vulnhub] w1r3s.v1.0
  • 《剑指offer》分解让复杂问题更简单
  • 11111111
  • CSS 提示工具(Tooltip)
  • ECS应用管理最佳实践
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JAVA并发编程--1.基础概念
  • mysql innodb 索引使用指南
  • vue总结
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 关于Flux,Vuex,Redux的思考
  • 如何胜任知名企业的商业数据分析师?
  • 听说你叫Java(二)–Servlet请求
  • 小而合理的前端理论:rscss和rsjs
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 中文输入法与React文本输入框的问题与解决方案
  • No resource identifier found for attribute,RxJava之zip操作符
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 移动端高清、多屏适配方案
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​学习一下,什么是预包装食品?​
  • #预处理和函数的对比以及条件编译
  • (13)Hive调优——动态分区导致的小文件问题
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (4)STL算法之比较
  • (9)目标检测_SSD的原理
  • (C++17) std算法之执行策略 execution
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (译)2019年前端性能优化清单 — 下篇
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)memcache、redis缓存
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .NET Standard 的管理策略
  • .sdf和.msp文件读取