18.5.2
軟件設計
18.5.2.1
新建工程
因為本章節(jié)的UART相關實驗例程需要用到板子上的LED功能,因此我們可以直接以前面的“11_GPIO_LED”工程為基礎進行修改。
對于e2studio開發(fā)環(huán)境:拷貝一份我們之前的e2s工程模板“11_GPIO_LED”,然后將工程文件夾重命名為“19_UART_Receive_Send”,最后再將它導入到我們的e2studio工作空間中。
對于Keil開發(fā)環(huán)境:拷貝一份我們之前的Keil工程模板“11_GPIO_LED”,然后將工程文件夾重命名為“19_UART_Receive_Send”,并進入該文件夾里面雙擊Keil工程文件,打開該工程。
工程新建好之后,在工程根目錄的“src”文件夾下面新建“debug_uart”文件夾,再進入“debug_uart”文件夾里面新建源文件和頭文件:“bsp_debug_uart.c”和“bsp_debug_uart.h”。工程文件結構如下。
列表1:文件結構
左右滑動查看完整內容
19_UART_Receive_Send ├─ ...... └─src ├─ led │ ├─ bsp_led.c │ └─ bsp_led.h ├─ debug_uart │ ├─ bsp_debug_uart.c │ └─ bsp_debug_uart.h └─ hal_entry.c
18.5.2.2
FSP配置
下面以啟明6M5開發(fā)板為例,進行FSP配置,另外兩塊開發(fā)板的FSP配置過程與啟明6M5開發(fā)板的配置過程基本上是一樣的。
首先打開“19_UART_Receive_Send”項目的FSP 配置界面進行配置。
在FSP配置界面里面點開“Pins”->“Peripherals”->“Connectivity:SCI”->“SCI4”來配置SCI模塊,配置為“Asynchronous UART”模式,并選擇開發(fā)板所使用的串口引腳,如圖19_11。

圖19-11 配置引腳
在配置界面底部點擊“Stack”,如圖19_12步驟加入串口UART:

圖19-12 加入串口
如圖19_13點擊剛剛加入的窗口,在左下角的“屬性”窗口中配置名字(name)、通道(Channel)、回調函數(shù)(Callback)名字即可,引腳(Pins)、波特率(Baud Rate)等其他的屬性按照默認的配置即可。

圖19-13 配置串口屬性
表3:實驗所使用的UART屬性描述

使用printf函數(shù)時,需要使用到堆,默認情況下堆的大小為0,因此我們需要修改堆的大小??梢栽贔SP配置界面中的“BSP”屬性欄的“RA Common”中通過修改“Heap size”來設置堆區(qū)大小。這里需要設置為8的整數(shù)倍,對于RA6M5推薦至少為4K(0x1000),如圖19_14。

