在處理UART數(shù)據(jù)的時(shí)候,DMA是一種非常靈活、高效的方式。
※補(bǔ)記:USART_DR 串口數(shù)據(jù)寄存器是一個(gè)雙寄存器,包含了TDR和RDR,對(duì)它讀操作,讀取的是RDR寄存器的值,對(duì)它的寫操作,實(shí)際上是寫到TDR寄存器;當(dāng)向該寄存器寫數(shù)據(jù)的時(shí)候,串口就會(huì)自動(dòng)發(fā)送,當(dāng)收到收據(jù)的時(shí)候,也是存在該寄存器內(nèi)。
關(guān)于讀寫:
__STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx);/*
讀取接收寄存器USARTx_DR中8位數(shù)據(jù),接收即所得。返回值最大為0xFF
若使能校驗(yàn)位,接收的最高位MSB將由硬件自動(dòng)進(jìn)行校驗(yàn)。
*/
__STATIC_INLINE uint16_t LL_USART_ReceiveData9(USART_TypeDef *USARTx);/*
讀取接收寄存器USARTx_DR中9位數(shù)據(jù)(當(dāng)字節(jié)長9,接收即所得)。返回值最大為0x1FF
若使能校驗(yàn)位,接收的最高位MSB將由硬件自動(dòng)進(jìn)行校驗(yàn)。
*/
__STATIC_INLINE void LL_USART_TransmitData9(USART_TypeDef *USARTx, uint16_t Value);/*
向發(fā)送寄存器寫入9位數(shù)據(jù)。當(dāng)使能校驗(yàn)位,發(fā)送時(shí)最高位MSB自動(dòng)替換成校驗(yàn)值
*/
__STATIC_INLINE void LL_USART_TransmitData8(USART_TypeDef *USARTx, uint8_t Value)/*
向發(fā)送寄存器寫入8位數(shù)據(jù)。當(dāng)使能校驗(yàn)位,發(fā)送時(shí)最高位MSB自動(dòng)替換成校驗(yàn)值
*/
·
API:
__STATIC_INLINE void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx);/*
使能接收DMA,啟用后DR有數(shù)據(jù)時(shí)將允許發(fā)送DMA請(qǐng)求;具體見示例用法
*/
__STATIC_INLINE void LL_USART_DisableDMAReq_RX(USART_TypeDef *USARTx);/*
禁用接收DMA
*/
__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_RX(USART_TypeDef *USARTx);/*
檢測是否使能接收DMA
*/
__STATIC_INLINE void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx);/*
使能發(fā)送DMA
*/
__STATIC_INLINE void LL_USART_DisableDMAReq_TX(USART_TypeDef *USARTx);/*
禁用發(fā)送DMA
*/
__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_TX(USART_TypeDef *USARTx);/*
檢測是否使能發(fā)送DMA
*/
/**************************************************/
__STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx);/*
返回UART模塊數(shù)據(jù)寄存器DR地址;無論是否啟用DMA均可用
*/
/ 結(jié)力期末考分界線 */
配置使用DMA收發(fā):
1.在CubeMX中:
+在項(xiàng)目設(shè)置中調(diào)整為使用LL
2.生成代碼
此時(shí)在生成代碼已實(shí)現(xiàn)了串口DMA的初始化設(shè)置并生成了相應(yīng)的DMA中斷句柄。接下來通過代碼實(shí)現(xiàn)功能。示例為一個(gè)簡單的功能,將串口接收到的數(shù)據(jù)再通過串口發(fā)出。
3.配置
①在main.h中定義全局變量test_data:
uint8_t test_data;
②在usart.c中引入變量
extern uint8_t test_data;
③在usart.c中進(jìn)行設(shè)置
※通道配置為非循環(huán)模式時(shí),傳輸結(jié)束后(即傳輸計(jì)數(shù)變?yōu)?)將不再產(chǎn)生DMA操作。要開始新的DMA傳輸,需要3個(gè)步驟:在關(guān)閉DMA通道的情況下,在DMA_CNDTRx寄存器中重新寫入傳輸數(shù)目(有需要?jiǎng)t需重新配置地址),然后重新開啟DMA。
//RX DMA配置
LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_5,LL_USART_DMA_GetRegAddr(USART1));//連接外設(shè)寄存器USART1- >DR
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)&test_data);//連接數(shù)據(jù)存儲(chǔ)地址
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, 1);/*設(shè)置傳輸?shù)臄?shù)據(jù)長度,由于是一字節(jié)一傳所以此處為1,
若數(shù)據(jù)為n字節(jié)則會(huì)在接收到的字節(jié)數(shù)量達(dá)到n的時(shí)候,才傳輸結(jié)束。*/
LL_USART_EnableDMAReq_RX(USART1);//使能RX接收DMA
LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_5);//使能DMA通道的傳輸完成中斷功能;當(dāng)傳輸量達(dá)到數(shù)據(jù)長度將引發(fā)中斷
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);//開啟DMA傳輸,此時(shí)若RX讀取到數(shù)據(jù)寫入DR將傳輸至MemoryAddress
//
//TX DMA配置
LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_4, LL_USART_DMA_GetRegAddr(USART1)); //連接外設(shè)寄存器USART1- >DR
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t)&test_data); //連接數(shù)據(jù)存儲(chǔ)地址
LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_4); //使能DMA中斷
LL_USART_EnableDMAReq_TX(USART1); //使能TX接收DMA
/* USER CODE END USART1_Init 1 */
④中斷處理函數(shù):
void DMA1_Channel5_IRQHandler(void)
{ //RX中斷調(diào)用
/* USER CODE BEGIN DMA1_Channel5_IRQn 0 */
if(LL_DMA_IsActiveFlag_TC5(DMA1))//判斷是否由DMA傳輸完成引發(fā)中斷
{
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_5);//關(guān)閉通道,以在之后開啟新的DMA傳輸
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t)&test_data); //TX連接數(shù)據(jù)存儲(chǔ)地址
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_4, 1);//設(shè)置TX數(shù)據(jù)長度
LL_DMA_ClearFlag_TC5(DMA1);//清除中斷標(biāo)志,使能下一次RX中斷
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_4);//從數(shù)據(jù)位置向TX啟動(dòng)一次DMA;傳輸完成后調(diào)用TX的DMA中斷
}
/* USER CODE END DMA1_Channel5_IRQn 0 */
}
void DMA1_Channel4_IRQHandler(void)
{ //TX中斷調(diào)用
/* USER CODE BEGIN DMA1_Channel4_IRQn 0 */
if(LL_DMA_IsActiveFlag_TC4(DMA1))//判斷是否由DMA傳輸完成引發(fā)中斷
{
LL_DMA_ClearFlag_TC4(DMA1); //清除中斷標(biāo)志
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_4); //關(guān)閉通道,以在之后開啟新的DMA傳輸
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)&test_data); //RX連接數(shù)據(jù)存儲(chǔ)地址
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);//再次啟動(dòng)RX DMA功能
}
/* USER CODE END DMA1_Channel4_IRQn 0 */
}
以上代碼即可實(shí)現(xiàn)功能。
上一篇:基于STM32的解魔方機(jī)器人設(shè)計(jì)方案
下一篇:串口如何接收數(shù)據(jù) STM32串口接收數(shù)據(jù)
推薦閱讀最新更新時(shí)間:2025-06-20 11:01




