国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32 串口 DMA 接收任意長度數(shù)據(jù)

這篇具有很好參考價值的文章主要介紹了STM32 串口 DMA 接收任意長度數(shù)據(jù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

DMA 局限性

DMA 傳輸完成會產(chǎn)生中斷告知 CPU,這對于固定長度的數(shù)據(jù)是沒什么問題的。但是對于不定長的數(shù)據(jù)就不行了,DMA 一定要接收到足夠多(設(shè)定的長度)的數(shù)據(jù)時才產(chǎn)生完成中斷,如果接收到的數(shù)據(jù)量小于設(shè)定的長度,這個時候 CPU 就無法通過中斷方式取處理這點(diǎn)數(shù)據(jù)了。那 CPU 怎樣優(yōu)化這個缺陷呢?那就是使用輪詢的方式,主動獲取 DMA 當(dāng)前收到了多少字節(jié)數(shù)據(jù),然后決定要不要處理這些數(shù)據(jù)。但是,一旦使用輪詢方式就背離了 DMA 原有的設(shè)計意圖(為 CPU 減負(fù))。
那還有什么辦法可以優(yōu)雅地解決這個問題嗎?那就是使用串口空閑中斷。

串口空閑中斷

這里是轉(zhuǎn)變了一個思路,單純從 DMA 角度解決問題貌似找不到很好的答案,那就轉(zhuǎn)換到串口上來。因為本身的工作是串口 DMA 接收任意長度數(shù)據(jù)。
串口有個空閑中斷,大概是串口總線在一個字節(jié)的時間內(nèi)沒有再接收到數(shù)據(jù),認(rèn)為一幀數(shù)據(jù)傳輸完畢了,就會產(chǎn)生串口空閑中斷。
這樣我們就不使用 DMA 中斷了,只使用串口空閑中斷,即在串口空閑中斷中獲取 DMA 接收的數(shù)據(jù)并處理,然后再開啟下次 DMA 接收。

關(guān)鍵代碼

使能串口空閑中斷

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);

添加串口空閑中斷處理函數(shù)

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  UART_IRQHandler_IDLE(&huart1); // 串口空閑中斷處理函數(shù)
  /* USER CODE END USART1_IRQn 1 */
}

/* USER CODE BEGIN 1 */
void UART_IRQHandler_IDLE(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
	{	
		if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET)
		{
			HAL_UART_DMAStop(&huart1);
			uint8_t data_length  = sizeof(recv_buf) - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
			HAL_UART_Transmit(&huart1, recv_buf, data_length, 100);
			__HAL_UART_CLEAR_IDLEFLAG(&huart1);
			__HAL_UART_CLEAR_OREFLAG(&huart1);
			HAL_UART_Receive_DMA(&huart1, recv_buf, sizeof(recv_buf));
		}
	}
}
/* USER CODE END 1 */

避坑

在使用串口中斷時,一定記得要清除 ORE flag,不然中斷會出各種意想不到的異常,比如串口發(fā)送數(shù)據(jù)會觸發(fā)串口接收中斷。

__HAL_UART_CLEAR_OREFLAG(&huart1);

測試

stm32dma串口接收,# STM32,stm32,單片機(jī),嵌入式硬件

完整代碼

https://download.csdn.net/download/lyndon_li/88054148
對應(yīng)硬件:STM32F107VCT6文章來源地址http://www.zghlxwxcb.cn/news/detail-671523.html

