STM32 串口通信

串口發原理

????在stm32每個串口內部有發送寄存器和發送移位寄存器。
????當調用HAL_UART_Transmit 時,cpu會將發送的數據放入發送寄存器中。發送移位寄存器會將數據轉換成電平的高低,從TX發出。

1、輪詢模式配置、發送與接收

????輪詢模式時cpu會不斷檢測發送數據寄存器的數據是否已經發送到發送移位寄存器。直到把本次數據全部發完,或者超時。 CPU會一直處于忙碌狀態。

1.1、配置

在這里插入圖片描述

1.2、發送

char message[] = "hello world\r\n";
HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), 1000);

1.3、接收

uint8_t rxbuf[1];
HAL_UART_Receive(&huart1, rxbuf, 1, HAL_MAX_DELAY);

2、中斷模式

????采用中斷的串口發送接收模式,不會一直占用cpu。

2.1、配置

2.2、發送

????與輪詢的代碼區別就是在函數后加了-IT

char message[] = "hello world\r\n";
HAL_UART_Transmit_IT(&huart1, (uint8_t *)message, strlen(message));
HAL_Delay(1100);

2.3、接收

????中斷接收三字節數據:

HAL_UART_Receive_IT(&huart1, rxbuf, 3);

2.4、中斷接收串口命令控制小燈亮滅

????調用HAL_UART_Receive_IT(&huart1, rxbuf, 3)函數后,如果串口接收到3字節的數據后就會調用HAL_UART_RxCpltCallback表示數據接收完成,我們在這里解析數據,控制小燈亮滅即可。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Transmit_IT(&huart1, (uint8_t *)rxbuf, 3);if(rxbuf[0]=='A'){HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 1);}if(rxbuf[0]=='B'){HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0);}HAL_UART_Receive_IT(&huart1, rxbuf, 3);
}

3、串口的DMA模式

????DMA (Direct Memory Acess)模式可以減少cpu的負載,幫助cpu來搬運數據。

3.1 串口DMA配置

????點擊add按鈕添加即可
在這里插入圖片描述

3.2 DMA代碼

????DMA模式還是有中斷參與的(DMA傳輸完成中斷),代碼和普通中斷(串口接收完成中斷,串口發送完成中斷)模式的區別就是把IT改為DMA即可,如下,可以完成對小燈的控制:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Transmit_DMA(&huart1, (uint8_t *)rxbuf, 3);if(rxbuf[0]=='A'){HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 1);}if(rxbuf[0]=='B'){HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0);}HAL_UART_Receive_DMA(&huart1, rxbuf, 3);
}

在這里插入圖片描述

4、串口實現收發不定長數據

????該功能的實現主要依靠串口的空閑中斷,此中斷的觸發條件與接收的字節數無關,只有當RX引腳上無數據進入時,也就是串口從忙碌轉為空閑時才會觸發。
????所以我們可認為觸發空閑中斷時,一幀數據完成,在此中斷服務函數中編寫我們的代碼即可。
????這里HAL庫給我們提供了一個擴展函數:HAL_UARTEx_ReceiveToIdle_DMA可以幫我們實現接收不定長數據,當由忙碌到空閑時會觸發中斷進入HAL_UARTEx_RxEventCallback函數。

4.1、接收不定長數據代碼實現

????將接收到的數據再通過串口發送出來

HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rxbuf, 100);void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{HAL_UART_Transmit_DMA(&huart1, (uint8_t *)rxbuf, Size);HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rxbuf, 10);
}

在這里插入圖片描述

4.3、DMA傳輸過半中斷

????DMA傳輸過半中斷指的是當串口接收到指定最大長度的一半時也會觸發中斷導致進入HAL_UARTEx_RxEventCallback函數。上面沒出現這種情況是因為我們receive時設置的參數較大100,當該值設的較小時就會出現問題。
????關閉DMA傳輸過半中斷的函數是:__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715297.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715297.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715297.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式中匯編語言的基本實現

大家好,今天給大家分享,GNU匯編的語法。 第一:匯編簡介 GNU 匯編語法適用于所有的架構,并不是 ARM 獨享的,GNU 匯編由一系列的語句組成, 每行一條語句,每條語句有三個可選部分,如下…

小白學視覺 | 詳解遺傳算法 GA(Python實現代碼)

本文來源公眾號“小白學視覺”,僅用于學術分享,侵權刪,干貨滿滿。 原文鏈接:詳解遺傳算法 GA(Python實現代碼) 轉自:機器之心 英文:www.analyticsvidhya.com/blog/2017/07/introduc…

在線上傳解壓PHP文件代碼,壓縮/壓縮(網站一鍵打包)支持密碼登錄

在線上傳解壓PHP文件代碼,壓縮/壓縮(網站一鍵打包)支持密碼登錄 資源寶分享:www.httple.net 如果你沒有主機控制面板這個是最好選擇,不需要數據庫,上傳當控制面板使用,無需安裝任何擴展,安全高,…

重拾前端基礎知識:CSS

重拾前端基礎知識:CSS 前言選擇器簡單選擇器屬性選擇器組合選擇器 插入CSS內嵌樣式(Inline Style)內部樣式(Internal Style)外部樣式(External Style) 層疊顏色背景顏色文本顏色RGB 顏色HEX 顏色…

ESD管 uClamp3331ZA、AZ5A83-01B 、AZ8523-01B國產替代ESD0321CW

上海雷卯ESD二極管 ESD0321CW替代國外品牌型號uClamp3331ZA、AZ5A83-01B 、AZ8523-01B,參數對比如下: 判斷ESD二極管是否可以替代需注意的幾點: 1. VRWM 是否接近 2. 抗靜電能力是否接近; 3. VBR 是否接近; 4. IPP…

