本篇来实现串口的收发测试,后面再基于此基于FIFO的串口接口,然后实现shell等,为后面的开发调试准备环境。
板上使用P408和P409接到板载Jlink的DBG_TXD和DBG_RXD, 可以使用板载Jlink的虚拟串口进行通讯。
配置P408和P409对应SCI3
添加串口驱动
设置实例位SCI3以及波特率等参数
设置中断回调函数,用户实现user_uart3_callback
更新
添加uart.h/uart.c实现如下
Uart.h
#ifndef UART_H
#define UART_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
int uart_init(void);
uint32_t uart_send(uint8_t* buffer, uint32_t len);
#ifdef __cplusplus
}
#endif
#endif
Uart.c
#include "hal_data.h"
#include <stdio.h>
#include <stdbool.h>
#include "r_uart_api.h"
#include "r_sci_b_uart.h"
#include "uart.h"
#include "blinky_thread.h"
volatile bool g_data_transmit_flag = false;
uint8_t rx_buffer[1];
void user_uart3_callback(uart_callback_args_t *p_args);
void user_uart3_callback(uart_callback_args_t *p_args)
{
uint8_t tmp;
switch (p_args->event)
{
case UART_EVENT_TX_COMPLETE:
g_data_transmit_flag = true;
break;
case UART_EVENT_TX_DATA_EMPTY:
g_data_transmit_flag = true;
break;
case UART_EVENT_RX_COMPLETE:
// Start Transmission
R_SCI_B_UART_Read(&g_uart3_ctrl, (uint8_t * const)(rx_buffer), 1U);
uart_send(rx_buffer,1);
break;
case UART_EVENT_RX_CHAR:
tmp = g_uart3_ctrl.p_reg->RDR_BY;
uart_send(&tmp,1);
break;
default:
break;
}
}
int uart_init(void)
{
fsp_err_t err;
err = R_SCI_B_UART_Open(&g_uart3_ctrl, &g_uart3_cfg);
if (FSP_SUCCESS != err)
{
return -1;
}
else
{
// Start Transmission
err = R_SCI_B_UART_Read(&g_uart3_ctrl, (uint8_t * const)(rx_buffer), 1U);
if (FSP_SUCCESS != err)
{
return -1;
}
return 0;
}
}
uint32_t uart_send(uint8_t* buffer, uint32_t len)
{
g_data_transmit_flag = false;
for(uint32_t i=0;i<len;i++)
{
g_uart3_ctrl.p_reg->TDR_BY = buffer[i];
while((g_uart3_ctrl.p_reg->CSR_b.TEND == 0) || (g_uart3_ctrl.p_reg->CSR_b.TDRE == 0));
}
//fsp_err_t err = R_SCI_B_UART_Write(&g_uart3_ctrl, (uint8_t * const)(buffer), len);
//if (FSP_SUCCESS != err)
//{
// return 0;
//}
// Wait for event receive complete
//while (!g_data_transmit_flag)
//{
//}
return len;
}
实现收到数据原样返回
blinky_thread_entry.c中
#include "uart.h"
void blinky_thread_entry (void * pvParameters)
{
uart_init();
while(1);
测试如下,收到后原样返回。
注:发送进不了中断,接收可以,所以暂时发送改为查询方式,后面再查找原因。
本帖最后由 qinyunti 于 2024-7-24 23:48 编辑
发送进不了中断,是否进了调试,有没有进中断,如果能进中断,查一下寄存器,看中断置位了哪些,是否进行清除。