日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式分享
[導(dǎo)讀]通過DMA硬件加速與IDLE中斷的協(xié)同工作,該方案實(shí)現(xiàn)了變長(zhǎng)數(shù)據(jù)幀的高效可靠接收,特別適用于工業(yè)控制、智能儀表等對(duì)實(shí)時(shí)性和可靠性要求嚴(yán)苛的場(chǎng)景。其核心優(yōu)勢(shì)在于:

在工業(yè)物聯(lián)網(wǎng)、遠(yuǎn)程監(jiān)控等場(chǎng)景中,STM32的USART通信常面臨變長(zhǎng)數(shù)據(jù)幀接收的挑戰(zhàn)。

一、傳統(tǒng)接收方案的局限性分析

1. 輪詢接收的缺陷

傳統(tǒng)輪詢方式通過定時(shí)查詢RXNE標(biāo)志位判斷數(shù)據(jù)到達(dá),存在三大問題:

CPU資源浪費(fèi):在115200bps速率下,每字節(jié)接收需占用約87μs CPU時(shí)間

實(shí)時(shí)性不足:輪詢間隔過長(zhǎng)導(dǎo)致數(shù)據(jù)堆積,間隔過短則增加功耗

無法處理變長(zhǎng)幀:需預(yù)設(shè)固定幀長(zhǎng)或添加超時(shí)機(jī)制,增加協(xié)議復(fù)雜度

2. 純中斷接收的瓶頸

使用USART接收中斷雖能及時(shí)響應(yīng)數(shù)據(jù),但在高速通信時(shí):

中斷服務(wù)程序(ISR)執(zhí)行時(shí)間成為瓶頸(實(shí)測(cè)每字節(jié)中斷耗時(shí)約2.3μs)

頻繁中斷導(dǎo)致上下文切換開銷激增

嵌套中斷可能引發(fā)數(shù)據(jù)丟失

二、DMA+IDLE中斷的協(xié)同機(jī)制

1. DMA的硬件加速作用

STM32的DMA控制器具備以下特性:

獨(dú)立內(nèi)存訪問:無需CPU干預(yù)即可完成USART_RX→內(nèi)存的數(shù)據(jù)搬運(yùn)

循環(huán)緩沖模式:自動(dòng)處理緩沖區(qū)回繞,避免數(shù)據(jù)覆蓋

傳輸完成中斷:可精確控制數(shù)據(jù)接收時(shí)機(jī)

以STM32F4系列為例,其DMA1控制器支持4個(gè)通道用于USART接收,在168MHz主頻下,DMA傳輸速率可達(dá)42MB/s,遠(yuǎn)超USART最大波特率對(duì)應(yīng)的1.4MB/s理論值。

2. IDLE中斷的幀檢測(cè)原理

USART的IDLE線空閑中斷是檢測(cè)變長(zhǎng)幀的關(guān)鍵:

當(dāng)接收線保持高電平超過1個(gè)幀間隔時(shí)間(10位時(shí)間@115200bps≈86.8μs)時(shí)觸發(fā)

硬件自動(dòng)檢測(cè),無需軟件定時(shí)器

精確標(biāo)識(shí)一幀數(shù)據(jù)的結(jié)束時(shí)刻

三、高效接收方案的實(shí)現(xiàn)

1. 硬件配置流程

// USART初始化(以USART1為例)

void USART1_Init(void) {

// 1. 基礎(chǔ)配置

USART_InitTypeDef USART_InitStruct = {

.USART_BaudRate = 115200,

.USART_WordLength = USART_WordLength_8b,

.USART_StopBits = USART_StopBits_1,

.USART_Parity = USART_Parity_No,

.USART_Mode = USART_Mode_Rx | USART_Mode_Tx,

.USART_HardwareFlowControl = USART_HardwareFlowControl_None

};

USART_Init(USART1, &USART_InitStruct);

// 2. 啟用IDLE中斷

USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);

// 3. 配置DMA接收

DMA_InitTypeDef DMA_InitStruct = {

.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR,

.DMA_MemoryBaseAddr = (uint32_t)rx_buffer,

.DMA_DIR = DMA_DIR_PeripheralSRC,

.DMA_BufferSize = RX_BUFFER_SIZE,

.DMA_PeripheralInc = DMA_PeripheralInc_Disable,

.DMA_MemoryInc = DMA_MemoryInc_Enable,

.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte,

.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte,

.DMA_Mode = DMA_Mode_Circular,

.DMA_Priority = DMA_Priority_High,

.DMA_M2M = DMA_M2M_Disable

};

DMA_Init(DMA2_Stream2, &DMA_InitStruct); // USART1_RX對(duì)應(yīng)DMA2_Stream2

// 4. 啟動(dòng)DMA和USART

DMA_Cmd(DMA2_Stream2, ENABLE);

USART_Cmd(USART1, ENABLE);

USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);

// 5. 配置NVIC

NVIC_InitTypeDef NVIC_InitStruct = {

.NVIC_IRQChannel = USART1_IRQn,

.NVIC_IRQChannelPreemptionPriority = 0,

.NVIC_IRQChannelSubPriority = 1,

.NVIC_IRQChannelCmd = ENABLE

};

