查看: 714|回复: 1

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

[复制链接]

116

主题

134

帖子

3778

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3778
发表于 2023-2-24 11:20:11 | 显示全部楼层 |阅读模式
【瑞萨RA4系列开发板体验】第三章 RTT适配
作者:wakojosin


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

创建工程
  • 解压压缩包
  • 复制前面创建的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中添加如下代码

  1. #ifdef SOC_SERIES_R7FA4M2
  2. #include "ra4m2/uart_config.h"

  3. #ifdef BSP_USING_ADC
  4. #include "ra4m2/adc_config.h"
  5. #endif

  6. #ifdef BSP_USING_DAC
  7. #include "ra4m2/dac_config.h"
  8. #endif

  9. #ifdef BSP_USING_PWM
  10. #include "ra4m2/pwm_config.h"
  11. #endif

  12. #ifdef BSP_USING_CAN
  13. #include "ra4m2/can_config.h"
  14. #endif
  15. #endif/* SOC_SERIES_R7FA4M2 */
复制代码
  • 在RA Smart Config中配置串口9,并添加user_uart9_callback函数



适配系统
修改_sys_tmpnam函数
  1. #if __ARMCC_VERSION > 6190000
  2. void _sys_tmpnam(char *name, int fileno, unsigned maxlength)
  3. {
  4.     rt_snprintf(name, maxlength, "tem%03d", fileno);
  5. }
  6. #else
  7. int _sys_tmpnam(char *name, int fileno, unsigned maxlength)
  8. {
  9.     rt_snprintf(name, maxlength, "tem%03d", fileno);
  10.     return 1;
  11. }
  12. #endif
复制代码
hal_entry函数修改为
  1. #include "rtthread.h"
  2. #include "drivers/pin.h"
  3. #include "bsp_api.h"

  4. void hal_entry (void)
  5. {
  6.     rt_pin_mode(BSP_IO_PORT_04_PIN_04, PIN_MODE_OUTPUT);

  7.     while (1)
  8.     {
  9.         rt_pin_write(BSP_IO_PORT_04_PIN_04, !rt_pin_read(BSP_IO_PORT_04_PIN_04));
  10.         rt_thread_mdelay(1000);
  11.     }
  12. }
复制代码
修改console,默认是uart,修改为uart9,通过env里面menuconfig进行修改
修改bsp\renesas\libraries\HAL_Drivers\drv_usart_v2.c内的相关函数。

  1. static inline void ra_uart_putc_1(struct ra_uart *uart, char c)
  2. {
  3.     sci_uart_instance_ctrl_t *p_ctrl = (sci_uart_instance_ctrl_t *)uart->config->p_api_ctrl;
  4.     p_ctrl->p_reg->TDR = c;
  5.     while ((p_ctrl->p_reg->SSR_b.TEND) == 0);
  6. }
  7. static int ra_uart_putc(struct rt_serial_device *serial, char c)
  8. {
  9.     struct ra_uart *uart;
  10.     RT_ASSERT(serial != RT_NULL);

  11.     uart = rt_container_of(serial, struct ra_uart, serial);
  12.     RT_ASSERT(uart != RT_NULL);

  13.     ra_uart_putc_1(uart, c);

  14.     return RT_EOK;
  15. }
  16. rt_size_t ra_uart_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, rt_uint32_t tx_flag)
  17. {
  18.     struct ra_uart *uart;

  19.     RT_ASSERT(serial != RT_NULL);
  20.     RT_ASSERT(buf != RT_NULL);
  21.     uart = rt_container_of(serial, struct ra_uart, serial);

  22.     for(int i=0;i<size; i++) {
  23.         ra_uart_putc_1(uart, buf[i]);
  24.     }
  25.     return size;
  26. }
复制代码


遇到的问题
移植过程参考了《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函数会进行发送完成处理。


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


解决
直接使用寄存器操作,发送完成等待。
视频演示

回复

使用道具 举报

3

主题

195

帖子

1510

积分

金牌会员

Rank: 6Rank: 6

积分
1510
发表于 2023-3-14 10:18:23 | 显示全部楼层

不错学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户排行榜

RA助手

主题: 116帖子:134精华:0

RA_Lance

主题: 92帖子:132精华:9

lugl

主题: 44帖子:133精华:0

xujiwei263

主题: 16帖子:73精华:0

books咦

主题: 11帖子:11精华:2

Juggernaut

主题: 9帖子:95精华:0
快速回复 返回顶部 返回列表