2025-06-12 15-18-21
开发板上有一颗USB转串口芯片,无需在接USB转串口模块,仅需要一条数据线就能直接与PC进行通信

这里连接的是UART9,所以配置UART是要选择UART9


这里要选择UART9,8位数据为,无校验位,1位停止位,波特率115200,同时开启中断(因为我实在没找到获取状态标志位的库函数,所以只能开中断了,中断名字可以自己自定义),引脚要选对
串口中断,产生发送完成中断,会将相关标志位值1
volatile bool TBE = false;
void g_uart9_callback(uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
TBE = true;
}
}
printf重定向,其中用到了在中断中设置的标志位
int fputc(int ch, FILE *f)
{
(void)f;
R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
while(TBE == false);
TBE = false;
return ch;
}
别忘记勾选使用微库哦

上板验证
void hal_entry(void)
{
fsp_err_t err;
err = SysTick_Init();
assert(FSP_SUCCESS == err);
err = g_uart9.p_api->open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
while(1)
{
printf("RA E2STUDIO");
SysTick_Delay_ms(100);
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}

环形缓冲区代码
#define MAX_BUFFER_LEN 100
typedef enum
{
QUEUE_ERR,
QUEUE_SUCCESS
}QUEUE;
typedef struct
{
uint16_t head;
uint16_t tail;
uint16_t len;
uint8_t buffer[MAX_BUFFER_LEN];
QUEUE (*write)(uint8_t data);
QUEUE (*read)(uint8_t *data);
}uart_circle_queue_t;
extern uart_circle_queue_t uart_queue;
void uart_queue_init(void);
volatile bool TBE = false;
uint8_t receive;
int fputc(int ch, FILE *f)
{
(void)f;
R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
while(TBE == false);
TBE = false;
return ch;
}
uart_circle_queue_t uart_queue;
static QUEUE queue_write(uint8_t data)
{
if(uart_queue.len >= MAX_BUFFER_LEN)
{
return QUEUE_ERR;
}
uart_queue.buffer[uart_queue.tail]=data;
uart_queue.tail = (uart_queue.tail+1)%MAX_BUFFER_LEN;
uart_queue.len++;
return QUEUE_SUCCESS;
}
static QUEUE queue_read(uint8_t *data)
{
if(uart_queue.len == 0)
{
return QUEUE_ERR;
}
*data = uart_queue.buffer[uart_queue.head];
uart_queue.head = (uart_queue.head+1)%MAX_BUFFER_LEN;
uart_queue.len--;
return QUEUE_SUCCESS;
}
void uart_queue_init(void)
{
uart_queue.head = 0;
uart_queue.tail = 0;
uart_queue.len = 0;
uart_queue.write = queue_write;
uart_queue.read = queue_read;
}
void g_uart9_callback(uart_callback_args_t * p_args)
{
switch(p_args->event)
{
case UART_EVENT_TX_COMPLETE:
{
TBE = true;
break;
}
case UART_EVENT_RX_CHAR:
{
uart_queue.write(p_args->data);
break;
}
}
}
实验验证下,这里我设置每接收5个字符,就发送出去,在这个过程中可以使用debug实时查看缓冲区的内容
uint8_t temp;
void hal_entry(void)
{
fsp_err_t err;
err = SysTick_Init();
assert(FSP_SUCCESS == err);
err = g_uart9.p_api->open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
uart_queue_init();
while(1)
{
if(uart_queue.len > 4)
{
for(uint8_t i = 0;i < 5;i++)
{
uart_queue.read(&temp);
printf("第%d个数据:%d\n\r",i,temp);
}
}
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
2025-06-12 15-18-21
|