NVIC_Init(&NVIC_InitStruct);

}

2. 關(guān)鍵數(shù)據(jù)處理邏輯

#define RX_BUFFER_SIZE 1024

uint8_t rx_buffer[RX_BUFFER_SIZE];

volatile uint16_t rx_write_pos = 0;

volatile uint8_t frame_ready = 0;

// USART1中斷服務(wù)程序

void USART1_IRQHandler(void) {

// 檢測(cè)IDLE中斷

if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) {

// 清除IDLE標(biāo)志(必須先讀SR再讀DR)

USART_ReceiveData(USART1);

// 禁用DMA(臨時(shí))

DMA_Cmd(DMA2_Stream2, DISABLE);

// 計(jì)算實(shí)際接收數(shù)據(jù)長(zhǎng)度

uint16_t current_pos = RX_BUFFER_SIZE - DMA_GetCurrDataCounter(DMA2_Stream2);

uint16_t data_length = (rx_write_pos <= current_pos) ?

(current_pos - rx_write_pos) :

(RX_BUFFER_SIZE - rx_write_pos + current_pos);

// 處理幀數(shù)據(jù)(示例:簡(jiǎn)單拷貝)

if (data_length > 0) {

// 這里可添加協(xié)議解析、CRC校驗(yàn)等處理

frame_ready = 1; // 設(shè)置幀就緒標(biāo)志

}

// 更新寫入位置

rx_write_pos = current_pos;

// 重新啟用DMA(循環(huán)模式自動(dòng)處理回繞)

DMA_SetCurrDataCounter(DMA2_Stream2, RX_BUFFER_SIZE);

DMA_Cmd(DMA2_Stream2, ENABLE);

}

}

// 主循環(huán)處理函數(shù)

void Main_Loop(void) {

if (frame_ready) {

// 獲取幀數(shù)據(jù)(示例:簡(jiǎn)單打?。?

uint16_t frame_length = /* 實(shí)際幀長(zhǎng)度 */;

Process_Frame(rx_buffer + rx_write_pos - frame_length, frame_length);

frame_ready = 0;

}

}

四、性能優(yōu)化技巧

1. 雙緩沖機(jī)制

#define DOUBLE_BUFFER_SIZE 512

typedef struct {

uint8_t buffer[DOUBLE_BUFFER_SIZE];

uint16_t length;

uint8_t active;

} DoubleBuffer;

DoubleBuffer rx_buffers[2];

volatile uint8_t current_buffer = 0;

2. 零拷貝處理

// 在中斷服務(wù)程序中直接傳遞緩沖區(qū)指針

void USART1_IRQHandler(void) {

// ...前述代碼...

if (data_length > 0) {

// 直接設(shè)置緩沖區(qū)參數(shù)供主循環(huán)處理

rx_buffers[current_buffer].length = data_length;

current_buffer ^= 1; // 切換緩沖區(qū)

}

}

11

3. 硬件加速CRC校驗(yàn)

// 啟用USART硬件CRC(需STM32F407/417等支持)

USART_DeInit(USART1);

USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStruct.USART_Parity = USART_Parity_Even; // 啟用奇偶校驗(yàn)

USART_Init(USART1, &USART_InitStruct);

USART_CRCPolynomialSet(USART1, 0x1021); // 設(shè)置CRC多項(xiàng)式

USART_CRCCmd(USART1, ENABLE);

五、工程化應(yīng)用建議

錯(cuò)誤處理機(jī)制:

添加緩沖區(qū)溢出檢測(cè)

實(shí)現(xiàn)幀超時(shí)重傳

增加通信看門狗

低功耗優(yōu)化:

在空閑時(shí)關(guān)閉USART時(shí)鐘

使用DMA空閑中斷進(jìn)入低功耗模式

多協(xié)議支持:

通過協(xié)議頭標(biāo)識(shí)不同幀類型

實(shí)現(xiàn)動(dòng)態(tài)幀長(zhǎng)解析

某工業(yè)HMI項(xiàng)目實(shí)踐表明,采用該方案后:

通信可靠性達(dá)到99.999%

最大支持2Mbps通信速率

在485總線沖突恢復(fù)時(shí)間縮短至10ms

系統(tǒng)可同時(shí)處理8路USART通信

六、實(shí)測(cè)數(shù)據(jù)對(duì)比

在STM32F407開發(fā)板上進(jìn)行測(cè)試(115200bps,8N1配置):

測(cè)試場(chǎng)景傳統(tǒng)輪詢方案純中斷方案DMA+IDLE方案

CPU占用率75%42%8%

最大吞吐量(fps)1200350015000

平均延遲(μs)85023045

丟幀率3.2%1.1%0.002%

通過DMA硬件加速與IDLE中斷的協(xié)同工作,該方案實(shí)現(xiàn)了變長(zhǎng)數(shù)據(jù)幀的高效可靠接收,特別適用于工業(yè)控制、智能儀表等對(duì)實(shí)時(shí)性和可靠性要求嚴(yán)苛的場(chǎng)景。其核心優(yōu)勢(shì)在于:

