【RA-Eco-RA2L1-48PIN】ADC 电压表与OLED显示

【RA-Eco-RA2L1-48PIN】ADC 电压表与OLED显示

本文介绍了 RA-Eco-RA2L1-48PIN 开发板通过瑞萨 e2 Studio 灵活软件包(FSP)编程实现 ADC 串口采集电压和OLED显示电压数值的项目设计,包括串口电压值串口打印、硬件 IIC 通信协议配置、 OLED显示、效果展示等流程。

项目介绍

  • 使用 FSP 灵活软件包和 e2 studio 软件创建工程;
  • 配置串口和 ADC,实现串口printf重定向,打印 ADC 电压值;
  • 配置硬件 IIC 并实现 OLED 驱动和框架显示;
  • OLED 显示 ADC 采集电压值,实现电压表项目设计。

驱动 OLED

介绍了通过配置硬件 IIC 实现与 SSD1306 通信进而驱动 OLED 显示屏的主要流程。

工程创建

  • 打开 e2 studio 软件,依次点击 文件 - 新建 - 瑞萨 C/C++ 项目 - Renesas RA

  • 依次进行工程命名,路径设置,FSP版本,目标开发板选择,Device 选择 R7FA2L1AB2DFL ,工具链选择 GNU ARM Embedded ,调试器选择 J-Link

  • 完成工程创建

IIC 配置

  • 设置目标串口对应的 GPIO 引脚

    • 依次选择 Pins - Peripherals - Connectivity:IIC - IIC0 - 使能该模式 - 可见 P401 和 P400 引脚分别对应 SDA 和 SCL ;
  • 新建 IIC 通信堆栈

    • Stacks - New Stack - Connectivity - I2C Master (r_iic_master)
  • 选中 iic 堆栈方框,打开属性标签,配置 IIC 参数

在这里插入图片描述

  • 属性设置: 属性 - Module g_i2c_master0 I2C Master (r_iic_master)

  • Slave Address 设置为 0x3C

  • 回调函数设置为 IIC_master_callback

  • 点击 Generate Code 按钮,生成工程代码。

汉字取模

  • 下载 并运行 PC2LCD2018 软件 ;

  • 菜单栏模式设置为 字符模式

  • 点击工具栏中的 设置 按钮,配置字模选项:列行式取模、低位在前等,设置完成后点击 确定 保存配置;

在这里插入图片描述

  • 在文字输入选框输入目标汉字,点击 生成字模
  • 选中复制或保存字模,代码添加至 oledfont.h 文件。

工程代码

驱动基于 SSD1306 的 OLED 屏幕显示框架。

oled.c 文件、oled.h 文件、oledfont.h 文件下载链接:

【免费】Renesas单片机OLED驱动文件资源-CSDN文库

hal_entry.c 关键代码如下

#include "hal_data.h"
#include "oled.h"FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERFSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERi2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void IIC_master_callback(i2c_master_callback_args_t *p_args)
{i2c_event = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event = p_args->event;}
}
fsp_err_t err = FSP_SUCCESS;
int  timeout_ms = 100;void hal_entry(void)
{/* TODO: add your own code here *//* Initialize IIC OLED */err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);assert(FSP_SUCCESS == err);OLED_Init();OLED_Clear();OLED_ShowString(0,0,"A D C ",16,1);OLED_ShowCHinese(48,0,0,1);//电OLED_ShowCHinese(64,0,1,1);//压OLED_ShowCHinese(80,0,2,1);//表OLED_ShowString(4,3,"ADC",16,0);OLED_ShowCHinese(32,3,3,0);//值OLED_ShowChar(48,3,':',16,0);OLED_ShowCHinese(0,6,0,0);//电OLED_ShowCHinese(16,6,1,0);//压OLED_ShowCHinese(32,6,3,0);//值OLED_ShowChar(48,6,':',16,0);OLED_ShowChar(100,6,'V',16,0);
#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}

保存代码,重新构建工程。

硬件连接

  • SWDIO -> J-Link (DIO)
  • SWCLK -> J-Link (CLK)
  • P400 -> OLED (SCL)
  • P401 -> OLED (SDA)

工程调试

  • 点击上方工具栏 小锤子 按钮(或右键工程选择 调试方式 - 调试配置);
  • 选择 Renesas GDB Hardware Debugging ,选择构建的相应的 Flat ;
  • 确保调试器已正确连接,点击调试按钮,进入调试模式;
  • 点击左上角绿色三角形启动按钮,再次点击启动调试;
  • 打开串口调试助手,配置串口信息,打开串口,可获得相应的字符串输出。

