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

发布于:2025-05-22 ⋅ 阅读:(16) ⋅ 点赞:(0)

【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) - 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_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 相关产品的开发设计和快速应用提供了参考。


网站公告

今日签到

点亮在社区的每一天
去签到