[導(dǎo)讀]來源:嵌入式大雜燴今天說一下串口DMA。直接存儲器訪問(DirectMemoryAccess),簡稱DMA。DMA是CPU一個用于數(shù)據(jù)從一個地址空間到另一地址空間“搬運”(拷貝)的組件,數(shù)據(jù)拷貝過程不需CPU干預(yù),數(shù)據(jù)拷貝結(jié)束則通知CPU處理。因此,大量數(shù)據(jù)拷貝時,使用DMA可以...
來源:嵌入式大雜燴今天說一下串口DMA。直接存儲器訪問(Direct Memory Access),簡稱DMA。DMA是CPU一個用于數(shù)據(jù)從一個地址空間到另一地址空間“搬運”(拷貝)的組件,數(shù)據(jù)拷貝過程不需CPU干預(yù),數(shù)據(jù)拷貝結(jié)束則通知CPU處理。因此,大量數(shù)據(jù)拷貝時,使用DMA可以釋放CPU資源。DMA數(shù)據(jù)拷貝過程,典型的有:
- 內(nèi)存—>內(nèi)存,內(nèi)存間拷貝
- 外設(shè)—>內(nèi)存,如uart、spi、i2c等總線接收數(shù)據(jù)過程
- 內(nèi)存—>外設(shè),如uart、spi、i2c等總線發(fā)送數(shù)據(jù)過程
1、 串口有必要使用DMA嗎?
串口(uart)是一種低速的串行異步通信,適用于低速通信場景,通常使用的波特率小于或等于115200bps
。對于小于或者等于115200bps
波特率的,而且數(shù)據(jù)量不大的通信場景,一般沒必要使用DMA,或者說使用DMA并未能充分發(fā)揮出DMA的作用。對于數(shù)量大,或者波特率提高時,必須使用DMA以釋放CPU資源,因為高波特率可能帶來這樣的問題:對于發(fā)送,使用循環(huán)發(fā)送,可能阻塞線程,需要消耗大量CPU資源“搬運”數(shù)據(jù),浪費CPU對于發(fā)送,使用中斷發(fā)送,不會阻塞線程,但需浪費大量中斷資源,CPU頻繁響應(yīng)中斷;以115200bps波特率,1s傳輸11520字節(jié),大約69us需響應(yīng)一次中斷,如波特率再提高,將消耗更多CPU資源對于接收,如仍采用傳統(tǒng)的中斷模式接收,同樣會因為頻繁中斷導(dǎo)致消耗大量CPU資源因此,高波特率場景下,串口非常有必要使用DMA。2、實現(xiàn)方式
3、STM32串口使用DMA
關(guān)于STM32串口使用DMA,不乏一些開發(fā)板例程及網(wǎng)絡(luò)上一些博主的使用教程。使用步驟、流程、配置基本大同小異,正確性也沒什么毛病,但都是一些基本的Demo例子,作為學(xué)習(xí)過程沒問題;實際項目使用缺乏嚴謹性,數(shù)據(jù)量大時可能導(dǎo)致數(shù)據(jù)異常。測試平臺:- STM32F030C8T6
- UART1/UART2
- DMA1 Channel2—Channel5
- ST標準庫
- 主頻48MHz(外部12MHz晶振)
4、串口DMA接收
4.1 基本流程
4.2 相關(guān)配置
關(guān)鍵步驟- 初始化串口
- 使能串口DMA接收模式,使能串口空閑中斷
- 配置DMA參數(shù),使能DMA通道buf半滿(傳輸一半數(shù)據(jù))中斷、buf溢滿(傳輸數(shù)據(jù)完成)中斷
為什么需要使用DMA 通道buf半滿中斷?很多串口DMA模式接收的教程、例子,基本是使用了**“空閑中斷” “DMA傳輸完成中斷”**來接收數(shù)據(jù)。實質(zhì)上這是存在風(fēng)險的,當DMA傳輸數(shù)據(jù)完成,CPU介入開始拷貝DMA通道buf數(shù)據(jù),如果此時串口繼續(xù)有數(shù)據(jù)進來,DMA繼續(xù)搬運數(shù)據(jù)到buf,就有可能將數(shù)據(jù)覆蓋,因為DMA數(shù)據(jù)搬運是不受CPU控制的,即使你關(guān)閉了CPU中斷。嚴謹?shù)淖龇ㄐ枰鲭pbuf,CPU和DMA各自一塊內(nèi)存交替訪問,即是"乒乓緩存” ,處理流程步驟應(yīng)該是這樣:【1】第一步,DMA先將數(shù)據(jù)搬運到buf1,搬運完成通知CPU來拷貝buf1數(shù)據(jù) 【2】第二步,DMA將數(shù)據(jù)搬運到buf2,與CPU拷貝buf1數(shù)據(jù)不會沖突 【3】第三步,buf2數(shù)據(jù)搬運完成,通知CPU來拷貝buf2數(shù)據(jù) 【4】執(zhí)行完第三步,DMA返回執(zhí)行第一步,一直循環(huán)。STM32F0系列DMA不支持雙緩存(以具體型號為準)機制,但提供了一個buf"半滿中斷",即是數(shù)據(jù)搬運到buf大小的一半時,可以產(chǎn)生一個中斷信號?;谶@個機制,我們可以實現(xiàn)雙緩存功能,只需將buf空間開辟大一點即可。【1】第一步,DMA將數(shù)據(jù)搬運完成buf的前一半時,產(chǎn)生“半滿中斷”,CPU來拷貝buf前半部分數(shù)據(jù) 【2】第二步,DMA繼續(xù)將數(shù)據(jù)搬運到buf的后半部分,與CPU拷貝buf前半部數(shù)據(jù)不會沖突 【3】第三步,buf后半部分數(shù)據(jù)搬運完成,觸發(fā)“溢滿中斷”,CPU來拷貝buf后半部分數(shù)據(jù) 【4】執(zhí)行完第三步,DMA返回執(zhí)行第一步,一直循環(huán)。UART2 DMA模式接收配置代碼如下,與其他外設(shè)使用DMA的配置基本一致,留意關(guān)鍵配置:- 串口接收,DMA通道工作模式設(shè)為連續(xù)模式
- 使能DMA通道接收buf半滿中斷、溢滿(傳輸完成)中斷
- 啟動DMA通道前清空相關(guān)狀態(tài)標識,防止首次傳輸錯亂數(shù)據(jù)
void?bsp_uart2_dmarx_config(uint8_t?*mem_addr,?uint32_t?mem_size)
{
???DMA_InitTypeDef?DMA_InitStructure;
?
?DMA_DeInit(DMA1_Channel5);?
?DMA_Cmd(DMA1_Channel5,?DISABLE);
?DMA_InitStructure.DMA_PeripheralBaseAddr??=?(uint32_t)
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
自2014年ST公司推出STM32CubeMX以來,這款圖形化配置工具憑借“一鍵生成初始化代碼”“跨IDE兼容”“中間件集成”等特性,迅速成為78%的STM32開發(fā)者首選工具。然而,伴隨其普及的爭議始終未息:STM32C...
關(guān)鍵字:
STM32CubeMX
ST公司
在工業(yè)自動化領(lǐng)域,Modbus協(xié)議憑借其開放性和易用性成為設(shè)備通信的"通用語言"。然而,當工程師面對Modbus RTU、ASCII和TCP三種變體時,如何根據(jù)具體場景做出最優(yōu)選擇?本文將從編碼機制、通信效率、錯誤檢測等...
關(guān)鍵字:
Modbus協(xié)議
TCP
在工業(yè)自動化、能源管理等實時性要求嚴苛的場景中,Modbus通信系統(tǒng)的響應(yīng)延遲直接關(guān)系到設(shè)備控制的精度與系統(tǒng)穩(wěn)定性。從智能電表的功率調(diào)節(jié)到機器人關(guān)節(jié)的同步控制,微秒級的響應(yīng)偏差都可能引發(fā)連鎖故障。本文從硬件架構(gòu)、軟件設(shè)計...
關(guān)鍵字:
Modbus
通信系統(tǒng)
在新能源發(fā)電、電動汽車、數(shù)據(jù)中心等直流供電系統(tǒng)中,過壓故障是導(dǎo)致設(shè)備損壞的主要誘因之一。據(jù)統(tǒng)計,電力電子設(shè)備故障中約35%與過壓事件相關(guān),其中直流側(cè)過壓占比達62%。本文以基于TVS二極管與MOSFET的復(fù)合型直流過壓保...
關(guān)鍵字:
直流過壓
保護電路
在工業(yè)物聯(lián)網(wǎng)(IIoT)與邊緣計算快速發(fā)展的背景下,Modbus協(xié)議憑借其輕量化特性成為微控制器(MCU)設(shè)備互聯(lián)的首選方案。然而,在資源受限的MCU(如STM32F0系列、ESP8266等,RAM通常小于32KB,F(xiàn)l...
關(guān)鍵字:
微控制器
Modbus
工業(yè)物聯(lián)網(wǎng)
在工業(yè)控制系統(tǒng)中,Modbus RTU協(xié)議的CRC校驗如同通信網(wǎng)絡(luò)的"免疫系統(tǒng)",某石化廠DCS系統(tǒng)曾因CRC計算錯誤導(dǎo)致0.3%的數(shù)據(jù)包丟失,引發(fā)連鎖控制故障。本文將深入解析CRC-16/MODBUS算法原理,對比軟件...
關(guān)鍵字:
Modbus RTU
CRC
算法
在工業(yè)自動化領(lǐng)域,Modbus協(xié)議憑借其簡潔高效的設(shè)計,已成為設(shè)備間通信的"通用語言"。某智能電網(wǎng)項目通過Modbus RTU協(xié)議實現(xiàn)2000臺電表的數(shù)據(jù)采集,通信成功率高達99.97%,這背后正是對消息結(jié)構(gòu)的精準把控。...
關(guān)鍵字:
Modbus
工業(yè)自動化
在工業(yè)物聯(lián)網(wǎng)設(shè)備開發(fā)中,Modbus從站功能已成為微控制器(MCU)的標配能力。某智能電表項目通過在STM32上實現(xiàn)Modbus RTU從站,成功將設(shè)備接入現(xiàn)有SCADA系統(tǒng),開發(fā)周期縮短40%。本文將系統(tǒng)解析MCU實現(xiàn)...
關(guān)鍵字:
微控制器
Modbus
協(xié)議棧優(yōu)化
在嵌入式系統(tǒng)中,F(xiàn)lash存儲器因其非易失性、高密度和低成本特性,成為代碼存儲和關(guān)鍵數(shù)據(jù)保存的核心組件。然而,MCU驅(qū)動Flash讀寫時,開發(fā)者常因?qū)τ布匦岳斫獠蛔慊虿僮髁鞒淌韬?,陷入性能下降、?shù)據(jù)損壞甚至硬件損壞的陷...
關(guān)鍵字:
MCU驅(qū)動
Flash
在嵌入式開發(fā)中,STM32的時鐘系統(tǒng)因其靈活性和復(fù)雜性成為開發(fā)者關(guān)注的焦點。然而,看似簡單的時鐘配置背后,隱藏著諸多易被忽視的陷阱,輕則導(dǎo)致系統(tǒng)不穩(wěn)定,重則引發(fā)硬件損壞。本文從時鐘源選擇、PLL配置、總線時鐘分配等關(guān)鍵環(huán)...
關(guān)鍵字:
STM32
時鐘系統(tǒng)
在嵌入式系統(tǒng)開發(fā)中,程序燒錄是連接軟件設(shè)計與硬件實現(xiàn)的關(guān)鍵環(huán)節(jié)。當前主流的單片機燒錄技術(shù)已形成ICP(在電路編程)、ISP(在系統(tǒng)編程)、IAP(在應(yīng)用編程)三大技術(shù)體系,分別對應(yīng)開發(fā)調(diào)試、量產(chǎn)燒錄、遠程升級等不同場景。...
關(guān)鍵字:
單片機
ISP
ICP
IAP
嵌入式系統(tǒng)開發(fā)
在工業(yè)自動化、汽車電子及物聯(lián)網(wǎng)領(lǐng)域,CANBUS總線因其高可靠性和實時性被廣泛應(yīng)用。然而,復(fù)雜電磁環(huán)境、機械振動及配置不當?shù)纫蛩爻?dǎo)致通信異常。本文基于實際工程案例,從硬件、協(xié)議、軟件及環(huán)境四大維度,系統(tǒng)梳理CANBUS...
關(guān)鍵字:
CANBUS
網(wǎng)絡(luò)通信
CANBUS總線
在工業(yè)自動化場景中,變頻器作為核心驅(qū)動設(shè)備,其CANBUS網(wǎng)絡(luò)通訊穩(wěn)定性直接影響生產(chǎn)線運行效率。某汽車制造企業(yè)總裝線曾因變頻器通訊異常導(dǎo)致焊接機器人停機,最終定位為0.5Ω接地電阻異常引發(fā)的共模干擾。本文結(jié)合實際案例,系...
關(guān)鍵字:
變頻器
CANBUS
在嵌入式系統(tǒng)開發(fā)中,STM32系列微控制器的內(nèi)部溫度傳感器因其低成本、高集成度特性,廣泛應(yīng)用于設(shè)備自檢、環(huán)境監(jiān)測等場景。然而,受芯片工藝差異和電源噪聲影響,其原始數(shù)據(jù)存在±1.5℃的固有誤差。本文從硬件配置、校準算法、軟...
關(guān)鍵字:
STM32
溫度傳感器
在嵌入式系統(tǒng)開發(fā)中,看門狗(Watchdog Timer, WDT)是保障系統(tǒng)可靠性的核心組件,其初始化時機的選擇直接影響系統(tǒng)抗干擾能力和穩(wěn)定性。本文從硬件架構(gòu)、軟件流程、安全規(guī)范三個維度,系統(tǒng)分析看門狗初始化的最佳實踐...
關(guān)鍵字:
單片機
看門狗
嵌入式系統(tǒng)