19.8
實(shí)驗(yàn)2:DMAC+UART串口收發(fā)
19.8.1
軟件設(shè)計(jì)
19.8.1.1
新建工程
本實(shí)驗(yàn)新建工程的步驟與上面的實(shí)驗(yàn)1基本一致。
對于e2studio開發(fā)環(huán)境:
拷貝一份我們之前的e2s工程“19_UART_Receive_Send”,然后將工程文件夾重命名為“20_DMAC_Using_UART”,最后再將它導(dǎo)入到我們的e2studio工作空間中。
對于Keil開發(fā)環(huán)境:
拷貝一份我們之前的Keil工程“19_UART_Receive_Send”,然后將工程文件夾重命名為“20_DMAC_Using_UART”,并進(jìn)入該文件夾里面雙擊Keil工程文件,打開該工程。
工程新建好之后,在工程根目錄的“src”文件夾下面新建“dmac”文件夾,再進(jìn)入“dmac”文件夾里面新建源文件和頭文件:“bsp_dmac.c”和“bsp_dmac.h”。工程文件結(jié)構(gòu)如下。
列表14:文件結(jié)構(gòu)
左右滑動(dòng)查看完整內(nèi)容
20_DMAC_Using_UART ├─ ...... └─src ├─ led │ ├─ bsp_led.c │ └─ bsp_led.h ├─ debug_uart │ ├─ bsp_debug_uart.c │ └─ bsp_debug_uart.h ├─ dmac │ ├─ bsp_dmac.c │ └─ bsp_dmac.h └─ hal_entry.c
19.8.1.2
FSP配置
按照與實(shí)驗(yàn)1相同的步驟加入兩個(gè)r_dmac的Stack,如下圖所示。

添加后,配置這兩個(gè)DMAC模塊,一個(gè)配置為用于UART發(fā)送,一個(gè)配置為用于UART接收。
UART4發(fā)送的DMAC配置如下:

UART4接收的DMAC配置如下:

