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

news2024/9/21 10:05:36

目录

概述

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.c
 Description:  app UI
 Author     :  tangmingfei2013@126.com
 Date       :  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.h
 Description:  app ui interface
 Author     :  tangmingfei2013@126.com
 Date       :  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)页面四

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2152010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【渐冻勇士的营养秘籍!这些营养素让爱更坚强】

Hey小伙伴们~&#x1f44b; 今天我们来聊聊一个温暖而坚强的话题——渐冻症患者的营养补充攻略&#xff01;&#x1f4aa; 在这个充满挑战的路上&#xff0c;合理的营养摄入就像是他们最坚实的盔甲&#xff0c;让爱与希望的光芒更加耀眼。✨ &#x1f308; ‌蛋白质&#xff1…

macOS平台(intel)编译MAVSDK安卓平台SO库

1.下载MAVSDK: git clone https://github.com/mavlink/MAVSDK.git --recursive 2.编译liblzma 修改CMakeLists.txt文件增加C与CXX指令-fPIC set(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-fPIC ${CMAKE_CXX_FLAGS}") 修改如下:…

k8s下的网络通信与调度

目录 一、k8s网络通信 1、k8s通信整体架构 2、flannel网络插件 &#xff08;1&#xff09;flannel跨主机通信原理 &#xff08;2&#xff09;flannel支持的后端模式 3、calico网络插件 &#xff08;1&#xff09;简介 &#xff08;2&#xff09;网络架构 &#xff08;…

Maven 替换国内的镜像源

Maven 替换国内的镜像源 在使用 Maven 构建项目时&#xff0c;Maven 会从中央仓库中下载依赖。但由于网络环境的限制&#xff0c;访问 Maven 中央仓库的速度可能较慢。为了加快依赖下载速度&#xff0c;尤其是在大陆地区&#xff0c;建议将 Maven 默认的中央仓库替换为国内的镜…

【大模型教程】基于 InternLM 和 LangChain 搭建知识库助手

1 环境配置 1.1 InternLM 模型部署 在 InternStudio 平台中选择 A100(1/4) 的配置&#xff0c;打开开发机&#xff0c;打开终端开始环境配置&#xff0c;模型下载和运行demo。 进入开发机后&#xff0c;进入conda环境。 1.2 模型下载 在本地的 /root/share/temp/model_rep…

SiLM585x系列SiLM5852SHCG-AQ与其他单通道隔离驱动器的较量 —— 分离管脚输出与主动保护的优势

SiLM585x系列SiLM5852SHCG-AQ是一款单通道隔离驱动器&#xff0c;具有分离的管脚输出&#xff0c;提供3.0A源电流和6.0A灌电流。主动保护功能包括退饱和过流检测、UVLO、隔离故障报警和 2.5A 米勒钳位。输入侧电源的工作电压为3V至5.5V&#xff0c;输出侧电源的工作电压范围为1…

农业电商服务系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;会员管理&#xff0c;商家管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;农产品监督管理&#xff0c;助农信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页…

Modular Elven Archer 幻想精灵女弓箭手游戏角色模型

可爱的精灵射手的3D模型。用额外的骨骼固定到人形。完全模块化,包括一个没有衣服的身体。包含苹果混合形状。 下载:​​Unity资源商店链接资源下载链接 效果图:

使用vue创建项目

一、安装环境 二、创建vue框架&#xff08;创建文件夹&#xff0c;摁shift鼠标右键 打开&#xff09; 1、项目配置 2、新增目录 三、路径别名配置 输入/ ,VSCode会联想出src下的所有子目录和文件&#xff0c;统一文件路径访问时不容易出错 四、ElementPlus配置 1、组件分为…

开源 AI 智能名片 S2B2C 商城小程序与正能量融入对社群归属感的影响

