和高兴收到瑞萨电子RA4M2开发板,感谢RA生态工作室的工作人员,再次让我试用该开发板,因为我是一个不走寻常路的人,不想和其它使用人员写出一样的帖子,所以本次使用我会使用TTL的串口来实现串口打印输出功能,不会采用板载的USB串口,因为这个串口被很多人用了,用这个就是复制别人的帖子没有区别了,所以我采用另外一种模式来实现串口功能!!!!好了,话不多说,开始进入正题。
1。打开原理图,查看板子的串口引脚图

图中USB串口使用P110和P109作为串口引脚,
我不使用这两个引脚,另辟蹊径,采用P100,P101

作为串口引脚
2。打开瑞萨RA Smart Configurator5.6.0 IDE

命名为UART_TTL,因为此次串口我试用TTL电平驱动,不使用USB串口

点击next
选择EK-RA4M2

继续

继续

继续

3。配置串口引脚
因为我选的是P100和P101引脚,对应的是SCI0



然后点击生成代码
4。打开KEIL

先选择芯片型号

选好后如下

点击编译生成代码

发现有个错误,UART0_callback,这是我定义的串口中断函数名称,需要添加名称和功能进行修改
void UART0_callback(uart_callback_args_t * p_args)
{
switch (p_args->event)
{
//如果是串口接收中断
case UART_EVENT_RX_CHAR:
{
UART_Agreement(p_args);//串口通讯协议判断
if(USART_RX_STA&0x8000)//如果接收完成
{
USART_RX_BUF[USART_RX_STA&0x3FFF] = 0x0d;//将字符串自动换行
USART_RX_STA++; //因为增加了0x0d,所以字符串数量+1
R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t*)USART_RX_BUF, USART_RX_STA&0x3fff);//将字符串数据输出
USART_RX_STA=First_String_num; //将USART_RX_STA初始化
}
break;
}
//如果是串口发送中断
case UART_EVENT_TX_COMPLETE:
{
uart_send_complete_flag = true;
break;
}
default:
break;
}
}



此段我采用了原子的串口解析处理
/*
USART_RX_STA
=============================================================================================================
bit15 | bit14 | bit13--bit0
接收完成标志位(0x0A,换行键) | 接收到0x0d(回车键) | 接收到的有效数据个数
=============================================================================================================
*/

void UART_Agreement(uart_callback_args_t * p_args)
{
if((USART_RX_STA&0x8000)==0) //bit15没有被置为1,接收未完成
{
if(USART_RX_STA&0x4000) //bit14被置为1,表示接收到了'\n'(0x0d)
{
if((p_args->data)!=0x0a)USART_RX_STA=0; //如果bit14被置1了,但是bit15并不是换行操作,表示接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到'\n'(0x0d)
{
if((p_args->data)==0x0d)USART_RX_STA|=0x4000; //如果接收到了'\n'(0x0d),bit14被置为1
else
{
USART_RX_BUF[USART_RX_STA&0x3FFF]=(uint8_t)(p_args->data);//如果没有接收到结束标志,继续将数据写入USART_RX_BUF[]
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0; //如果接收到的数据大于定义最大接收字节数,表示接收数据错误,重新开始接收
}
}
}
}

/* 重定向 printf 输出 */
#if defined GNUC && !defined clang
int _write(int fd, char *pBuffer, int size); //防止编译警告
int _write(int fd, char *pBuffer, int size)
{
(void)fd;
R_SCI_UART_Write(&g_uartx_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
return size;
}
#else
int fputc(int ch, FILE *f)
{
(void)f;
R_SCI_UART_Write(&g_uartx_ctrl, (uint8_t *)&ch, 1);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
return ch;
}
#endif
主函数里void hal_entry (void)添加

void hal_entry (void)
{
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
UART0_Init();
const bsp_delay_units_t bsp_delay_units = BSP_DELAY_UNITS_MILLISECONDS;
const uint32_t freq_in_hz = 2;
const uint32_t delay = bsp_delay_units / freq_in_hz;
bsp_leds_t leds = g_bsp_leds;
if (0 == leds.led_count)
{
while (1)
{
;
}
}
bsp_io_level_t pin_level = BSP_IO_LEVEL_LOW;
printf("欢迎来到瑞萨电子RA4M2开发板\r\n");
while (1)
{
R_BSP_PinAccessEnable();
for (uint32_t i = 0; i < leds.led_count; i++)
{
uint32_t pin = leds.p_leds[i];
R_BSP_PinWrite((bsp_io_port_pin_t) pin, pin_level);
}
R_BSP_PinAccessDisable();
if (BSP_IO_LEVEL_LOW == pin_level)
{
pin_level = BSP_IO_LEVEL_HIGH;
}
else
{
pin_level = BSP_IO_LEVEL_LOW;
}
R_BSP_SoftwareDelay(delay, bsp_delay_units);
printf("流水灯实验\r\n");
}
}


我采用的Jlink

直接烧录

打开串口调试助手

打印日志符合预期,串口正常输出了
我的接线如下图

没有使用USB串口,使用的是右边排座下的P100和P101作为串口输出
详情视屏看附件!!!!