【瑞萨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中添加如下代码
- #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 */
复制代码- 在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函数会进行发送完成处理。
原因
阅读源码发现库里的收发依赖中断或数据传输控制器,也就是说,将一个字符串交给发送函数之后,会启动异步发送,这样是比较危险的行为,因为如果使用的是临时变量存着字符串,那么结果很可能会未知。
解决
直接使用寄存器操作,发送完成等待。
视频演示
|