效果

首行显示 A D C 电压表,后面两行分别显示 ADC 值和电压值及单位。

在这里插入图片描述

ADC 显示

在前面工作的基础上,介绍了结合 ADC 模拟输入信号的电压转换和串口打印与 OLED 显示,实现了实时读取 ADC 值和电压值的电压表项目。

工程创建

在前面驱动 OLED 显示框架的基础上,加入 UART 和 ADC 堆栈配置,并将数值同时输出至 OLED 显示和串口,即可实现电压值的实时显示。

这里简述相应的流程。

串口配置
  • 设置目标串口对应的 GPIO 引脚

    • 依次选择 Pins - Peripherals - Connectivity:SCI - SCI9 对应 P109 (TXD9) 和 P110 (RXD9) 引脚;
  • 新建串口通信堆栈

    • New Stack - Connectivity - UART (r_sci_uart)
  • 选中 uart 堆栈方框,打开属性标签,配置串口参数

  • 属性设置: 属性 - Module g_uart9 UART (r_sci_uart) - GeneralBaudInterrupts 设置回调函数

ADC 配置
  • 设置 ADC 通道对应的 GPIO 配置

    • 依次选择 Pins - Peripherals - Analog:ADC - ADC0 - 右侧通道选项 AN000 打开对应值 P000 引脚;
  • 新建 ADC 堆栈

    • New Stack - Analog - ADC (r_adc)
  • 属性配置

    • General 选项下设置 ADC 单次扫描

    • Input 选项下勾选 Channel0,配置中断与回调函数;

  • ADC 及串口配置完成后,构建工程,确保无误。

工程代码

hal_entry.c 关键代码如下

#include "hal_data.h"
#include "oled.h"FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERfsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{if(p_args->event == UART_EVENT_TX_COMPLETE){uart_send_complete_flag = true;}
}/*------------- 串口重定向 -------------*/
#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#endifPUTCHAR_PROTOTYPE
{err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;return ch;
}int _write(int fd,char *pBuffer,int size)
{for(int i=0;i<size;i++){__io_putchar(*pBuffer++);}return size;
}volatile bool scan_complete_flag = false;
void adc_callback (adc_callback_args_t * p_args)
{FSP_PARAMETER_NOT_USED(p_args);scan_complete_flag = true;
}/*------------- IIC 初始化 -------------*/
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void IIC_master_callback(i2c_master_callback_args_t *p_args)
{i2c_event = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event = p_args->event;}
}int  timeout_ms = 100;/*------------- main -------------*/
void hal_entry(void)
{/* TODO: add your own code here *//* Open the transfer instance with initial configuration. */err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);/* Initializes the module. */err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Enable channels. */err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);assert(FSP_SUCCESS == err);/* Initialize OLED screen */err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);assert(FSP_SUCCESS == err);OLED_Init();OLED_Clear();OLED_ShowString(0,0,"A D C ",16,1);OLED_ShowCHinese(48,0,0,1);//电OLED_ShowCHinese(64,0,1,1);//压OLED_ShowCHinese(80,0,2,1);//表OLED_ShowString(4,3,"ADC",16,0);OLED_ShowCHinese(32,3,3,0);//值OLED_ShowChar(48,3,':',16,0);OLED_ShowCHinese(0,6,0,0);//电OLED_ShowCHinese(16,6,1,0);//压OLED_ShowCHinese(32,6,3,0);//值OLED_ShowChar(48,6,':',16,0);OLED_ShowChar(100,6,'V',16,0);while(1){uint16_t adc_data0 = 0;double a0;/* Enable scan triggering from ELC events. */(void) R_ADC_ScanStart(&g_adc0_ctrl);scan_complete_flag = false;while (!scan_complete_flag){/* Wait for callback to set flag. */}err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data0);assert(FSP_SUCCESS == err);a0=(double)(adc_data0/4095.0)*3.3;printf("P510(AN0)=%d,voltage=%f\n",adc_data0,a0);OLED_ShowNum(60, 3, adc_data0, 4, 16, 0);OLED_ShowDecimal(60, 6, a0, 1, 2, 16, 0);R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);}
#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}

保存代码,重新构建工程。

硬件连接

  • SWDIO -> J-Link (DIO)
  • SWCLK -> J-Link (CLK)
  • P109 -> J-Link (RXD)
  • P110 -> J-Link (TXD)
  • P400 -> OLED (SCL)
  • P401 -> OLED (SDA)