圖19-14 修改堆的大小
最后點右上角的“Generate Project Content”按鈕,讓軟件自動生成配置代碼。
18.5.2.3
串口初始化函數(shù)
FSP配置并生成代碼之后,首先需要使用R_SCI_UART_Open函數(shù)打開SCI4 UART模塊,我們把這層調用封裝為一個Debug_UART4_Init函數(shù),如下所示。
列表2:代碼清單19-1:文件bsp_debug_uart.c串口初始化
左右滑動查看完整內容
/* 調試串口 UART4 初始化 */
voidDebug_UART4_Init(void)
{
fsp_err_t err =FSP_SUCCESS;
err = R_SCI_UART_Open (&g_uart4_ctrl, &g_uart4_cfg);
assert(FSP_SUCCESS== err);
}
18.5.2.4
R_SCI_UART_Write函數(shù)
串口初始化完成之后,我們可以直接使用R_SCI_UART_Write函數(shù)來將字符串寫入到串口輸出,該函數(shù)的原型如下。
左右滑動查看完整內容
fsp_err_tR_SCI_UART_Write(uart_ctrl_t*constp_api_ctrl, uint8_tconst *? →constp_src, uint32_tconst bytes)
參數(shù)p_src指向要寫入的字符串首地址
參數(shù)bytes為傳入的要寫入的字符的數(shù)目
我們在使用R_SCI_UART_Write函數(shù)需要注意的一些事項:若使用了R_SCI_UART_Write()來發(fā)送數(shù)據,在數(shù)據發(fā)送完成之后會導致uart_send_complete_flag這個標志位被置位,因此程序在調用R_SCI_UART_Write函數(shù)之后需要等待uart_send_complete_flag標志位被置位,然后將該標志位清零。否則當連續(xù)調用R_SCI_UART_Write函數(shù)時可能導致發(fā)送數(shù)據丟失。建議使用后文所述的printf函數(shù)將數(shù)據發(fā)送到串口。
18.5.2.5
串口中斷回調函數(shù)
在前面的FSP配置步驟的時候,我們設置了串口中斷回調函數(shù)的名字為:debug_uart4_callback。設置這么一個函數(shù)的原因是:每當串口發(fā)送或者接收完成一個字符時,都會默認觸發(fā)串口的中斷,而在串口中斷中會調用函數(shù) debug_uart4_callback,在函數(shù)里我們需要根據不同的中斷情況進行相應的處理。
因此,我們也需要同時在我們的代碼里面定義并實現(xiàn)這么函數(shù)debug_uart4_callback。我們把這個函數(shù)放到文件“bsp_debug_uart.c”中,該函數(shù)代碼如下所示。
其中,需要定義一個額外的標志變量 uart_send_complete_flag來表示串口發(fā)送數(shù)據已完成。變量uart_send_complete_flag必須加上 volatile,否則可能被編譯器優(yōu)化。
列表3:代碼清單19-2:文件bsp_debug_uart.c串口中斷回調函數(shù)
左右滑動查看完整內容
/* 發(fā)送完成標志 */
volatilebool uart_send_complete_flag =false;
/* 串口中斷回調 */
voiddebug_uart4_callback(uart_callback_args_t* p_args)
{
switch(p_args->event)
{
caseUART_EVENT_RX_CHAR:
{
/* 把串口接收到的數(shù)據發(fā)送回去 */
R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t*)&(p_args->data),1);
break;
}
caseUART_EVENT_TX_COMPLETE:
{
uart_send_complete_flag =true;
break;
}
default:
break;
}
}
18.5.2.6
重定向printf輸出到串口
雖然我們可以直接使用R_SCI_UART_Write函數(shù)來將字符串輸出到串口,但是這個函數(shù)在很多情況下沒有printf函數(shù)那樣方便。所以我們需要添加一段代碼來將printf輸出重定向到串口(UART4)。
我們將以下的代碼添加到源文件“bsp_debug_uart.c”里面。由于不同C庫的printf 函數(shù)的底層實現(xiàn)不同,這里使用條件編譯選擇我們需要重寫的函數(shù)。
列表4:代碼清單19-3:重定向printf輸出到串口
左右滑動查看完整內容
/* 重定向 printf 輸出 */
#ifdefined __GNUC__ && !defined __clang__
int_write(intfd,char*pBuffer,intsize);//防止編譯警告
int_write(intfd,char*pBuffer,intsize)
{
(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;
returnsize;
}
#else
intfputc(intch, FILE *f)
{
(void)f;
R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t*)&ch,1);
while(uart_send_complete_flag ==false);
uart_send_complete_flag =false;
returnch;
}
#endif
在使用e2stdio的時候,需要修改C語言項目設置,按下圖步驟修改即可。

圖19-15 打開C/C++項目設置串口

圖19-16 修改項目工具設置
18.5.2.7
hal_entry入口函數(shù)
C語言程序的入口函數(shù)main函數(shù)調用了hal_entry函數(shù)。我們在hal_entry函數(shù)里面編寫我們的應用代碼。
列表5:代碼清單19-4:main函數(shù)調用的hal_entry函數(shù)
左右滑動查看完整內容
voidhal_entry(void)
{
/*TODO:add your own code here */
LED_Init();// LED 初始化
Debug_UART4_Init();// SCI4 UART 調試串口初始化
printf("這是一個串口收發(fā)回顯例程
");
printf("打開串口助手發(fā)送數(shù)據,接收窗口會回顯所發(fā)送的數(shù)據
");
while(1)
{
LED1_ON;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
LED1_OFF;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
首先我們調用LED_Init函數(shù)初始化板子上的LED 燈,然后調用Debug_UART4_Init函數(shù)初始化SCI4 UART作為調試串口來使用。之后就可以使用printf 函數(shù)了,我們調用printf輸出提示信息到串口。接著在while循環(huán)里是一段讓LED1每隔一秒鐘閃爍的程序。
-
led
+關注
關注
243文章
24449瀏覽量
687654 -
串口
+關注
關注
15文章
1607瀏覽量
81968 -
uart
+關注
關注
22文章
1304瀏覽量
106133 -
函數(shù)
+關注
關注
3文章
4406瀏覽量
66865 -
開發(fā)環(huán)境
+關注
關注
1文章
253瀏覽量
17545
原文標題:軟件設計及串口相關函數(shù)介紹——瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南(47)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
8051單片機C語言軟件設計的藝術
基于Windows服務的網口與串口通信軟件設計
微波自動測量系統(tǒng)軟件設計
基于UML對象建模的財務軟件設計研究
ADS軟件設計VCO的方法介紹
CapTIvateTM軟件設計平臺的應用介紹(2)
CapTIvateTM軟件設計平臺的應用介紹(3)
STM32學習筆記--串口實驗

軟件設計及串口相關函數(shù)介紹
評論