19.8.1.3
編寫代碼
hal_entry入口函數(shù)的代碼如下。
列表15:代碼清單20?13測試dmac串口
左右滑動(dòng)查看完整內(nèi)容
/* 用戶頭文件包含 */
#include"led/bsp_led.h"
#include"debug_uart/bsp_debug_uart.h"
#include"dmac/bsp_dmac.h"
#defineBUFFER_SIZE (37)
uint8_tsci_tx_data[BUFFER_SIZE] = {"embedfire-野火 www.embedfire.com
"}
→;
uint8_tsci_rx_data[BUFFER_SIZE];
voidhal_entry(void)
{
/*TODO:add your own code here */
LED_Init();// LED 初始化
Debug_UART4_Init();// SCI4 UART 調(diào)試串口初始化
printf("
實(shí)驗(yàn) 2:DMAC+UART 串口收發(fā)
");
printf("- 藍(lán)、綠燈亮 - 接收成功、發(fā)送成功
");
printf("- 藍(lán)色燈亮 - 接收失敗、發(fā)送成功
");
printf("- 綠色燈亮 - 接收成功、發(fā)送失敗
");
printf("- 紅色燈亮 - 接收失敗、發(fā)送失敗
");
printf("
發(fā)送內(nèi)容如下:
");
/* 通過 CPU 和中斷處理程序發(fā)送數(shù)據(jù) */
R_SCI_UART_Write(&g_uart4_ctrl, &sci_tx_data[0], BUFFER_SIZE);
/* 等待傳輸完成中斷 - 標(biāo)志位在 UART 的回調(diào)函數(shù)中 debug_uart4_callback() */
while(false== uart_send_complete_flag );
uart_send_complete_flag =false;
/* 通過 DMAC 和中斷處理程序發(fā)送數(shù)據(jù) */
/* 清零 ICU IELSR 寄存器 */
R_ICU->IELSR[SCI4_RXI_IRQn] =0U;
R_ICU->IELSR[SCI4_TXI_IRQn] =0U;
/* 配置串口接收 DMA 源地址、目標(biāo)地址、長度 */
set_transfer_dst_src_address(g_transfer_dmac_sci4_rx.p_cfg,
&R_SCI4->RDR,
&sci_rx_data[0]);
set_transfer_length(g_transfer_dmac_sci4_rx.p_cfg, BUFFER_SIZE);
/* 配置串口發(fā)送 DMA 源地址、目標(biāo)地址、長度 */
set_transfer_dst_src_address(g_transfer_dmac_sci4_tx.p_cfg,
&sci_tx_data[0],
(void*)&R_SCI4->TDR);
set_transfer_length(g_transfer_dmac_sci4_tx.p_cfg, BUFFER_SIZE);
/* 開啟 DMAC */
DMAC_Init();
/* 手動(dòng)觸發(fā)傳輸數(shù)據(jù)寄存器空中斷 */
R_SCI4->SCR_b.TE =0;
R_SCI4->SCR_b.RE =0;
R_SCI4->SCR |= (0xF0);
// R_SCI4->SCR_b.TE = 0;
// R_SCI4->SCR_b.TIE = 0;
// uint8_t temp = (uint8_t)(R_SCI4->SCR & 0x53); //0x53 = 101 0011
// R_SCI4->SCR = (uint8_t)(0xa0 | temp); //0x0a = 1010 0000
while(1)
{
if((1== dmac_sci4_tx_flag ) && (1== dmac_sci4_rx_flag ))
{
//藍(lán)、綠燈亮 - 接收成功、發(fā)送成功
LED1_OFF;
LED2_ON;
LED3_ON;
}
elseif((1== dmac_sci4_tx_flag ) && (0== dmac_sci4_rx_flag ))
{
//藍(lán)色燈亮 - 接收失敗、發(fā)送成功
LED1_OFF;
LED2_ON;
LED3_OFF;
}
elseif((0== dmac_sci4_tx_flag ) && (1== dmac_sci4_rx_flag ))
{
//綠色燈亮 - 接收成功、發(fā)送失敗
LED1_OFF;
LED2_OFF;
LED3_ON;
}
else
{
//紅色燈亮 - 接收失敗、發(fā)送失敗
LED1_ON;
LED2_OFF;
LED3_OFF;
}
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
/**
* 判斷指定長度的兩個(gè)數(shù)據(jù)源是否完全相等,
* 如果完全相等返回 1,只要其中一對數(shù)據(jù)不相等返回 0
*/
uint8_tBuffercmp(constuint32_t* pBuffer,uint32_t* pBuffer1,uint16_t?
,
→BufferLength)
{
/* 數(shù)據(jù)長度遞減 */
while(BufferLength--)
{
/* 判斷兩個(gè)數(shù)據(jù)源是否對應(yīng)相等 */
if(*pBuffer != *pBuffer1)
{
/* 對應(yīng)數(shù)據(jù)源不相等馬上退出函數(shù),并返回 0 */
return0;
}
/* 遞增兩個(gè)數(shù)據(jù)源的地址指針 */
pBuffer++;
pBuffer1++;
}
/* 完成判斷并且對應(yīng)數(shù)據(jù)相對 */
return1;
}
在bsp_dmac.c文件中編寫DMAC初始化等函數(shù),如下所示。
列表16:代碼清單20?14DMAC初始化函數(shù)
左右滑動(dòng)查看完整內(nèi)容
/* 初始化 DMAC 模塊 */
voidDMAC_Init(void)
{
fsp_err_t err;
/* 配置發(fā)送 */
err = g_transfer_on_dmac.open(g_transfer_dmac_sci4_tx.p_ctrl, g_
→transfer_dmac_sci4_tx.p_cfg);
assert(FSP_SUCCESS== err);
err = g_transfer_on_dmac.enable(g_transfer_dmac_sci4_tx.p_ctrl);
assert(FSP_SUCCESS== err);
/* 配置接收 */
err = g_transfer_on_dmac.open(g_transfer_dmac_sci4_rx.p_ctrl, g_
→transfer_dmac_sci4_rx.p_cfg);
assert(FSP_SUCCESS== err);
err = g_transfer_on_dmac.enable(g_transfer_dmac_sci4_rx.p_ctrl);
assert(FSP_SUCCESS== err);
}
voidset_transfer_length(transfer_cfg_tconst * p_config, volatile uint16_
→t _length)
{
p_config->p_info->length = _length;
}
/* 設(shè)置傳輸?shù)脑吹刂泛湍康牡刂?*/
voidset_transfer_dst_src_address(transfer_cfg_tconst *constp_config,
constvolatileuint8_t * _p_src, constvolatileuint8_t * _p_dest)
{
p_config->p_info->p_src = (voidconst * volatile) _p_src;
p_config->p_info->p_dest = (void* volatile) _p_dest;
}
在bsp_dmac.c文件中分別編寫DMAC發(fā)送完成中斷和接收完成中斷的回調(diào)函數(shù),如下所示。
列表17:代碼清單20?15DMAC回調(diào)函數(shù)
左右滑動(dòng)查看完整內(nèi)容
// DMA 傳輸完成標(biāo)志位 volatileuint8_t dmac_sci4_tx_flag =0; volatileuint8_t dmac_sci4_rx_flag =0; /* DMAC 發(fā)送中斷回調(diào)函數(shù) */ voidtransfer_dmac_sci4_tx_callback(dmac_callback_args_t *p_args) { (void)(p_args); dmac_sci4_tx_flag =1; } /* DMAC 接收回調(diào)函數(shù) */ voidtransfer_dmac_sci4_rx_callback(dmac_callback_args_t *p_args) { (void)(p_args); dmac_sci4_rx_flag =1; }
19.8.2
實(shí)驗(yàn)現(xiàn)象
比較好的接收方式還是直接使用串口接收,使用環(huán)形隊(duì)列,來接收不定長的數(shù)據(jù)。
運(yùn)行代碼時(shí),數(shù)據(jù)字符串”embedfire-野火www.embedfire.com”將傳輸兩次。第一次是通過CPU和中斷,第二次是通過DMAC和中斷。
然后,使用串口調(diào)試助手,向開發(fā)板發(fā)送相同字符串“embedfire-野火www.embedfire.com”,帶回車換行字符。
如果只有藍(lán)色燈亮則代表接收失敗、發(fā)送成功,如果只有綠色燈亮則代表接收成功、發(fā)送失敗,如果只有紅色燈亮則代表接收失敗、發(fā)送失敗,藍(lán)燈和綠燈同時(shí)亮起則是接收和發(fā)送都成功。
觸發(fā)DMA的關(guān)鍵是禁用ICU中斷使能寄存器中的中斷。如果不這樣做,則CPU和DMA之間存在爭用情況,并且無法獲得預(yù)期的結(jié)果。
-
串口
+關(guān)注
關(guān)注
15文章
1614瀏覽量
82299 -
uart
+關(guān)注
關(guān)注
22文章
1308瀏覽量
106379 -
開發(fā)環(huán)境
+關(guān)注
關(guān)注
1文章
265瀏覽量
17584
原文標(biāo)題:實(shí)驗(yàn)2:DMAC+UART串口收發(fā)——瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南(58)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南之DTC+UART串口收發(fā)實(shí)驗(yàn)
瑞薩RA6M4系列DMAC和ADC的詳細(xì)介紹(1)
瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南之DMAC中斷回調(diào)函數(shù)等
瑞薩e2studio(1)----瑞薩芯片之搭建FSP環(huán)境
【瑞薩RA2L1入門學(xué)習(xí)】1. 點(diǎn)亮LED
【瑞薩**RA2L1入門學(xué)習(xí)】+**UART測試實(shí)驗(yàn)
【瑞薩RA4系列開發(fā)板體驗(yàn)】開發(fā)環(huán)境搭建和新手點(diǎn)燈指南
【瑞薩RA4系列開發(fā)板體驗(yàn)】CoreMark移植完全指南——UART輸出和SysTick計(jì)時(shí)的應(yīng)用
【瑞薩RA4系列開發(fā)板體驗(yàn)】10. 我的試用總結(jié)
【瑞薩RA4系列開發(fā)板體驗(yàn)】體驗(yàn)過程
【野火啟明6M5開發(fā)板體驗(yàn)】開箱+認(rèn)識開發(fā)板+資料
【有獎(jiǎng)直播預(yù)報(bào)名】瑞薩電子RA系列產(chǎn)品開發(fā)工具之FSP4.0.0新特性介紹
【視頻教程】瑞薩RA單片機(jī)FSP開發(fā)(3)FSP架構(gòu)-解釋Blinky架構(gòu)[上]
基于瑞薩RA0E1開發(fā)板的ThreadX實(shí)時(shí)操作系統(tǒng)串口回顯測試
瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南之DMAC+UART串口收發(fā)實(shí)驗(yàn)
評論