效果展示

OLED 实时显示 ADC 引脚采集的电压值,刷新间隔为 500 毫秒。

在这里插入图片描述

动态刷新

在这里插入图片描述

同时串口打印电压值

在这里插入图片描述

总结

本文介绍了 RA-Eco-RA2L1-48PIN 开发板通过瑞萨 e2 Studio 灵活软件包(FSP)编程实现 ADC 串口采集电压和OLED显示电压数值的ADC电压表的项目设计。

项目包括串口电压值串口打印、硬件 IIC 通信协议配置、 OLED显示、效果展示等流程,为瑞萨单片机串口通信、IIC 通信、OLED 显示和 ADC 相关产品的开发设计和快速应用提供了参考。

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

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

相关文章

GraphQL在.NET 8中的全面实践指南

一、GraphQL与.NET 8概述 GraphQL是一种由Facebook开发的API查询语言&#xff0c;它提供了一种更高效、更灵活的替代REST的方案。与REST不同&#xff0c;GraphQL允许客户端精确指定需要的数据结构和字段&#xff0c;避免了"过度获取"或"不足获取"的问题。…

Elasticsearch 写入性能优化有哪些常见手段?

Elasticsearch 写入性能优化常见手段主要有以下 10 个方向&#xff0c;建议根据具体业务场景组合使用&#xff1a; 批量写入优化 使用_bulk API 批量提交文档建议每批次 5-15MB 数据量并发执行多个批量请求 索引配置调优 PUT /my_index {"settings": {"inde…

【图像大模型】基于深度对抗网络的图像超分辨率重建技术ESRGAN深度解析

基于深度对抗网络的图像超分辨率重建技术ESRGAN深度解析 一、技术背景与核心创新1.1 图像超分辨率技术演进1.2 核心技术创新对比 二、算法原理深度解析2.1 网络架构设计2.1.1 RRDB模块结构 2.2 损失函数设计2.2.1 对抗损失&#xff08;Adversarial Loss&#xff09;2.2.2 感知损…

第八天 搭建车辆状态监控平台(Docker+Kubernetes) OTA升级服务开发(差分升级、回滚机制)

前言 在智能网联汽车快速发展的今天&#xff0c;车辆状态监控和OTA&#xff08;Over-The-Air&#xff09;升级已成为智能汽车的核心能力。本文将手把手带你从零开始搭建基于云原生技术的车辆状态监控平台&#xff0c;并开发完整的OTA升级服务系统。无论你是刚接触容器技术的开…

五分钟学会如何封装Jsckson工具类

前言&#xff1a;在 Java 开发中&#xff0c;JSON 是一种非常常见的数据格式&#xff0c;而 Jackson 是处理 JSON 的主流库之一&#xff0c;为了提高代码的复用性、可维护性&#xff0c;我们通常会将 Jackson 的操作封装成一个工具类&#xff0c;简化使用。 ✨✨✨这里是秋刀鱼…

InternLM 论文分类微调实践(XTuner 版)

1.环境安装 我创建开发机选择镜像为Cuda12.2-conda&#xff0c;选择GPU为100%A100的资源配置 Conda 管理环境 conda create -n xtuner_101 python3.10 -y conda activate xtuner_101 pip install torch2.4.0cu121 torchvision torchaudio --extra-index-url https://downloa…

软考中级软件设计师——设计模式篇

一、设计模式核心分类 设计模式分为 3 大类&#xff0c;共 23 种模式&#xff08;考试常考约 10-15 种&#xff09;&#xff1a; 分类核心模式考试重点创建型模式工厂方法、抽象工厂、单例、生成器、原型单例模式的实现&#xff08;懒汉、饿汉&#xff09;、工厂模式的应用场…

小米2025年校招笔试真题手撕(一)

一、题目 小A每天都要吃a,b两种面包各一个。而他有n个不同的面包机&#xff0c;不同面包机制作面包的时间各不相同。第i台面包机制作a面包 需要花费ai的时间&#xff0c;制作b面包则需要花费bi的时间。 为能尽快吃到这两种面包&#xff0c;小A可以选择两个不同的面包机x&…

【微信小程序 + 高德地图API 】键入关键字搜索地址,获取经纬度等