【小程序】首屏渲染優化

小程序首屏渲染優化對于提升用戶體驗以及減少用戶等待時間非常重要。下面我們來詳細解析小程序首屏渲染優化的相關技巧和方法,并結合代碼示例進行分析。 首先,我們需要了解小程序的渲染流程。小程序的渲染過程可以分為兩個階段:解析階段和布局…

Julia語言中的位運算符、賦值運算符、算術運算符

算術運算符 # 使用基本的賦值運算符 a 10 println("a 的初始值是: $a") # 使用加法賦值運算符 a 5 println("a 加上 5 后的值是: $a") # 使用減法賦值運算符 - a - 3 println("a 減去 3 后的值是: $a") # 使用乘法賦值運算符…

Mistral發布語言大模型Mistral Large;法國新星Mistral挑戰 OpenAI 霸主地位

🦉 AI新聞 🚀 Mistral發布語言大模型Mistral Large 摘要:Mistral Large 是 Mistral AI 公司最新發布的旗艦語言模型,具備頂尖水平的推理能力。它主要被設計用于處理復雜的多語言推理任務,比如文本理解、轉換和代碼生…

上位機圖像處理和嵌入式模塊部署(上、下位機通信的三個注意點)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】 如果最終部署在客戶現場的是一個嵌入式設備,那么上位機在做好了算法編輯和算法部署之后,很重要的一步就是處理上位機和下位…

beets,一個有趣的 Python 音樂信息管理工具!

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站AI學習網站。 目錄 前言 什么是Beet庫? 安裝Beet庫 使用Beet庫 Beet庫的功能特性 1. 多種音樂格式支持 2. 自動標簽識…

【學習筆記】數據結構與算法05:樹、層序遍歷、深度優先搜索、二叉搜索樹

知識出處:Hello算法:https://www.hello-algo.com/ 文章目錄 2.4 樹2.4.1 「二叉樹 binary tree」2.4.1.1 二叉樹基本操作2.4.1.2 二叉樹的常見類型「完美二叉樹 perfect binary tree」「完全二叉樹 complete binary tree」「完滿二叉樹 full binary tre…

H12-821_106

106.如圖所示,RTA的GEO/0/0、GEO/0/1接口分別連接部門1和2,其網段分別為10.1.2.0/24、10.1.3.0/24網段,為限制部門1和2之間的相互訪間,在RTA上部署traffic-filter,以下哪些部署方式是正確? A.配置ACL3000拒…

職場的過早優化

過早優化,指的是還沒弄清楚需求未來的變化的走向的時候,忽略了更重要的問題。 放在職業發展上:你在沒有積累足夠職場資源(眼界、能力、人脈等等),也沒有對職業發展形成清晰認知的時候,就過早地進…

【c++】構造函數(下)——初始化列表

Hello,everybody!構造函數的內容比較多,語法還有些復雜。我分成了兩篇文章進行講解,大家在看過構造函數(上)后再來看這篇文章更容易理解喲! 1.初始化列表的格式 類似這種格式,在初始化列表中第一行用冒號開頭,剩下的用…

力扣每日一題 使二叉樹所有路徑值相等的最小代價 滿二叉樹 貪心

Problem: 2673. 使二叉樹所有路徑值相等的最小代價 文章目錄 思路復雜度Code 思路 👨?🏫 靈神題解 復雜度 ? 時間復雜度: O ( n ) O(n) O(n) 🌎 空間復雜度: O ( 1 ) O(1) O(1) Code class Solution {public int minIncrements(int …

ai智能電銷機器人搭建需要注意什么?人工智能電話機器人源碼技術

電銷機器人的出現,讓越來越多的企業意識到了電銷機器人的好處,不僅提高了工作效率,也讓我們更省心,但我們在選擇電話機器人的時候應該注意看語音識別技術、看話術模板制造、還要看公司研制才能等。 一、電銷機器人的選擇要素 1、看…

拿金幣 藍橋杯ALGO1006 有一個N x N的方格,問如何走才能拿到最多的金幣

問題描述 有一個N x N的方格,每一個格子都有一些金幣,只要站在格子里就能拿到里面的金幣。你站在最左上角的格子里,每次可以從一個格子走到它右邊或下邊的格子里。請問如何走才能拿到最多的金幣。 輸入格式 第一行輸入一個正整數n。   以下n行描述該方格。金幣數保證是不超過…

Vue+SpringBoot打造無代碼動態表單系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 動態類型模塊2.2 動態文件模塊2.3 動態字段模塊2.4 動態值模塊 三、系統設計3.1 用例設計3.2 數據庫設計3.2.1 動態類型表3.2.2 動態文件表3.2.3 動態字段表3.2.4 動態值表 四、系統展示五、核心代碼5.1 查詢檔案類型5.…

通過vue實現左側樹狀右側的組件

隨著后臺管理項目的開發&#xff0c;左側樹狀&#xff0c;右側則為列表的需求越來越多&#xff0c;還有就是拆分該數組&#xff0c;只展示其中一個對象等需求。廢話不多說&#xff0c;直接上代碼 <template><div><el-row :gutter"20"><el-col …

(四)優化函數,學習速率與反向傳播算法--九五小龐

多層感知器 梯度下降算法 梯度的輸出向量表明了在每個位置損失函數增長最快的方向&#xff0c;可將它視為表示了在函數的每個位置向那個方向移動函數值可以增長。 曲線對應于損失函數。點表示權值的當前值&#xff0c;即現在所在的位置。梯度用箭頭表示&#xff0c;表明為了增…