本文使用中断方式进行UART数据收发。
专栏地址:瑞萨RH850
https://blog.csdn.net/kinetis_linux/category_11600535.html
建立UART工程
-
建立工程;
-
配置时钟;
-
配置UART,这里选择UART0演示;
-
自动生成代码;
-
清除main.c中内容,与r_cg_main.c冲突;
-
删除r_cg_intvector.c,里面声明了很多中断函数,却没有定义,就算定义空的中断函数也很麻烦,直接删了,在boot.asm中引用要使用的中断函数;
-
打开USE_TABLE_REFERENCE_METHOD .set 1;
-
section "EIINTTBL"中引用r_cg_uart_user.c中自动生成的接收、发送、错误处理函数地址;
-
启动UARTT0,启用接收。
注意需要选择适当的DebugTool,并配置适当的时钟, 接着就可以在r_cg_uart_user.c中的接收、发送回调函数中写我们的应用代码了。
uint8_t rx_buf[100];
uint8_t rx_len =1;
void main(void)
{
R_MAIN_UserInit();
/* Start user code. Do not edit comment generated here */
R_UART0_Start();
R_UART0_Receive(rx_buf, rx_len);
while (1U)
{
;
}
/* End user code. Do not edit comment generated here */
}
瑞萨UART代码分析
r_cg_uart.c: 定义串口对应的操作
R_UART0_Create:配置串口参数、引脚
R_UART0_Start:使能接收、发送功能,使能接收、发送、错误中断;
R_UART0_Stop:清中断、关中断,关串口功能;
R_UART0_Send:指定发送缓冲,将第一个数据写入发送数据寄存器 RLN30.LUTDR.UINT16,地址偏移,随后进入发送成功中断继续发送,直到完成,调用回调。
R_UART0_Receive:指定接收缓冲,指定接收的数量,当数量超过指定值时调用用户回调函数。
MD_STATUS R_UART0_Receive(uint8_t * const rx_buf, uint16_t rx_num)
{
MD_STATUS status = MD_OK;
if (rx_num < 1U)
{
status = MD_ARGERROR;
}
else
{
if ((RLN30.LST & _UART_RECEPTION_OPERATED) == 0U)
{
g_uart0_rx_count = 0U;
g_uart0_rx_length = rx_num;
gp_uart0_rx_address = rx_buf;
}
}
return (status);
}
r_cg_uart_user.c:定义中断处理函数,以及用户回调函数。
void r_uart0_interrupt_receive(void)
void r_uart0_interrupt_error(void)
void r_uart0_interrupt_send(void)
static void r_uart0_callback_receiveend(void);
static void r_uart0_callback_sendend(void);
static void r_uart0_callback_error(uint8_t err_type);
工程实践
对于实际项目中使用瑞萨RH850,最好在其基础上封装一层驱动,以及定义堆中缓冲区,避免局部数组,这样发送函数退出后,避免发送缓冲不在了。以及使用DMA收发,后续研究。