瑞萨R7FA4L1BD4C开发板ADC功能测试及水位检测器制作
bili_73131580727
2025年05月23日 10:55

概述

本篇文章主要介绍如何使用e2studio灵活软件包(FSP)对瑞萨R7FA4L1BD4C单片机开发板进行ADC单通道采集电压,进行AD功能评估,以及制作水位检测器。其中重点介绍了使用另一个J-Link烧录固件至J-Link OB-STM32F072,对其升级,支持ARM v8 的 Renesas 芯片烧录及调试。

参考视频教学

网页链接​

方法说明

一.AD功能评估

创建工程

打开 e2 studio 软件

依次点击 文件 - 新建 - 瑞萨 C/C++ 项目 - Renesas RA

依次进行工程命名,路径设置,FSP版本,目标开发板选择,Device 选择 R7FA4L1BD4CFP ,工具链选择 GNU ARM Embedded

完成工程创建

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

输入代码,实现 ADC 采集与重定向串口打印输出。

其中因J-Link OB 不支持ARM v8-Mink OB进行如下改进:见下图

使用 另一个J-Link或DAP-Link 或 ST-Link 或 PW-Link 烧录更新的固件 J-Link OB-STM32F072-128KB-CortexM 20231030.bin固件至STM32F072CBT6芯片。

J-Link 序列号,即SN号设置:

J-Link Commander中输入 exec setsn=761111111

具体操作步骤为:

将 JLink 的 TypeA 公头接入电脑 USB,打开 J-Link Commander 软件(旧版本,见附件),输入指令exec setsn=761111111可。

烧录芯片时,若提示更新,则需要选择 NO 

SN 号只能写入一次,若需要修改,则重新烧录固件。出现下列界面则成功。

演示效果(见下面照片及视频)

也可以用瑞萨EN-CUBE3仿真器调试。

二.制作水位检测器

水位传感器运行原理

当平行铜线之间有水时,水浸没的高度不同,电流不同。 铜线间的电阻根据水位的变化而变化。

电阻与水的高度成反比(传感器浸水越深,导电性越好,电阻越小,电流越大)。

电路连接:

ADC 读取电压(V)与水位高度(mm)为线性相关关系:Y=41.774-38.686

从而得出水位值。

完整水位检测器 hal_entry.c 代码

#include "hal_data.h"

#include <stdio.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;

}

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);

  printf("hello world!\n");

  /* 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);

  while(1)

  {

    uint16_t adc_data25=0;

    double a25;

    /* 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_25, &adc_data25);

    assert(FSP_SUCCESS == err);

    a25=(double)(adc_data25/4095.0)*3.3;

    printf("P510(AN25)=%d,voltage=%f\n",adc_data25,a25);

    R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS);

  }

#if BSP_TZ_SECURE_BUILD

  /* Enter non-secure code */

  R_BSP_NonSecureEnter();

#endif

}

void R_BSP_WarmStart(bsp_warm_start_event_t event)

{

  if (BSP_WARM_START_RESET == event)

  {

#if BSP_FEATURE_FLASH_LP_VERSION != 0

    /* Enable reading from data flash. */

    R_FACI_LP->DFLCTL = 1U;

    /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and

     * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */

#endif

  }

  if (BSP_WARM_START_POST_C == event)

  {

    /* C runtime environment and system clocks are setup. */

    /* Configure pins. */

    R_IOPORT_Open (&IOPORT_CFG_CTRL, &IOPORT_CFG_NAME);

#if BSP_CFG_SDRAM_ENABLED

    /* Setup SDRAM and initialize it. Must configure pins first. */

    R_BSP_SdramInit(true);

#endif

  }

}

#if BSP_TZ_SECURE_BUILD

FSP_CPP_HEADER

BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();

BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()

{

}

FSP_CPP_FOOTER

#endif

演示效果(见视频)

结果结论及心得体会:

本人还通过programmer烧录LED灯点亮程序(见下面一个视频),以及驱动LCD点亮(见文中相关照片)。瑞萨RA4L1微控制器集成的外设,简化了设计并能加快开发过程。它有优越的关键性能,比如:灵活的连接性(UART通信接口等)满足工业自动化项目的需求。