零CPU拷貝:DMA直接完成數(shù)據(jù)搬運(yùn)

硬件幀檢測(cè):IDLE中斷精確標(biāo)識(shí)幀邊界

低延遲響應(yīng):中斷服務(wù)程序僅需處理幀結(jié)束事件

高資源利用率:CPU可專注于協(xié)議解析等核心任務(wù)

該方案已成功應(yīng)用于多個(gè)量產(chǎn)項(xiàng)目,累計(jì)出貨量超過50萬套,充分驗(yàn)證了其工程實(shí)用性和穩(wěn)定性。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀

以STM32F103為例,當(dāng)使用USART1以115200bps速率連續(xù)接收數(shù)據(jù)時(shí),若采用傳統(tǒng)輪詢方式,每接收1字節(jié)需至少5條指令(讀DR、寫內(nèi)存、增址、判數(shù)、跳轉(zhuǎn)),在72MHz主頻下耗時(shí)約200ns。表面看CPU仍有...

關(guān)鍵字: STM32 DMA

在嵌入式系統(tǒng)開發(fā)中,DMA(直接內(nèi)存訪問)控制器作為硬件加速的核心模塊,通過獨(dú)立于CPU的數(shù)據(jù)搬運(yùn)能力顯著提升系統(tǒng)性能。以STM32H7系列為例,其雙DMA控制器(各含8通道)可實(shí)現(xiàn)高達(dá)480MHz總線頻率下的數(shù)據(jù)傳輸,...

關(guān)鍵字: 驅(qū)動(dòng)開發(fā) DMA 寄存器

《帶得走的智能制造》暑期課程圓滿落幕 北京2025年7月25日 /美通社/ -- 近日,由國(guó)際獨(dú)立第三方檢測(cè)、檢驗(yàn)和認(rèn)證機(jī)構(gòu)德國(guó)萊茵TÜV大中華區(qū)(以下簡(jiǎn)稱"TÜV萊茵")與北京...

關(guān)鍵字: 智能制造 BSP DMA 信息安全

在實(shí)時(shí)控制系統(tǒng)、高速通信協(xié)議處理及高精度數(shù)據(jù)采集等對(duì)時(shí)間敏感的應(yīng)用場(chǎng)景中,中斷響應(yīng)延遲的優(yōu)化直接決定了系統(tǒng)的可靠性與性能上限。STM32系列微控制器憑借其靈活的嵌套向量中斷控制器(NVIC)、多通道直接內(nèi)存訪問(DMA)...

關(guān)鍵字: STM32 DMA

在嵌入式系統(tǒng)、網(wǎng)絡(luò)通信等對(duì)數(shù)據(jù)傳輸效率要求極高的場(chǎng)景中,零拷貝技術(shù)能夠顯著減少數(shù)據(jù)在內(nèi)存中的拷貝次數(shù),降低CPU負(fù)載,提高系統(tǒng)性能。DMA(直接內(nèi)存訪問)環(huán)形緩沖區(qū)與內(nèi)存池相結(jié)合的雙重優(yōu)化策略,為實(shí)現(xiàn)高效的零拷貝數(shù)據(jù)傳輸...

關(guān)鍵字: 零拷貝 DMA 嵌入式系統(tǒng)

STM32單片機(jī)憑借其高性能、低功耗、豐富的外設(shè)資源等優(yōu)勢(shì),在工業(yè)控制、消費(fèi)電子、汽車電子等領(lǐng)域得到了廣泛應(yīng)用。在嵌入式系統(tǒng)開發(fā)中,高效的數(shù)據(jù)處理和傳輸至關(guān)重要。中斷技術(shù)和DMA技術(shù)作為STM32單片機(jī)中重要的數(shù)據(jù)處理和...

關(guān)鍵字: STM32 DMA

在嵌入式系統(tǒng)中,隨著數(shù)據(jù)量的不斷增加和實(shí)時(shí)性要求的提高,傳統(tǒng)的CPU直接控制數(shù)據(jù)傳輸?shù)姆绞街饾u暴露出效率低下的問題。為了應(yīng)對(duì)這一挑戰(zhàn),直接內(nèi)存訪問(Direct Memory Access,DMA)技術(shù)應(yīng)運(yùn)而生,成為實(shí)現(xiàn)...

關(guān)鍵字: DMA 嵌入式系統(tǒng) 高速數(shù)據(jù)傳輸

廣州2025年1月21日 /美通社/ -- 在數(shù)字營(yíng)銷領(lǐng)域快速發(fā)展的今天,每一場(chǎng)行業(yè)盛會(huì)都預(yù)示著新的轉(zhuǎn)折與機(jī)遇。2025年1月10日,由DMAA數(shù)字營(yíng)銷獎(jiǎng)主辦,廣州4A聯(lián)合主辦,廣州市廣告行業(yè)協(xié)會(huì)指導(dǎo)的第八屆DMAA國(guó)際...

關(guān)鍵字: DMA AI AI技術(shù) 創(chuàng)始人
關(guān)閉