3.1 原理圖分析
查看EK-RA6M4的原理圖,如下圖所示,串口 UART0 掛在了Pmod2接口的 P411,P410 這兩個(gè)引腳上,而這兩個(gè)引腳又可以復(fù)用為 SPI1 功能的兩個(gè)引腳。此時(shí),我們將希望修改FSP配置,讓這兩個(gè)引腳作為程序的 printf() 標(biāo)準(zhǔn)輸出調(diào)試打印。
3.2 Pins引腳配置
接下來我們打開項(xiàng)目中的FSP配置文件,配置使能相應(yīng)串口的Pin功能,并重新生成代碼。
3.3 Stack配置
接下來我們選擇 Stacks , 點(diǎn)擊 "New Stack" -> "Connectivity" -> "UART(r_sci_uart)" 添加串口通信功能協(xié)議棧。
如下圖所示,我們可以配置串口的相應(yīng)屬性,如波特率等。配置好之后,點(diǎn)擊 “Generate Project Content” 按鈕,將會(huì)自動(dòng)生成串口的相關(guān)代碼。
- 通過 Name 字段可以修改串口的設(shè)備名為 g_uart0,它將在IDE自動(dòng)生成的文件 ra_gen/hal_data.c/h 中定義串口操作相關(guān)的變量;
- 通過 Channel 字段可以修改串口通道,這里設(shè)置為0,下面的 Pins 將自動(dòng)選擇 TXD0、RXD0 的相關(guān)引腳;
- 串口的波特率、奇偶校驗(yàn)位、數(shù)據(jù)位、停止位、誤碼率等都在這里設(shè)置,具體將定義在 ra_gen/hal_data.c 文件里的 g_uart0_cfg 變量中;
3.4 測(cè)試串口通信
接下來,我們可以修改 src/hal_entry.c 源文件,在里面添加串口的初始化 和 發(fā)送測(cè)試函數(shù)如下:
void hal_entry (void)
{
... ...
#define HELLO_MSG "Hello EK-RA6M4 Board
"
R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);
R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)HELLO_MSG, strlen(HELLO_MSG));
while (1)
{
... ...
}
其中:
- 串口的操作函數(shù) R_SCI_UART_Open() 和 R_SCI_UART_Write() 定義在 ra/fsp/src/r_sci_uart/r_sci_uart.c 源文件中,它由e2studio動(dòng)態(tài)生成;
- 打開串口函數(shù)里的兩個(gè)參數(shù) g_uart0_ctrl 和 g_uart0_cfg ,定義在 ra_gen/hal_data.c/h 文件中,該C文件由上一步配置并動(dòng)態(tài)生成;
使用 USB轉(zhuǎn)串口連接 UART0的相應(yīng)引腳( TxD0:P411, RxD0:P410 ),重新編譯運(yùn)行程序,串口上將會(huì)打印相應(yīng)的字符串。
3.5 printf函數(shù)實(shí)現(xiàn)
首先,我們?cè)陧?xiàng)目中創(chuàng)建 src/console.h 頭文件如下。
#ifndef CONSOLE_H_
#define CONSOLE_H_
#include
#include "r_sci_uart.h"
#include "hal_data.h"
#define g_console(x) &g_uart0_##x
#define g_console_ctrl g_console(ctrl)
#define g_console_cfg g_console(cfg)
extern volatile bool g_console_txComplete;
/* Function declaration */
extern fsp_err_t console_initialize(void);
extern fsp_err_t deinit_console(void);
extern void console_callback(uart_callback_args_t *p_args);
extern int _write(int fd,char *pBuffer,int size);
#endif /* CONSOLE_H_ */
接下來創(chuàng)建 src/console.c 源文件如下:
#include "console.h"
/* Tx complete flags */
volatile bool g_console_txComplete = false;
int _write(int fd,char *pBuffer,int size)
{
fsp_err_t err = FSP_SUCCESS;
(void)fd;
g_console_txComplete = false;
err = R_SCI_UART_Write(g_console_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
if(FSP_SUCCESS != err)
__BKPT();
while(g_console_txComplete == false)
{
}
return size;
}
fsp_err_t console_initialize(void)
{
fsp_err_t err = FSP_SUCCESS;
/* Initialize console UART */
err = R_SCI_UART_Open (g_console_ctrl, g_console_cfg);
FSP_ERROR_RETURN(FSP_SUCCESS == err, err);
return FSP_SUCCESS;
}
fsp_err_t deinit_console(void)
{
fsp_err_t err = FSP_SUCCESS;
/* Close module */
err = R_SCI_UART_Close (g_console_ctrl);
FSP_ERROR_RETURN(FSP_SUCCESS == err, err);
return FSP_SUCCESS;
}
void console_callback(uart_callback_args_t *p_args)
{
switch (p_args->event)
{
case UART_EVENT_TX_COMPLETE:
g_console_txComplete = true;
break;
default:
break;
}
}
- Renesas MCU的printf()重定向函數(shù)為 _write(),在該函數(shù)中我們將通過調(diào)用串口發(fā)送函數(shù)將相關(guān)字符串發(fā)送出去;
- 在使用串口發(fā)送函數(shù)時(shí),我們應(yīng)該要等待串口發(fā)送完成。所以在_write()函數(shù)里我們將等待 g_console_txComplete 標(biāo)志完成;
- 該標(biāo)志將會(huì)在 console_callback() 函數(shù)里更新,這個(gè)是串口中斷發(fā)送的回調(diào)函數(shù)。接下來我們需要在 FSP 配置中設(shè)置它。
- 在該文件中,我們還添加 了 console 的初始化相關(guān)函數(shù);
在添加上面的源文件后,我們需要把自己定義的 console 串口回調(diào)函數(shù),加入到串口中斷回調(diào)函數(shù)中去,這時(shí)需要修改 FSP 的相關(guān)配置。具體方式如下圖所示:
- 這里通過Callback字段設(shè)置串口收發(fā)的中斷回調(diào)函數(shù) console_callback(),它將配置在 g_uart0_cfg 變量中,該函數(shù)需要我們自己實(shí)現(xiàn);
- 另外,我們也可以在這里修改串口中斷的優(yōu)先級(jí);
另外,printf() 函數(shù)工作還需要修改堆棧大小,這里我們調(diào)整 Heap 的大小為 1024,然后重新生成代碼即可。
- 如果使能了printf()函數(shù),不用J-link調(diào)試的話,開發(fā)板上電重啟后不能正常啟動(dòng)運(yùn)行。這是因?yàn)閜rintf將會(huì)阻塞在 J-link的semihosting輸出 ,這時(shí)我們?cè)诰幾g時(shí)要取消semihosting的支持。這時(shí)只需要在下面的項(xiàng)目配置中,刪除 --specs=rdimon.specs 鏈接選項(xiàng)即可。
- 一般單片機(jī)的printf()函數(shù)默認(rèn)并不支持浮點(diǎn)運(yùn)行和浮點(diǎn)打印,因?yàn)樗鼈儽容^占空間。如果想使能printf()打印浮點(diǎn)類型數(shù)的話,可以在項(xiàng)目配置中做如下設(shè)置。
接下來再修改 src/hal_entry.c 源文件如下,此時(shí) printf函數(shù)就能夠正常工作了。
... ...
#include "console.h"
... ...
void hal_entry (void)
{
... ...
console_initialize();
printf("Hello EK-RA6M4 Board
");
while (1)
{
... ...
}
編譯重新運(yùn)行后,串口上能夠正常打印相應(yīng)字符串。
-
單片機(jī)
+關(guān)注
關(guān)注
6061文章
44900瀏覽量
646383 -
串口
+關(guān)注
關(guān)注
14文章
1581瀏覽量
78552 -
串口通信
+關(guān)注
關(guān)注
34文章
1635瀏覽量
56513 -
UART0
+關(guān)注
關(guān)注
0文章
5瀏覽量
1769
發(fā)布評(píng)論請(qǐng)先 登錄
單片機(jī)串口模塊調(diào)試方法

怎樣通過串口打印變量的值來調(diào)試單片機(jī)的代碼呢
如何進(jìn)行單片機(jī)的串口調(diào)試詳細(xì)實(shí)例說明

單片機(jī)的串口實(shí)驗(yàn) 串口介紹 串口原理

51單片機(jī)串口通訊詳解

MSP430 F5529 單片機(jī) 串口 測(cè)試 調(diào)試

51單片機(jī)串口通信調(diào)試printf函數(shù)重定向輸出打印

【轉(zhuǎn)】STC89C52RC單片機(jī)實(shí)現(xiàn)串口打印功能

單片機(jī)自定義串口打印程序

《電子DIY》之藍(lán)牙的使用,Proteus仿真單片機(jī)串口的注意事項(xiàng)和實(shí)物調(diào)試注意事項(xiàng)。玩轉(zhuǎn)單片機(jī)串口詳細(xì)零基礎(chǔ)版

單片機(jī)常用的調(diào)試方法
51單片機(jī)串口配置方法

評(píng)論