瑞萨 RX23E-A MCU UART 和 ADC 调试经验分享
背景介绍
瑞萨 RX23E-A 系列微控制器配备模拟前端,无需校准即可测量温度、压力、流量和重量,精度优于 0.1%,是高精度传感、测试和测量设备的理想之选。CPU 配备 RXv2 内核,在 DSP/FPU 运行中表现卓越,可以单芯片实现高精度测量、控制和通信。
瑞萨 RX23E-A MCU 特性
- 双 24 位 delta sigma 模数转换器:高达 23 位的有效分辨率,可编程数据速率为 7.6sps 至 15,625ksps
- PGA:轨到轨模拟输入,增益 1 至 128 倍,失调漂移 10nV/°C,增益漂移 1ppm/°C
- 基准电压源:10ppm/°C 的低温漂特性,具有良好的温度稳定性
- 励磁电流源:匹配可编程电流源
- CPU:32 位 RXv2 (32MHz)
- 数字信号处理的 DSP/FPU
- 接口:SPI x 1 通道、UART x 4 通道、I2C x 1 通道、CAN x 1 通道
- 可以直接连接传感器,如 PT100、扩散硅压力传感器
下图 (图1) 为瑞萨 RX23E-A MCU 的系统框图:

调试步骤
一、新建工程文件
如下图 (图2) 所示,打开 e2studio,添加 RX23E-A_UART_ADC 工程文件。

创建完成后,对该工程进行编译,同时需确保编译无错误,具体操作如下图 (图3) 所示:

二、配置串口
首先打开左侧资源管理器中的 RX23EA UART ADC.scfg 文件,选中该文件 Components 功能区后,点击下图 (图4) 中第 3 个红色方框内标记的 button 以打开 Software Component Selection:

接下来根据下图 (图5) 的步骤,从可选的组件中选择 SCI/SCIF Asynchronous Mode,为新组件添加新配置,选择“SCI1”模块。

完成以上操作后,配置串口参数,具体参数可参考下图 (图6):

配置完成后,点击“Generate Code”生成代码。回到 RX23E-A_UART_ADC 工程文件即可看到串口文件,如下图 (图7) 所示:

接下来打开 Config_SCI1_user.c 文件,在下图 (图8) 所标记箭头处添加代码,相应的注意事项请参考图内说明。

下图 (图9) 为代码添加成功后的显示信息界面:

在使用 printf 函数进行串口打印前,我们需要对串口重定向,具体步骤如下图 (图10):

具体代码如下:
#include "r_smc_entry.h"
#include "platform.h"
void main(void);
extern volatile uint8_t g_sci1_tx_end;
void my_sw_charput_function(char output_char);
void main(void)
{
R_Config_SCI1_Start();//串口初始化
while(1)
{
printf(" Renesas RX23E-A MCU \r\n");
}
}
//串口重定向
void my_sw_charput_function(char output_char)
{
R_Config_SCI1_Serial_Send((uint8_t *) &output_char,1);
while(g_sci1_tx_end == false);
g_sci1_tx_end = false;
}
接下来对工程进行编译,确认无错误后进行烧录,烧录完成后开始运行,如下图 (图11) 所示:

完成上述操作后,使用 printf 函数进行串口打印,串口打印信息如下图 (图12):

下图 (图13) 为 RX23E-A 串口配置成功硬件连接示意图:

三、配置 24bit ADC
像前面配置串口一样,点击左侧资源管理器中的 RX23EA UART ADC.scfg 文件,选择该文件 Components 功能区后打开 Software Component Selection,选择“DSAD0”模块。

接下来设置 ADC 的采样率、通道数等参数,各参数如下图 (图15) 所示。在配置完成后点击界面右上方“Generate Code”即可生成代码。

生成 ADC 代码后,打开工程文件,在 Config_DSAD0.h 添加如下代码:
bool r_dsad0_IsConversionEnd (void);
void r_dsad0_ClearIrFlag (void);
在 Config_DSAD0.c 文件下面添加如下代码:
bool r_dsad0_IsConversionEnd (void)
{
return (bool) ((1U == IR(DSAD0, ADI0)) ? true : false);
}
void r_dsad0_ClearIrFlag (void)
{
IR(DSAD0, ADI0)= 0U;
}
ADC 配置完成,在主函数页面添加如下图 (图16) 代码:

