【致敬未来的攻城狮计划】— 连续打卡第二十天:RA2E1_UART —— 串口通( 二 )


串口属性设置解释:
属性
描述
Name
名字,根据读者需求设置即可 。
通道,根据SCI号设置即可,例如实验使用SCI4,则这里配置为通道4 。
Data Bits
每个字(word)的比特(bit)数,默认为8bits
校验模式,可选择“Odd”奇校验,“Even”偶校验或“None”无校验 。
Stop Bits
停止位,可选1或2bit 。
Baud Rate
波特率
Baud Rate
波特率调制,通过调整时钟周期,以减少申请波特率与实际波特率之间的误差 。
Max Error(%)
计算波特率时允许的最大百分比误差 。
回调函数的名字,根据读者需求设置即可 。
接收中断优先级
Data Empty
发送数据空中断优先级
End
发送完成中断优先级
Error
错误中断优先级
由于要使用 函数:
使用函数时,需要使用到堆,默认情况下堆的大小为0,因此我们需要修改堆的大小 。可以在 FSP 配置界面中的“BSP”属性栏的“RA ”中通过修改“Heap size”来设置堆区大小 。这里需要设置为 8 的整数倍,推荐至少为4K()
点击“”按钮,让软件自动生成配置代码 。
4.keil代码编写
#include "hal_data.h"FSP_CPP_HEADERvoid R_BSP_WarmStart(bsp_warm_start_event_t event);FSP_CPP_FOOTER/* 调试串口 UART0 初始化 */void UART0_Init(void){fsp_err_t err = FSP_SUCCESS;err = R_SCI_UART_Open (&g_uart0_ctrl, &g_uart0_cfg);assert(FSP_SUCCESS == err);}/* 发送完成标志 */volatile bool uart_send_complete_flag = false;/* 串口中断回调 */void uart0_callback (uart_callback_args_t * p_args){switch (p_args->event){case UART_EVENT_RX_CHAR:{/* 把串口接收到的数据发送回去 */R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&(p_args->data), 1);break;}case UART_EVENT_TX_COMPLETE:{uart_send_complete_flag = true;break;}default:break;}}/*******************************************************************************************************************//*** main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.This function* is called by main() when no RTOS is used.**********************************************************************************************************************/void hal_entry(void)//相当于主函数函数最终执行的地方{UART0_Init();while(1){R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW); //LED1亮R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW); //LED2亮R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH); //LED1亮R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH); //LED2亮R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒R_SCI_UART_Write(&g_uart0_ctrl,"aaa",3);}/* TODO: add your own code here */#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();#endif}
烧写代码效果图:
由于习惯,我们更喜欢使用函数,所以我需要重定向:
#include "hal_data.h"#include "stdio.h""FSP_CPP_HEADERvoid R_BSP_WarmStart(bsp_warm_start_event_t event);FSP_CPP_FOOTER/* 调试串口 UART0 初始化 */void UART0_Init(void){fsp_err_t err = FSP_SUCCESS;err = R_SCI_UART_Open (&g_uart0_ctrl, &g_uart0_cfg);assert(FSP_SUCCESS == err);}/* 发送完成标志 */volatile bool uart_send_complete_flag = false;/* 串口中断回调 */void uart0_callback (uart_callback_args_t * p_args){switch (p_args->event){case UART_EVENT_RX_CHAR:{/* 把串口接收到的数据发送回去 */R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&(p_args->data), 1);break;}case UART_EVENT_TX_COMPLETE:{uart_send_complete_flag = true;break;}default:break;}}/* 重定向 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_uart4_ctrl, (uint8_t *)pBuffer, (uint32_t)size);while(uart_send_complete_flag == false);uart_send_complete_flag = false;return size;}#elseint fputc(int ch, FILE *f){(void)f;R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);while(uart_send_complete_flag == false);uart_send_complete_flag = false;return ch;}#endif/*******************************************************************************************************************//*** main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.This function* is called by main() when no RTOS is used.**********************************************************************************************************************/void hal_entry(void)//相当于主函数函数最终执行的地方{UART0_Init();while(1){R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW); //LED1亮R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW); //LED2亮R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH); //LED1亮R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH); //LED2亮R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒printf("你好,程序员!\n");}/* TODO: add your own code here */#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();#endif}