在上一个帖子中,对RA4M2型单片机在Keil下的编程进行了说明,这个帖子主要介绍在Keil下的串口编程,包括项目的建立、串口的设置、串口的编程这三部分内容。
一、项目的建立
首先打开RASC软件,建立新的项目,需要填写项目的名称和存放地址,如下图所示。
点击“NEXT”,选择所使用的开发板、单片机型号、IDE,如下图所示。
由于所测评的板子在Board列表中没有,故选择“Custom User Board”,即用户自行设计的威廉希尔官方网站
板,如果以后自己绘制板子的话,也需要选择该项。单片机的型号选择“R7FA4M2AD3CFP”,IDE选择呢“Keil MDK Version 5”。然后再点击“NEXT”。
选择不使用RTOS后,再点击“NEXT”,当显示如下界面时,说明项目已经建立完成。
二、串口的配置
在上一步完成项目建立后,打开设置的项目存放地址,双机Keil图表,打开所建立的项目,打开界面如下图所示。
在对串口进行设置时,点击Keil软件的“Tools”中的“RA Smart Configurator”,如下所示。
此时弹出配置界面。在该界面中,首先对串口的引脚进行设置。本测试,使用的是串口0,其中TXD引脚为P411,RXD引脚为P410,点击步骤如下:
Pins→Peripherals→Connectivity:SCI→SCI0→Input/Output,选择需要设置的引脚编号。操作界面如下:
引脚设置完成后,在配置串口参数,再将串口加入项目,操作顺序为:New Stack→Connectivity→UART,该操作如下图所示:
将串口加入项目后,再设置串口的参数,参数设置界面如下所示。
1、Name:该串口的名称设置为g_uart0
2、Channel:设置通道,因为选择了串口0 ,因此该处设置为0
3、Baud Rate:波特率,设置为115200
4、Callback:该处要设置中断回调函数。即单片机出现中断时,所要调动的函数名称。该处设置为Uart0_Callback。该处的名称,可以自己设置。
上述设置完成后,即可点击“Generate Project Content”,用来生成代码。
三、串口编程
通过上述操作,已经将串口的设置放于代码中,但是还需要打开串口,编写串口的回调函数。
1、打开串口
在hal_entry.c文件中加入串口初始化函数,该函数用来打开串口。
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);
}
2、串口数据发送函数
R_SCI_UART_Write(&g_uart0_ctrl, test, 5);
在主循环中,编写了上述语句,表示使用串口0发送test数组的5个字节,如需发送其余内容和数量,可自行修改。
3、编写回调函数
由于在串口设置中填写了串口回调函数,因此需要编写串口回调函数。该函数的编写与普通的串口中断相同,也是根据不同的中断类型填写不同的操作。代码如下:
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_DATA_EMPTY:
{
uart_send_complete_flag = true;
break;
}
default:
break;
}
}
4、完整代码
最终hal_entry文件中的代码如下:
#include "hal_data.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
volatile bool uart_send_complete_flag = false;
uint8_t test[]="Renesas MCU TEST!";
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);
}
/*******************************************************************************************************************//**
* 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)
{
/* TODO: add your own code here */
UART0_Init();
while(1)
{
R_SCI_UART_Write(&g_uart0_ctrl, test, 17);
R_BSP_SoftwareDelay(2, BSP_DELAY_UNITS_SECONDS);
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
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_DATA_EMPTY:
{
uart_send_complete_flag = true;
break;
}
default:
break;
}
}
四、执行效果
程序在执行时,每2秒发送一次字符串"Renesas MCU TEST!",并将串口输入的数据再自动转发。效果如下列视频所示。
更多回帖