- 熱門資源推薦
- 熱門放大器推薦
-
【Follow me第三季第1期】任務(wù)三:Arduino環(huán)境運(yùn)動(dòng)傳感器數(shù)據(jù)讀取
-
【Follow me 第三季第1期】任務(wù)二——Arduino控制板載LED燈,并實(shí)現(xiàn)呼吸燈效果
-
【Follow me 第三季第1期】任務(wù)一 源碼-——Arduino環(huán)境Hello EEWorld
-
Follow me第三季第1期STM32F429作品代碼
-
射頻電路設(shè)計(jì)
-
器件應(yīng)力降額總規(guī)范(艾默生)
-
5G通信系統(tǒng)定位技術(shù)原理與方法
-
笨辦法學(xué)C語言
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- Tone Capsule Preamp
- EVAL-ADuC812QSZ、用于 ADuC812 SAR 微轉(zhuǎn)換器 MCU 的 ADuC8xx 評(píng)估套件
- 使用 ROHM Semiconductor 的 BU4948 的參考設(shè)計(jì)
- L7805A 固定輸出穩(wěn)壓器的典型應(yīng)用
- SI1000DK,開發(fā)套件由主板和基于Si1001 8051 MCU的子卡組成
- stm32最小系統(tǒng)
- 具有輕松驅(qū)動(dòng)輸入電流消除功能的 LTC2482、16 位 ADC 的典型應(yīng)用
- LTC1046IN8 超精密分壓器典型應(yīng)用電路
- EPR-8 - 1.2 W,通用輸入,非隔離電源
- TP5602充電寶
- 未來,無氣輪胎或?qū)⒊蔀樽詣?dòng)駕駛汽車選材流行趨勢(shì)
- 韓過去5年被泄露百項(xiàng)商業(yè)機(jī)密,芯片、顯示技術(shù)占大宗
- 第三代半導(dǎo)體頭部企業(yè)基本半導(dǎo)體完成C1輪融資
- MPS布局隔離電源板塊推出一系列中大功率應(yīng)用產(chǎn)品
- OPPO Find X5 Lite新機(jī)解密,為Reno7 5G國際改名版
- 財(cái)政部原副部長朱光耀:全球芯片供應(yīng)鏈被分割是非常危險(xiǎn)思路
- S7-1200與IO控制器的通信診斷功能
- 汽車安全,網(wǎng)絡(luò)安全,英飛凌,PSoC,微控制器
- 米爾新品!國產(chǎn)高安全性車規(guī)級(jí)平臺(tái),芯馳D9多核Cortex-A55核心板
- 國芯科技發(fā)布全球首款48V安全氣囊芯片,引領(lǐng)智能汽車新紀(jì)元
- 亞馬遜全球部署100萬臺(tái)機(jī)器人
- 自動(dòng)駕駛只用激光雷達(dá)進(jìn)行感知會(huì)有哪些問題?
- 為什么電源紋波測試結(jié)果與理論設(shè)計(jì)如此之大?
- UWB信標(biāo)與LoRa基站網(wǎng)關(guān)數(shù)據(jù)區(qū)別在哪里?
- 什么是AI 同傳技術(shù)
- 人工智能處理器和加速器到底是什么?
- PWM控制(脈沖寬度調(diào)制)的基本原理是什么
- 如何設(shè)計(jì)帶集成運(yùn)放構(gòu)成的方波發(fā)生器
- DSP調(diào)度算法的基本概念和原理
- zigbee學(xué)習(xí)之路(四):按鍵控制(中斷方式)
- zigbee學(xué)習(xí)之路(三):按鍵的控制
- zigbee學(xué)習(xí)之路(一):zigbee介紹 一.前言
- zigbee學(xué)習(xí)之路(二):點(diǎn)亮LED
- PWM調(diào)整2個(gè)LED的亮度00--FF,255級(jí)亮度自動(dòng)調(diào)節(jié)
- 英國宣布在南非投入5600萬英鎊的電池存儲(chǔ)
- 樂智機(jī)器人獲1500萬元戰(zhàn)略投資
- 汽車半導(dǎo)體制造要求將愈發(fā)苛刻,隨機(jī)缺陷率尤為重要
- 手握銳龍的AMD能否和其他兩強(qiáng)三分天下?
- 7納米工藝將是臺(tái)積電未來主攻重點(diǎn)