【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_FOOTER
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
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;
}
}
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)
-General
、Baud
、Interrupts
设置回调函数
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_FOOTER
fsp_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
#endif
PUTCHAR_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 相关产品的开发设计和快速应用提供了参考。