一、前言
本项目基于瑞萨RA6M5 ADC进行信号采集,DSP算法库进行信号分析,实现信号处理分析前端。
基于此实现各种信号分析的应用场景,比如电能质量分析、噪声分析、虚拟示波器、滤波器等等,All In One并且方便扩展更多的应用,是一个瑞士军刀类型的工具集。并且设计了命令行交互等,可以和上位机进行交互、可视化,或者供其他主机调用。
本文尽可能详细地介绍整个实现过程。框图:
二、准备
2.1 安装RASC和MDK
参考相关资料,这里不再赘述
2.2 芯片手册
下载芯片手册链接:https://www.renesas.cn/cn/zh/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ra6m5-200mhz-arm-cortex-m33-trustzone-highest-integration-ethernet-and-can-fd#overview
2.3 熟悉原理图
原理图等资料可以如下地址下载
https://doc.embedfire.com/products/link/zh/latest/mcu/renesas/ebf_ra.html
这里对基本的接口熟悉,其他模块用到再去看原理图。
2.3.1 时钟
提供了24MHz的外部晶体,接P212和P213可以使用其作为系统时钟源
2.3.2调试串口
使用CH340G实现USB转串口接P511,P512
2.3.3 仿真与BOOT接口
全引脚JTAG可以接20PJTAG接口,SWD可以使用J4,我这里使用SWD。另外J17默认短接12为单芯片运行模式,短接23则为SCI/USB BOOT模式。
2.3.4LED
三个LED接P400 P403 P404
三、创建工程
3.1 创建工程
打开RASC指定工程目录,设置工程名->Next
3.2 配置BSP
时钟配置前面我们看到原理图提供了24MHz外部晶体我们就使用该晶体做欸时钟源,通过PLL得到系统时钟,如下所示
3.3 MDK配置
使用MDK打开test.uvprojx
先编译没问题
右键点击Target1->Options For Target ‘Target 1’
选择仿真器CMSIS_DAP然后点击Settings
四、LED控制
4.1 代码
我们可以看到配置的P400 P403 P404在pin_data.c中如下
R_IOPORT_PinWrite(&g_ioport_ctrl, LED1, BSP_IO_LEVEL_LOW); //LED1亮
R_IOPORT_PinWrite(&g_ioport_ctrl, LED2, BSP_IO_LEVEL_LOW); //LED2亮
R_IOPORT_PinWrite(&g_ioport_ctrl, LED3, BSP_IO_LEVEL_LOW); //LED3亮
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
R_IOPORT_PinWrite(&g_ioport_ctrl, LED1, BSP_IO_LEVEL_HIGH); //LED1灭
R_IOPORT_PinWrite(&g_ioport_ctrl, LED2, BSP_IO_LEVEL_HIGH); //LED2灭
R_IOPORT_PinWrite(&g_ioport_ctrl, LED3, BSP_IO_LEVEL_HIGH); //LED3灭
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
修改代码后再次编译代码。
4.2仿真调试
点击如下图标仿真并运行到main函数处
五、串口收发
volatile static int send_flag = 0;
void uart_init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_UART_Open (&g_uart4_ctrl, &g_uart4_cfg);
assert(FSP_SUCCESS == err);
}
void uart_write(uint8_t* buffer, uint32_t len)
{
fsp_err_t err = FSP_SUCCESS;
send_flag = 0;
err = R_SCI_UART_Write(&g_uart4_ctrl, buffer, len);
while(send_flag==0);
}
void uart_callback (uart_callback_args_t * p_args)
{
uint8_t val = 0;
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
{
/* 把串口接收到的数据发送回去 */
val = *(uint8_t *)&(p_args->data);
//R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&(p_args->data), 1);
uart_write(&val, 1);
break;
}
case UART_EVENT_TX_COMPLETE:
{
send_flag = 1;
break;
}
default:
break;
}
}
uart.h函数接口
void uart_init(void);
六、串口驱动
typedef struct
{
uint32_t datalen_u32;
uint32_t maxlen_u32;
uint32_t in_u32;
uint32_t out_u32;
uint8_t* buffer_pu8;
}ring_buffer_t;
uint8_t uart_ring_buffer[128];
ring_buffer_t s_ring_buffer_t=
{
.datalen_u32 = 0,
.maxlen_u32 = sizeof(uart_ring_buffer),
.in_u32 = 0,
.out_u32 = 0,
.buffer_pu8 = uart_ring_buffer,
};
6.2 临界段处理
缓冲区在中断和API中都需要操作,所以需要临界段保护,采用简单的开关中断方式。
Enter_Critical();
Exit_Critical() ;
6.3 串口接收中断
调用uart_rx_handler进行处理
void uart_callback (uart_callback_args_t * p_args)
{
uint8_t val = 0;
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
{
/* 把串口接收到的数据发送回去 */
val = *(uint8_t *)&(p_args->data);
//R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&(p_args->data), 1);
//uart_write(&val, 1);
uart_rx_handler(&val, 1);
break;
}
case UART_EVENT_TX_COMPLETE:
{
send_flag = 1;
break;
}
default:
break;
}
}
void uart_rx_handler(const uint8_t *buffer, uint32_t length)
{
uint32_t i;
for(i=0;i
{
if(s_ring_buffer_t.datalen_u32 < s_ring_buffer_t.maxlen_u32)
{
s_ring_buffer_t.buffer_pu8[s_ring_buffer_t.in_u32] = buffer;
s_ring_buffer_t.datalen_u32++;
s_ring_buffer_t.in_u32++;
s_ring_buffer_t.in_u32 %= s_ring_buffer_t.maxlen_u32;
}
else
{
/* full */
break;
}
}
}
6.4 实现发送字节接口
uart.c中
void uart_sendbyte(uint8_t ch)
{
uint8_t val = ch;
uart_write(&val, 1);
}
6.5 发送API
int drv_uart_write(uint8_t *buff, uint32_t len)
{
uint32_t i;
for(i=0; i
{
uart_sendbyte(buff);
}
return 0;
}
6.6 接收API
uint32_t drv_uart_read(uint8_t *buff, uint32_t len)
{
uint32_t readlen = 0;
//uint32_t mask;
if(s_ring_buffer_t.datalen_u32 == 0)
{
return 0;
}
Enter_Critical();
uint32_t i;
for(i=0;i
{
if(s_ring_buffer_t.datalen_u32 > 0)
{
buff = s_ring_buffer_t.buffer_pu8[s_ring_buffer_t.out_u32];
s_ring_buffer_t.datalen_u32--;
s_ring_buffer_t.out_u32++;
s_ring_buffer_t.out_u32 %= s_ring_buffer_t.maxlen_u32;
readlen++;
}
else
{
break;
}
}
Exit_Critical();
return readlen;
}
6.7 串口初始化
使用之前的初始化
void uart_init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_UART_Open (&g_uart4_ctrl, &g_uart4_cfg);
assert(FSP_SUCCESS == err);
}
6.8 代码
drv_uart.c
typedef struct
{
uint32_t datalen_u32;
uint32_t maxlen_u32;
uint32_t in_u32;
uint32_t out_u32;
uint8_t* buffer_pu8;
}ring_buffer_t;
uint8_t uart_ring_buffer[128];
ring_buffer_t s_ring_buffer_t=
{
.datalen_u32 = 0,
.maxlen_u32 = sizeof(uart_ring_buffer),
.in_u32 = 0,
.out_u32 = 0,
.buffer_pu8 = uart_ring_buffer,
};
void uart_rx_handler(const uint8_t *buffer, uint32_t length)
{
uint32_t i;
for(i=0;i
{
if(s_ring_buffer_t.datalen_u32 < s_ring_buffer_t.maxlen_u32)
{
s_ring_buffer_t.buffer_pu8[s_ring_buffer_t.in_u32] = buffer;
s_ring_buffer_t.datalen_u32++;
s_ring_buffer_t.in_u32++;
s_ring_buffer_t.in_u32 %= s_ring_buffer_t.maxlen_u32;
}
else
{
/* full */
break;
}
}
}
uint32_t drv_uart_read(uint8_t *buff, uint32_t len)
{
uint32_t readlen = 0;
//uint32_t mask;
if(s_ring_buffer_t.datalen_u32 == 0)
{
return 0;
}
Enter_Critical();
uint32_t i;
for(i=0;i
{
if(s_ring_buffer_t.datalen_u32 > 0)
{
buff = s_ring_buffer_t.buffer_pu8[s_ring_buffer_t.out_u32];
s_ring_buffer_t.datalen_u32--;
s_ring_buffer_t.out_u32++;
s_ring_buffer_t.out_u32 %= s_ring_buffer_t.maxlen_u32;
readlen++;
}
else
{
break;
}
}
Exit_Critical();
return readlen;
}
int drv_uart_write(uint8_t *buff, uint32_t len)
{
uint32_t i;
for(i=0; i
{
uart_sendbyte(buff);
}
return 0;
}
void drv_uart_init(uint32_t baud)
{
(void)baud;
}
drv_uart.h
void drv_uart_init(uint32_t baud);
uint32_t drv_uart_read(uint8_t *buff, uint32_t len);
int drv_uart_write(uint8_t *buff, uint32_t len);
void uart_rx_handler(const uint8_t *buffer, uint32_t length);
extern void uart_sendbyte(uint8_t ch);
6.9 测试
uint8_t buffer[128];
for(;;)
{
uint32_t len=0;
if((len = drv_uart_read(buffer, sizeof(buffer))) >0)
{
drv_uart_write(buffer, len);
}
}
复制下方网址到浏览器中打开进入瑞萨中文论坛了解更多:
https://community-ja.renesas.com/zh/frums-groups/mcu-mpu/
未完待续
推荐阅读
【瑞萨RA MCU创意氛围赛作品赏析】项目8——NES游戏机
【瑞萨RA MCU创意氛围赛作品赏析】项目9——环境温湿度监测装置
【瑞萨RA MCU创意氛围赛作品赏析】项目10——物联网居家环境/健康监控设备