完整代码如下:
/***********************************************************************
*
* FILE : RX23EA_UART_ADC.c
* DATE : 2024-10-24
* DESCRIPTION : Main Program
*
* NOTE:THIS IS A TYPICAL EXAMPLE.
*
***********************************************************************/
#include "r_smc_entry.h"
#include "platform.h"
void main(void);
extern volatile uint8_t g_sci1_tx_end;
void my_sw_charput_function(char output_char);
//bool timer_flag = false;
void main(void)
{
uint32_t dsad0_reg; /**DSAD0.DR register storage variable */
float ADC_Data0_0,ADC_Data0_1,ADC_Data0_2,ADC_Data0_3,ADC_Data0_4,ADC_Data0_5;
int32_t dsad0_value_0,dsad0_value_1,dsad0_value_2,dsad0_value_3,dsad0_value_4,dsad0_value_5;
R_Config_SCI1_Start();//串口初始化
R_Config_DSAD0_Start();//ADC初始化
R_Config_DSAD0_Set_SoftwareTrigger();//软件触发方式
while(1)
{
r_dsad0_ClearIrFlag(); /** clear DSAD0 IR flag*/
if(DSAD0.DR.BIT.CCH == 0x01) //Channel 1 data
{
/** Get A/D value */
R_Config_DSAD0_Get_ValueResult( &dsad0_reg);
/** Flag mask, Sign extension */
dsad0_value_0 = (int32_t) ((dsad0_reg & 0x00FFFFFFU) <<8) >> 8;
ADC_Data0_0 = dsad0_value_0 * (5.0)/8388608;
}
if(DSAD0.DR.BIT.CCH == 0x02) //Channel 2 data
{
/** Get A/D value */
R_Config_DSAD0_Get_ValueResult( &dsad0_reg);
/** Flag mask, Sign extension */
dsad0_value_1 = (int32_t) ((dsad0_reg & 0x00FFFFFFU) <<8) >> 8;
ADC_Data0_1 = dsad0_value_1 * (5.0)/8388608;
}
if(DSAD0.DR.BIT.CCH == 0x03) //Channel 3 data
{
/** Get A/D value */
R_Config_DSAD0_Get_ValueResult( &dsad0_reg);
/** Flag mask, Sign extension */
dsad0_value_2 = (int32_t) ((dsad0_reg & 0x00FFFFFFU) <<8) >> 8;
ADC_Data0_2 = dsad0_value_2 * (5.0)/8388608;
}
if(DSAD0.DR.BIT.CCH == 0x04) //Channel 4 data
{
/** Get A/D value */
R_Config_DSAD0_Get_ValueResult( &dsad0_reg);
/** Flag mask, Sign extension */
dsad0_value_3 = (int32_t) ((dsad0_reg & 0x00FFFFFFU) <<8) >> 8;
ADC_Data0_3 = dsad0_value_3 * (5.0)/8388608;
}
if(DSAD0.DR.BIT.CCH == 0x05) //Channel 5 data
{
/** Get A/D value */
R_Config_DSAD0_Get_ValueResult( &dsad0_reg);
/** Flag mask, Sign extension */
dsad0_value_4 = (int32_t) ((dsad0_reg & 0x00FFFFFFU) <<8) >> 8;
ADC_Data0_4 = dsad0_value_4 * (5.0)/8388608;
}
if(DSAD0.DR.BIT.CCH == 0x06) //Channel 6 data
{
/** Get A/D value */
R_Config_DSAD0_Get_ValueResult( &dsad0_reg);
/** Flag mask, Sign extension */
dsad0_value_5 = (int32_t) ((dsad0_reg & 0x00FFFFFFU) <<8) >> 8;
ADC_Data0_5 = dsad0_value_5 * (5.0)/8388608;
}
printf("Channel_1 = %f \r\n",ADC_Data0_0);
printf("Channel_2 = %f \r\n",ADC_Data0_1);
printf("Channel_3 = %f \r\n",ADC_Data0_2);
printf("Channel_4 = %f \r\n",ADC_Data0_3);
printf("Channel_5 = %f \r\n",ADC_Data0_4);
printf("Channel_6 = %f \r\n",ADC_Data0_5);
R_BSP_SoftwareDelay((uint32_t)100, BSP_DELAY_MILLISECS);
//printf(" Renesas RX23E-A MCU \r\n");
}
}
//串口重定向
void my_sw_charput_function(char output_char)
{
R_Config_SCI1_Serial_Send((uint8_t *) &output_char,1);
while(g_sci1_tx_end == false);
g_sci1_tx_end = false;
}
代码添加完毕后,可点击如下图 (图17) 所示界面图标进行编译代码:

四、烧录程序
最后烧录程序。烧录成功后,可以给 RX23E-A 模拟输入口给一个模拟量,测试一下 ADC 性能。我们以 ADC0 (1-6 通道) 为例,硬件连接如下图 (图18) 所示:

分别为 6 个通道设置的电压值如下表:
通道 | 第一通道 | 第二通道 | 第三通道 | 第四通道 | 第五通道 | 第六通道 |
电压值 | 4.35V | 3.64V | 2.91V | 2.18V | 1.45V | 0.73V |
---|
实测结果 (用串口打印) 如下图 (图19) 所示:

总结
本文主要介绍瑞萨 RX23E-A 这款 MCU 的串口和 ADC 调试方法。欲了解更多瑞萨相关方案或技术信息,可点击下方「联系我们」,提交您的需求,骏龙科技公司愿意为您提供更详细的技术解答。
更多信息: