rtt下载
下载的是最新发布的版本:
https://github.com/RT-Thread/rt-thread/archive/refs/tags/v4.1.1.zip
创建工程
- 解压压缩包
- 复制前面创建的Blink工程到<rt-thread目录>/bsp/renesas目录下
- 重命名为ra4m2-eco
- 从隔壁ra6m4-cpk复制board文件夹、template.uvprojx、SConstruct、SConscript、Kconfig、rtconfig.h、rtconfig.py
- 打开template.uvprojx,然后修改设备为R7FA4M2AD,然后关闭,自动更新tmeplate.uvprojx
- 通过env运行scons --target=mdk5生成project.uvprojx
- 打开project.uvprojx进行一次编译
- 到bsp\renesas\libraries\HAL_Drivers\config里,复制ra6m4并重命名为ra4m2
- 在drv_config.h中添加如下代码
#ifdef SOC_SERIES_R7FA4M2
#include "ra4m2/uart_config.h"
#ifdef BSP_USING_ADC
#include "ra4m2/adc_config.h"
#endif
#ifdef BSP_USING_DAC
#include "ra4m2/dac_config.h"
#endif
#ifdef BSP_USING_PWM
#include "ra4m2/pwm_config.h"
#endif
#ifdef BSP_USING_CAN
#include "ra4m2/can_config.h"
#endif
#endif
- 在RA Smart Config中配置串口9,并添加user_uart9_callback函数
适配系统
修改_sys_tmpnam函数
#if __ARMCC_VERSION > 6190000
void _sys_tmpnam(char *name, int fileno, unsigned maxlength)
{
rt_snprintf(name, maxlength, "tem%03d", fileno);
}
#else
int _sys_tmpnam(char *name, int fileno, unsigned maxlength)
{
rt_snprintf(name, maxlength, "tem%03d", fileno);
return 1;
}
#endif
hal_entry函数修改为
#include "rtthread.h"
#include "drivers/pin.h"
#include "bsp_api.h"
void hal_entry (void)
{
rt_pin_mode(BSP_IO_PORT_04_PIN_04, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(BSP_IO_PORT_04_PIN_04, !rt_pin_read(BSP_IO_PORT_04_PIN_04));
rt_thread_mdelay(1000);
}
}
修改console,默认是uart,修改为uart9,通过env里面menuconfig进行修改
修改bsp\renesas\libraries\HAL_Drivers\drv_usart_v2.c内的相关函数。
static inline void ra_uart_putc_1(struct ra_uart *uart, char c)
{
sci_uart_instance_ctrl_t *p_ctrl = (sci_uart_instance_ctrl_t *)uart->config->p_api_ctrl;
p_ctrl->p_reg->TDR = c;
while ((p_ctrl->p_reg->SSR_b.TEND) == 0);
}
static int ra_uart_putc(struct rt_serial_device *serial, char c)
{
struct ra_uart *uart;
RT_ASSERT(serial != RT_NULL);
uart = rt_container_of(serial, struct ra_uart, serial);
RT_ASSERT(uart != RT_NULL);
ra_uart_putc_1(uart, c);
return RT_EOK;
}
rt_size_t ra_uart_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, rt_uint32_t tx_flag)
{
struct ra_uart *uart;
RT_ASSERT(serial != RT_NULL);
RT_ASSERT(buf != RT_NULL);
uart = rt_container_of(serial, struct ra_uart, serial);
for(int i=0;i<size; i++) {
ra_uart_putc_1(uart, buf[i]);
}
return size;
}
遇到的问题
移植过程参考了《RA系列BSP制作教程.md》
其中主要是对RA工具及库的不熟悉导致的问题。
问题1
串口无输出,调试的时候库函数返回是成功的,SCI模块的发送状态也是有指示。这个问题拖了好久才发现。
原因
首先是在RA Smart config里面,我在pins里面添加了自己的配置如下图:
然后自动生成的名字(右边)是g_bsp_pin_cfg0,而原来的g_bsp_pin_cfg没用删除,导致不过如果配置引脚,串口工作都不正常。
解决
将Mnager Configurations里面的其他配置方案删除,修改g_bsp_pin_cfg0为g_bsp_pin_cfg后问题解决。
问题2
串口输出只要一个一个的字符,比如输出"hello",最后在串口上打印出来可能只要一个"o"。这是由于对库的不熟悉,想当然以为R_SCI_UART_Write函数会进行发送完成处理。
原因
阅读源码发现库里的收发依赖中断或数据传输控制器,也就是说,将一个字符串交给发送函数之后,会启动异步发送,这样是比较危险的行为,因为如果使用的是临时变量存着字符串,那么结果很可能会未知。
解决
直接使用寄存器操作,发送完成等待。