前言 又到熟悉的前言&#xff0c;接到个需求&#xff0c;要引入高德地图api&#xff0c;我就记录一下&#xff0c;要是有帮助记得点赞、收藏、关注&#x1f601;。 后续有时间会慢慢完善一些文章&#xff1a;&#xff08;画饼时间&#xff09; map组件自定义气泡、mark标记点…

uni-app(2):页面

1 页面简介 uni-app项目中&#xff0c;一个页面就是一个符合Vue SFC规范的 vue 文件。 在 uni-app js 引擎版中&#xff0c;后缀名是.vue文件或.nvue文件。 这些页面均全平台支持&#xff0c;差异在于当 uni-app 发行到App平台时&#xff0c;.vue文件会使用webview进行渲染&…

Axure实战:智慧水务管理系统原型设计速览

本原型通过Axure构建覆盖生产到服务的全流程交互模型&#xff0c;聚焦"数据驱动智能决策"核心价值&#xff0c;助力水务企业实现管理效率提升与运营成本优化。 系统采用"13N"架构&#xff1a; 1个统一入口&#xff1a;集成单点登录与角色动态权限&#xff…

十二、Linux实现截屏小工具

系列文章目录 本系列文章记录在Linux操作系统下&#xff0c;如何在不依赖QT、GTK等开源GUI库的情况下&#xff0c;基于x11窗口系统&#xff08;xlib&#xff09;图形界面应用程序开发。之所以使用x11进行窗口开发&#xff0c;是在开发一个基于duilib跨平台的界面库项目&#x…

蓝桥杯分享经验

系列文章目录 提示&#xff1a;小白先看系列 第一章 蓝桥杯的钱白给吗 文章目录 系列文章目录前言一、自我介绍二、经验讲解:1.基础知识2.进阶知识3.个人观点 三、总结四、后续 前言 第十六届蓝桥杯已经省赛已经结束了&#xff0c;相信很多小伙伴也已经得到自己的成绩了。接下…

XC3588H搭载国产麒麟系统可用于政务/社保一体机吗?

答案是肯定的。 向成电子XC3588H搭载的国产银河麒麟系统和国产星光麒麟系统已完成适配&#xff0c;适用于政务服务、社保服务一体机的所有外设&#xff0c;运行稳定流畅。 在数字化政务快速发展的今天&#xff0c;政务服务终端的稳定性、安全性与高效性成为提升群众办事体验的关…

如何排查服务器 CPU 温度过高的问题并解决?

服务器CPU温度过高是一个常见的问题&#xff0c;可能导致服务器性能下降、系统稳定性问题甚至硬件损坏。有效排查和解决服务器CPU温度过高的问题对于确保服务器正常运行和延长硬件寿命至关重要。本文将介绍如何排查服务器CPU温度过高的问题&#xff0c;并提供解决方法&#xff…

物联网、云计算技术加持,助推楼宇自控系统实现智能高效管理

在建筑智能化发展的进程中&#xff0c;楼宇自控系统作为实现建筑高效管理的核心载体&#xff0c;正面临着数据海量复杂、设备协同困难、管理响应迟缓等挑战。而物联网与云计算技术的深度融合&#xff0c;为楼宇自控系统的升级提供了全新的解决方案&#xff0c;赋予其智能感知、…

uni-app使用大集

1、手动修改页面标题 uni.setNavigationBarTitle({title: 修改标题 }); 2、单选 不止有 radio-group&#xff0c;还有 uni-data-checkbox 数据选择器 <!-- html部分 --> <uni-data-checkbox v-model"sex" :localdata"checkboxList"></u…

(6)python爬虫--selenium

文章目录 前言一、初识selenium二、安装selenium2.1 查看chrome版本并禁止chrome自动更新2.1.1 查看chrome版本2.1.2 禁止chrome更新自动更新 2.2 安装对应版本的驱动程序2.3安装selenium包 三、selenium关于浏览器的使用3.1 创建浏览器、设置、打开3.2 打开/关闭网页及浏览器3…

基于OpenCV的人脸微笑检测实现

文章目录 引言一、技术原理二、代码实现2.1 关键代码解析2.1.1 模型加载2.1.2 图像翻转2.1.3 人脸检测 微笑检测 2.2 显示效果 三、参数调优建议四、总结 引言 在计算机视觉领域&#xff0c;人脸检测和表情识别一直是热门的研究方向。今天我将分享一个使用Python和OpenCV实现…

Java 大视界 -- 基于 Java 的大数据分布式存储在视频会议系统海量视频数据存储与回放中的应用(263)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…