摘要&#xff1a;本文探讨了开源 AI 智能名片 S2B2C 商城小程序在社群运营中的作用&#xff0c;以及融入正能量对提高社群归属感的关键意义。通过分析正能量的精神感染力和对社群氛围的积极影响&#xff0c;阐述了在开源 AI 智能名片 S2B2C 商城小程序的各类活动中融入正能量的…

这几个优秀的工具网站真心值得推荐——搜嗖工具箱

即时工具 https://www.67tool.com/ 这是一个专注提升效率的办公工具网站&#xff1b;这也是一个拥有260多款自研在线工具和200多个客户端离线工具的服务网站&#xff1b;这还是一个可以满足包括视频处理、音频处理、图片处理、文档处理、文档转换、办公辅助、图表生成、文本工…

《Nginx核心技术》第18章:基于主从模式搭建Nginx+Keepalived双机热备环境

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

分享3款开源、免费的Avalonia UI控件库

Avalonia介绍 Avalonia是一个强大的框架&#xff0c;使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件&#xff0c;确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。这意味着开发人员可以共享他们的UI代码…

Linux——keepalived负载均衡

如何解决网站的高并发访问? 高并发: 响应缓慢 服务卡顿 服务器宕机 思路: 找性能瓶颈 定位单点 (监控工具)解决方案: 隔离 扩展 动静分离拆分数据库缓存队列负载均衡逻辑隔离 // 虚拟化技术 硬件虚拟化 //VMware EXSI Ovirt指令集虚拟化运行库虚拟化 // 容…

腾讯云平台实现本机远程连接和数据库mysql 8连接

引言 我们首先邮箱注册一个腾讯云账号&#xff08;腾讯云 产业智变云启未来 - 腾讯&#xff09;&#xff0c;注册后会有一个月试用期&#xff0c;我们今天讲解的是轻量应用服务器&#xff0c;点击使用&#xff0c;选择离你区域最近的服务区&#xff0c;然后还有一个镜像选择&am…

Packet Tracer - IPv4 ACL 的实施挑战(完美解析)

目标 在路由器上配置命名的标准ACL。 在路由器上配置命名的扩展ACL。 在路由器上配置扩展ACL来满足特定的 通信需求。 配置ACL来控制对网络设备终端线路的 访问。 在适当的路由器接口上&#xff0c;在适当的方向上 配置ACL。…

【深入理解SpringCloud微服务】深入理解nacos配置中心(六)——spring-cloud-context关于配置刷新的公共逻辑

【深入理解SpringCloud微服务】深入理解nacos配置中心&#xff08;六&#xff09;——spring-cloud-context关于配置刷新的公共逻辑 原理分析源码解析RefreshEventListener#onApplicationEvent(ApplicationEvent)ContextRefresher#refresh()ContextRefresher#refreshEnvironmen…

记录一次显卡驱动安装

1. 驱动安装 1.1. 查看适合的版本 apt-get update ubuntu-drivers devices输出结果&#xff1a; 1.2. 安装合适的驱动版本 根据上面输出的内容 apt-get install nvidia-driver-545完成后重启 reboot查看新的驱动 nvidia-smi2. 安装/升级cuda 在nvidia-smi中显示的CUDA…

伊犁云计算22-1 apache 安装rhel8

1 局域网网络必须通 2 yum 必须搭建成功 3 apache 必须安装 开干 要用su 用户来访问 一看httpd 组件安装完毕 到这里就是测试成功了 如何修改主页的目录 网站目录默认保存在/var/WWW/HTML 我希望改变/home/www 122 127 167 行要改

AI 基础设施:构建AI时代全栈云计算体系

生成式AI 新时代下催生新的基础设施需求 随着企业在数字化转型之路上越走越远&#xff0c;期间一场新的技术革命正在发生&#xff0c;近几年涌现的生成式AI技术正在迅速改变科技、商业和整个社会的格局。这种强大的技术能够从数据中学习并生成预测性输出&#xff0c;生成式 AI …