到了這里,關(guān)于STM32 串口 DMA 接收任意長度數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【STM32 HAL庫實(shí)戰(zhàn)】串口DMA + 空閑中斷 實(shí)現(xiàn)不定長數(shù)據(jù)接收

    【STM32 HAL庫實(shí)戰(zhàn)】串口DMA + 空閑中斷 實(shí)現(xiàn)不定長數(shù)據(jù)接收

    STM32CubeMX最新版: 打開STM32CubeMX軟件,點(diǎn)擊ACCESS TO MCU SELECTOR,在Commercial Part Number 中輸入MCU型號,例如我在這里輸入了STM32L431RCT6。選中正確型號然后雙擊進(jìn)入下一步的配置界面。 1.1 SYS配置如圖 1.2 RCC配置如圖 開啟了外部晶振,若無則都選擇Disable 1.3 USART1配置 NVIC Settings 注意

    2024年02月03日
    瀏覽(38)
  • STM32:串口輪詢模式、中斷模式、DMA模式和接收不定長數(shù)據(jù)

    STM32:串口輪詢模式、中斷模式、DMA模式和接收不定長數(shù)據(jù)

    ? ? ? ?在STM32每個串口的內(nèi)部都有兩個寄存器:發(fā)送數(shù)據(jù)寄存器(TDR)/發(fā)送移位寄存器,當(dāng)我們調(diào)用HAL_UART_Transmit 把數(shù)據(jù)發(fā)送出去時,CPU會將數(shù)據(jù)依次將數(shù)據(jù)發(fā)送到數(shù)據(jù)寄存器中,移位寄存器中的數(shù)據(jù)會根據(jù)我們設(shè)置的比特率傳化成高低電平從TX引腳輸出。待發(fā)送移位寄存器中發(fā)

    2024年02月07日
    瀏覽(20)
  • STM32使用三種方式(阻塞、中斷、DMA)實(shí)現(xiàn)串口發(fā)送和接收數(shù)據(jù)

    STM32使用三種方式(阻塞、中斷、DMA)實(shí)現(xiàn)串口發(fā)送和接收數(shù)據(jù)

    記錄下學(xué)習(xí)STM32開發(fā)板的心得的和遇見的問題。 板卡型號:STM32F405RGT6 軟件:STM32CubeMX、IAR STM32串口外設(shè)提供了3種接收和發(fā)送方式:阻塞、中斷、DMA,主要給大家分享中斷方式接收不定長數(shù)據(jù)和DMA使用空閑中斷接收不定長數(shù)據(jù)。 阻塞發(fā)送: 阻塞接收: 兩個函數(shù)需要注意的就

    2024年02月03日
    瀏覽(26)
  • 嵌入式開發(fā)--STM32用DMA+IDLE中斷方式串口接收不定長數(shù)據(jù)

    嵌入式開發(fā)--STM32用DMA+IDLE中斷方式串口接收不定長數(shù)據(jù)

    之前講過用 利用IDLE空閑中斷來接收不定長數(shù)據(jù) ,但是沒有用到DMA,其實(shí)用DMA會更加的高效,MCU也可以騰出更多的性能去處理應(yīng)該做的事情。 IDLE顧名思義,就是空閑的意思,即當(dāng)監(jiān)測到串口空閑超過1個串口的數(shù)據(jù)幀時,會使?fàn)顟B(tài)寄存器(SR或ISR)的IDLE位置位,如果此時控制

    2024年04月17日
    瀏覽(39)
  • STM32使用串口空閑中斷(IDLE)和 DMA接收一串?dāng)?shù)據(jù)流

    STM32使用串口空閑中斷(IDLE)和 DMA接收一串?dāng)?shù)據(jù)流

    方法一、使用宏定義判斷IDLE標(biāo)志位 空閑的定義是總線上在一個字節(jié)的時間內(nèi)沒有再接收到數(shù)據(jù),USART_IT_IDLE空閑中斷是檢測到有數(shù)據(jù)被接收后,總線上在一個字節(jié)的時間內(nèi)沒有再接收到數(shù)據(jù)的時候發(fā)生的。 串口空閑中斷(UART_IT_IDLE):STM32的IDLE的中斷在串口無數(shù)據(jù)接收的情況

    2024年01月23日
    瀏覽(27)
  • stm32f103c8r6 串口2數(shù)據(jù)DMA的接收

    #define USART_REC_LEN ??? ??? ??? ?16 ??? ?//定義最大接收字節(jié)數(shù) ?16 extern u8 USART2_RX_BUF[USART_REC_LEN]; u8 USART2_RX_BUF[USART_REC_LEN];? void uart2_init(u32 bound) { ?? ?//GPIO端口設(shè)置 ?? ?GPIO_InitTypeDef GPIO_InitStructure; ?? ?USART_InitTypeDef USART_InitStructure; ?? ?//NVIC_InitTypeDef NVIC_InitStructure; ??

    2024年01月24日
    瀏覽(19)
  • STM32 LL庫 串口DMA發(fā)送接收配置教程

    本文詳細(xì)介紹了如何在STM32中使用LL庫進(jìn)行串口DMA發(fā)送和接收的配置,包括STM32CubeMX的配置、代碼初始化、發(fā)送功能和接收功能。通過本教程,您將學(xué)會如何正確配置串口DMA,并實(shí)現(xiàn)高效的數(shù)據(jù)傳輸。

    2024年02月10日
    瀏覽(218)
  • STM32F429 Discovery開發(fā)板應(yīng)用:使用FreeRTOS隊列+DMA雙緩存實(shí)現(xiàn)串口數(shù)據(jù)接收

    STM32F429 Discovery開發(fā)板應(yīng)用:使用FreeRTOS隊列+DMA雙緩存實(shí)現(xiàn)串口數(shù)據(jù)接收

    ? 參考帖子:https://blog.csdn.net/freedompoi/article/details/122350866 目前想要實(shí)現(xiàn)STM32F4自帶的DMA雙緩沖區(qū),嘗試過一版,結(jié)果不能預(yù)期,就使用了RxHalfCplt和RxCplt去實(shí)現(xiàn)DMA雙緩沖區(qū)的效果。 現(xiàn)在有時間了,又重新實(shí)現(xiàn)STM32F4自帶的DMA雙緩沖區(qū),作為參考。 ? MCU:STM32F429ZIT6 開發(fā)環(huán)境:

    2024年02月08日
    瀏覽(22)
  • 【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實(shí)現(xiàn)不定長數(shù)據(jù)接收

    【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實(shí)現(xiàn)不定長數(shù)據(jù)接收

    目錄 ? 總覽 使用CUBEMX創(chuàng)建工程的基本配置 CUBEMX中的配置 Keil中的配置 實(shí)物連接 串口輪詢模式 輪詢模式HAL庫函數(shù) 特點(diǎn) 實(shí)驗一:發(fā)送數(shù)據(jù)給單片機(jī)并讓其返回相同值 串口重定向 串口中斷模式 在CUBEMX中打開串口中斷 中斷模式HAL庫函數(shù) 特點(diǎn) 實(shí)驗二:使用中斷回調(diào)完成實(shí)驗一

    2024年04月10日
    瀏覽(44)
  • STM32 —— DMA 發(fā)送與接收數(shù)據(jù)詳解

    STM32 —— DMA 發(fā)送與接收數(shù)據(jù)詳解

    DMA(Direct Memory Access) :直接存儲器存取,是單片機(jī)的一個外設(shè),它的主要功能是用來搬數(shù)據(jù),但是不需要占用 CPU ,即在傳輸數(shù)據(jù)的時候,CPU 可以干其他的事情,好像是多線程一樣。數(shù)據(jù)傳輸支持從外設(shè)到存儲器或者存儲器到存儲器,這里的存儲器可以是 SRAM 或者是 FLASH DMA傳

    2024年02月13日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包