本帖最后由 jf_1137202360 于 2022-12-13 14:01 编辑
下载Demo代码https://github.com/renesas/ra-fsp-examples/tree/master/example_projects/ek_ra4m2
基于ra-fsp-examplesexample_projectsek_ra4m2sci_uartsci_uart_ek_ra4m2_epkeilsci_uart_ek_ra4m2_ep.uvprojx
工程测试
串口配置原理图可以看到使用串口9,引脚P109和P110
串口9和JTAG引脚有复用
所以先配置位SWD调试接口
再配置串口9引脚
再配置串口9属性
再重新生成
坑接上USB后始终不能接收到数据,CH340G串口枚举正常,设备管理器串口号也正常,
使用逻辑分析仪直接查看P109TX引脚是有数据的,且CH340G对应引脚也有数据,说明H340G有问题,短接TX RX 也不能收发,更加说明CH340G本身就有问题了。
买了几片CH340G,到时换了再确认。
先直接使用其他的USB转串口线接到P109和P110测试。
标准输入输出重定向测试网上可以搜到大量MDK重定向标准输入输出的文章,都是只有结果,直接给出了代码。作为嵌入式开发,第一手资料是芯片手册和开发环境的帮助文档,所以了解如何去获取相关内容更重要。这样对于一个全新的平台也能很快入手。
MDK菜单栏
Help->uVision Help
我们知道printf属于stdio,所以我们就搜索stdio关键字,一个个看搜索出来的结果,很快就能看到如下关键内容,正是我们需要的
FSP的接口实在是不好用,所以重写收发接口。
uart_ep.c中实现串口查询收发
引用: void uart_poll_send(uint8_t ch)
{
g_uart_ctrl.p_reg->TDR = ch;
while(g_uart_ctrl.p_reg->SSR_b.TEND == 0);
}
uint8_t uart_poll_read(void)
{
while(g_uart_ctrl.p_reg->SSR_b.RDRF == 0);
return g_uart_ctrl.p_reg->RDR;
}
添加文件retarget.c
引用: #include
#include
#include "hal_data.h"
void uart_poll_send(uint8_t ch);
uint8_t uart_poll_read(void);
int fputc(int ch, FILE *f)
{
(void)f;
uint8_t data = (uint8_t)ch;
/* Your implementation of fputc(). */
uart_poll_send(data);
return ch;
}
int fgetc(FILE *f)
{
(void)f;
/* Your implementation of fgetc(). */
return (int)uart_poll_read();
}
hal_entry.c中
引用: void hal_entry(void)
{
/* Initializing UART */
uart_initialize();
int a;
int b;
printf("Hello World!rn");
while(1)
{
printf("please input a and b:");
scanf("%d %d",&a,&b);
printf("%d+%d=%drn",a,b,a+b);
}
}
总结个人觉得瑞萨的串口驱动写的很烂,根本不好使用,搞一堆什么回调,貌似看起来是搞得驱动,实际根本不是驱动,杂糅在一起,根本没有分层思想,搞得很复杂,实际上根本不方便使用。哪怕就是要简单使用查询进行收发都不行,只能用它那一堆回调。哪怕是和意法半导体一样搞个标准外设库,提供基本的外设配置接口也好,具体逻辑用户自己去实现就可以了。总之瑞萨的FSP个人觉得是一个比较反人类的设计。