很荣幸能获得这次RA-Eco-RA6M4开发版试用评测的机会,正好手头也有一些大学时候做项目留下的传感器,就打算用这个来入门这款瑞萨MCU。

目前瑞萨RA系列的MCU都是使用的ARM架构,所以是可以在IAR或者KEIL上开发的,不过对各个特性支持最友好的还是官方的e2studio搭配FSP(灵活配置软件包),用大家比较常用的STM32来类比的话e2studio类似于KEIL5,FSP类似于CubeMX,一个是IDE一个是图形化配置界面。
所以这次的开发环境是e2studio加FSP,使用到的硬件为瑞萨RA-Eco-RA6M4开发板做个入门开发熟悉。
安装好e2studio以及FSP插件后,可以直接选择新建RA工程,按照原理图和例程指导,进行IDE的熟悉和线路板接口配置的熟悉。


IDE设置如下:(我只设置一个PIN)



编写串口代码和LED代码。本以为按照教程没什么问题,哪知编译后出现了好几个错误。
一堆弱函数没有定义(我使用的FSP是6.0.0).照着网上资料修改了一番,记得之前在其他电脑用RA2之类的都没出现过问题。一直没怀疑过FSP.
网上有这么一部分资料:
在嵌入式系统的开发中,尤其是在使用GNU编译器集合(GCC)时,–specs 参数用于指定链接时使用的系统规格(specs)文件。这些规格文件控制了编译器和链接器的行为,尤其是关于系统库和启动代码的链接。–specs=rdimon.specs 和 --specs=nosys.specs 是两种常见的规格文件,它们用于不同的场景。
我修改了,确实编译OK,但是跟之前想像的不一样。后来在野火网站上找到了解决问题的点。

按照资料更改后。完美运行串口和GPIO。如下视频
`部分代码如下:
#include "hal_data.h"
#include "stdio.h"
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
int _isatty(int fd);
int _close(int fd);
int _lseek(int fd, int ptr, int dir);
int _fstat(int fd, struct stat *st);
attribute((weak)) int _isatty(int fd)
{
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
return 1;
errno = EBADF;
return 0;
}
attribute((weak)) int _close(int fd)
{
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
return 0;
errno = EBADF;
return -1;
}
attribute((weak)) int _lseek(int fd, int ptr, int dir)
{
(void) fd;
(void) ptr;
(void) dir;
errno = EBADF;
return -1;
}
attribute((weak)) int _fstat(int fd, struct stat st)
{
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
{
st->st_mode = S_IFCHR;
return 0;
}
errno = EBADF;
return 0;
}
volatile bool uart_send_complete_flag = false;
volatile bool uart_receive_complete_flag = false;
/ 串口中断回调 /
void uart9_callback (uart_callback_args_t * p_args)
{
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
{
/ 把串口接收到的数据发送回去 */
R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&(p_args->data), 1);
break;
}
case UART_EVENT_TX_COMPLETE:
{
uart_send_complete_flag = true;
break;
}
default:
break;
}
}
#if defined GNUC && !defined clang
int _write(int fd, char *pBuffer, int size); //防止编译警告
int _read(int fd, char pBuffer, int size);
/ 重定向 printf 输出 /
int _write(int fd, char pBuffer, int size)
{
(void) fd;
R_SCI_UART_Write (&g_uart9_ctrl, (uint8_t) pBuffer, (uint32_t) size);
while (uart_send_complete_flag == false)
;
uart_send_complete_flag = false;
return size;
}
/ 重定向scanf函数 /
int _read(int fd, char pBuffer, int size)
{
(void) fd;
R_SCI_UART_Read (&g_uart9_ctrl, (uint8_t) pBuffer, (uint32_t) size);
while (uart_receive_complete_flag == false);
uart_receive_complete_flag = false;
/ 回显 /
R_SCI_UART_Write (&g_uart9_ctrl, (uint8_t) pBuffer, (uint32_t) size);
return size;
}
#else
int fputc(int ch, FILE *f)
{
(void)f;
R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t )&ch, 1);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
return ch;
}
#endif
void hal_entry(void)
{
/ TODO: add your own code here /
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_UART_Open (&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
printf("这是一个串口收发回显例程\r\n");
while(1)
{
printf("hello world!\n");
// R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
//R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS); // NOLINT
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_10, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS); // NOLINT
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_10, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
/ Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
``