瑞萨单片机william hill官网
直播中

范成功

12年用户 127经验值
擅长:嵌入式技术
私信 关注

【瑞萨RA4系列开发板体验】+ 第三章 RTT适配

rtt下载

下载的是最新发布的版本:

https://github.com/RT-Thread/rt-thread/archive/refs/tags/v4.1.1.zip

创建工程

  1. 解压压缩包
  2. 复制前面创建的Blink工程到<rt-thread目录>/bsp/renesas目录下
  3. 重命名为ra4m2-eco
  4. 从隔壁ra6m4-cpk复制board文件夹、template.uvprojx、SConstruct、SConscript、Kconfig、rtconfig.h、rtconfig.py
  5. 打开template.uvprojx,然后修改设备为R7FA4M2AD,然后关闭,自动更新tmeplate.uvprojx
  6. 通过env运行scons --target=mdk5生成project.uvprojx
  7. 打开project.uvprojx进行一次编译
  8. 到bsp\renesas\libraries\HAL_Drivers\config里,复制ra6m4并重命名为ra4m2
  9. 在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/* SOC_SERIES_R7FA4M2 */
  1. 在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里面添加了自己的配置如下图:
image.png

然后自动生成的名字(右边)是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函数会进行发送完成处理。

原因

阅读源码发现库里的收发依赖中断或数据传输控制器,也就是说,将一个字符串交给发送函数之后,会启动异步发送,这样是比较危险的行为,因为如果使用的是临时变量存着字符串,那么结果很可能会未知。

解决

直接使用寄存器操作,发送完成等待。

录制_2022_12_05_16_45_51_464

更多回帖

发帖
×
20
完善资料,
赚取积分