本篇文章主要介绍如何使用e2studio灵活软件包(FSP)对瑞萨R7FA4L1BD4C单片机开发板进行ADC单通道采集电压,进行AD功能评估,以及制作水位检测器。其中重点介绍了使用另一个J-Link烧录固件至J-Link OB-STM32F072,对其升级,支持ARM v8 的 Renesas 芯片烧录及调试。
创建工程
打开 e2 studio 软件
依次点击 文件 - 新建 - 瑞萨 C/C++ 项目 - Renesas RA
依次进行工程命名,路径设置,FSP版本,目标开发板选择,Device 选择 R7FA4L1BD4CFP ,工具链选择 GNU ARM Embedded
完成工程创建
ADC 及串口配置完成后,构建工程,确保无误。
输入代码,实现 ADC 采集与重定向串口打印输出。
其中因J-Link OB 不支持ARM v8-M,ink 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
从而得出水位值。
#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通信接口等)满足工业自动化项目的需求。
