打开串口:
fsp_err_t uart_initialize(void)
{
fsp_err_t err = FSP_SUCCESS;
/* Initialize UART channel with baud rate 115200 */
err = R_SCI_UART_Open (&g_uart_debug_ctrl, &g_uart_debug_cfg);
if (FSP_SUCCESS != err)
{
printf("\r\n** R_SCI_UART_Open API failed **\r\n");
}
return err;
}
使用串口回调函数:
void ptxDBGPORT_Callback(uart_callback_args_t *p_args)
{
/* 串口中断回调 */
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
{
/* 把串口接收到的数据发送回去 */
R_SCI_UART_Write(&g_uart_debug_ctrl, (uint8_t *)&(p_args->data), 1);
break;
}
case UART_EVENT_TX_COMPLETE:
{
uart_send_complete_flag = true;
break;
}
default:
break;
}
}
重定向:
#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_uart_debug_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_uart4_ctrl, (uint8_t *)&ch, 1);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
return ch;
}
#endif
因为使用的是FSP5.1,所以不需要删除--specs=rdimon.specs,但是需要屏蔽重定向中_write函数中的while循环
如果不屏蔽重定向_write函数中的while循环,会卡在while循环中,其他代码就没办法运行了;
当停止运行之后,会发现程序停在了,重定向中的循环中: