UART編程

Q:為什么使用串口前要先在電腦上安裝CH340驅動?

中斷的作用?

環形buffer的作用?

static和valitate的作用

三種編程方式簡介

?

也可以通過DMA方式減小CPU資源的消耗

直接把數據在SRAM內存和UART模塊進行傳輸?,流程:

  • 把數據在DMA中配置好
  • 數據傳輸
  • 產生中斷,CPU介入

編程方式改進?

1、查詢方式對應的讀寫會存在時間延遲

比如接收:沒來得及保存RDR寄存器中接受到的數據時,RDR寄存器的值就已經被覆蓋;

2、中斷方式:事先在發送buffer中存好數據,使能發送空中斷;把接受的數據存入buffer

發送

  • char tx_buf[100];存數據
  • enable TXE
  • TXE_ISR:中斷來取出數據發給TDR

接收

  • 使能RXNE(接收非空)
  • RXNE_ISR:利用中斷從RDR中取數據到緩沖區

3、用環形緩沖區改進中斷

4、用DMA方式減小CPU資源的消耗

一、查詢方式進行編程?

核心:判斷TDR和RDR寄存器的狀態

缺點:當接收時,若沒有來得及讀取數據,RDR中的值容易被覆蓋,進而丟失數據

實現:

  • 發送:先判斷發送寄存器是否為空(借助狀態寄存器中的TXE),若為空,往里面(DR)寫入數據,自己的存儲器地址++(pdata16bits++)
  • 接收:判斷RXNE是否收到數據(非空RXNE),若非空,讀取DR,存進自己的存儲器

?

二、官方中斷方式進行編程?

while(1){

調用HAL_UART_Transmit_IT使能中斷(中斷處理進行接收)14

等待中斷處理(接收)完畢

打印1(23)

}

核心:通過使能中斷,有字節就會

缺點:必須有函數及時調用HAL_UART_Transmit_IT,若未及時調用,數據也會丟失,實際場景中不會使用。。。。。所以HAL_UART_Transmit_IT沒有什么作用

步驟:cubeMX,選擇UART1串口,使能中斷

代碼邏輯:初始化串口時,同樣使能了中斷和設置了中斷的優先級;在中斷文檔中,增加了串口1 的中斷處理函數。(但只是使能串口1的中斷總開關,沒使能發送或接收中斷,中斷的管理還需要自己實現)

代碼實現:

  • 調用HAL_UART_Transmit_IT函數,使能中斷UART_IT_TXE,使能后就返回,并不處理數據(中斷UART_IT_TXE,把數據發給寄存器)
  • 在中斷處理函數中,若發送1000字節,則啟動999次TXE中斷和1次TC中斷(調用HAL_UART_TxCpltCallback)

在接收時,因打印比較耗時,若每及時的調用HAL_UART_Transmit_IT函數使能中斷,數據仍然會丟失

要發送數據時,使能“TXE”中斷(發送寄存器空中斷)。在 TXE 中斷處理函數里,從程序的發送 buffer 里取出一個數據,寫入 TDR;(TDR為空時:buffer---TDR---移位寄存器

對于接收數據,在一開始就使能“RXNE”中斷(接收寄存器非空)。這樣,UART 接收到一個數據就會觸發中斷,在中斷程序里讀取 RDR 得到數據,存入程序的接收 buffer。(RDR非空時:移位寄存器---RDR---buffer

和查詢相比:多了對事件的實時相應

TXE中斷:TDR中的數據放入移位寄存器

TC中斷:移位寄存器中的數據全部發送出去

二、中斷方式改造

使能接收中斷

初始化緩沖區

while(1){

HAL_UART_Transmit_IT;

circle_buf_read(&g_uart1_rx_bufs, pVal);

等待數據傳輸完畢;

}

不太懂!!!!

① 一開始就使能接收中斷
② 接收中斷處理函數里,把數據存入環形 buffer,并再次使能接收中斷

三、DMA方式進行編程?

優點:在數據傳輸的過程中不使用CPU的資源?

配置DMA,進而實現在UART串口的TDR,RDR寄存器芯片內存SRAM之間的直接數據傳輸。

當指定目標數量的數據傳輸完成后才會產生中斷,進而讓CPU介入。

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

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

相關文章

玩家自行定制內存將古老的386 PC內存升級到64MB容量

比爾蓋茨曾說:“無論對誰來說,640K內存都足夠了。” 如果你是一個還停留在 30 針 SIMM 時代的老式電腦愛好者,那么你的內存升級選擇是相當有限的。不過,YouTube 上的一個頻道已經展示了如何將古老的 386 系統內存升級到令人"…

【AI應用探討】—對抗學習(AL)應用場景

目錄 一、圖像領域 二、自然語言處理(NLP) 三、安全領域 四、其他領域 五、醫療健康領域 六、游戲與娛樂領域 七、機器人與自動化領域 八、科研與教育領域 九、物聯網與邊緣計算 十、金融科技 十一、能源與環境 十二、社會科學與人文研究 十…

Linux內核編譯安裝 - Deepin,Debian系

為什么要自己編譯內核 優點 定制化:你可以根據自己的硬件和需求配置內核,去掉不必要的模塊,優化性能。性能優化:移除不需要的驅動程序和特性,減小內核體積,提高系統性能。最新特性和修復:獲取…

什么是開放最短路徑優先(OSPF)

OSPF是一種典型的鏈路狀態路由協議,一般在同一個路由域中使用。這里的路由域指的是一個自治系統(AS),是指一組通過統一的路由策略或協議相互交換路由信息的網絡。在這個自治系統(AS)中,所有的OS…

【Leetcode】最小數字游戲

你有一個下標從 0 開始、長度為 偶數 的整數數組 nums ,同時還有一個空數組 arr 。Alice 和 Bob 決定玩一個游戲,游戲中每一輪 Alice 和 Bob 都會各自執行一次操作。游戲規則如下: 每一輪,Alice 先從 nums 中移除一個 最小 元素&…

等保測評是做什么的

等保測評的定義和目的 等保測評,全稱為信息安全等級保護測評,是依據國家信息安全等級保護規范規定,由具有資質的測評機構對信息系統安全等級保護狀況進行檢測評估的活動。等保測評的目的是驗證網絡系統或應用是否滿足相應的安全保護等級要求…

【Linux】System V消息隊列 System V信號量

👦個人主頁:Weraphael ?🏻作者簡介:目前正在學習c和算法 ??專欄:Linux 🐋 希望大家多多支持,咱一起進步!😁 如果文章有啥瑕疵,希望大佬指點一二 如果文章對…

前端 JS 經典:小數運算不精確

原因:計算機對小數的存儲是二進制的,有限位數的二進制做算法得到的是有限位數,無限位數的二進制做運算,得到的是無限位數。 如下:0.5 和 0.25 轉二進制是有限位數,0.3 和 0.2 轉二進制是無限位數。 (0.5)…

Spark調度底層執行原理詳解(第35天)

系列文章目錄 一、Spark應用程序啟動與資源申請 二、DAG(有向無環圖)的構建與劃分 三、Task的生成與調度 四、Task的執行與結果返回 五、監控與容錯 六、優化策略 文章目錄 系列文章目錄前言一、Spark應用程序啟動與資源申請1. SparkContext的創建2. 資…

力扣1111.有效括號的嵌套深度

力扣1111.有效括號的嵌套深度 棧模擬 對于每個括號求出深度 奇數深度存入A&#xff0c;偶數深度存入B這樣最大程度降低最大深度 class Solution {public:vector<int> maxDepthAfterSplit(string s) {//因為棧中只會存(的數量 所有用一個變量即可int d 0;vector<i…

Python | Leetcode Python題解之第233題數字1的個數

題目&#xff1a; 題解&#xff1a; class Solution:def countDigitOne(self, n: int) -> int:# mulk 表示 10^k# 在下面的代碼中&#xff0c;可以發現 k 并沒有被直接使用到&#xff08;都是使用 10^k&#xff09;# 但為了讓代碼看起來更加直觀&#xff0c;這里保留了 kk,…

C語言內存管理深度解析面試題及參考答案(2萬字長文)

在嵌入式面試時,C語言內存管理是必問面試題,也是難點,相關知識點可以參考: C語言內存管理深度解析??????? 下面整理了各種類型的C語言內存管理的面試題: 目錄 全局變量和局部變量在內存中分別存儲在哪個區域? 靜態變量和全局變量有什么區別? 什么是作用域?…

ORM Bee,如何使用Oracle的TO_DATE函數?

ORM Bee,如何使用Oracle的TO_DATE函數? 在Bee V2.4.0,可以這樣使用: LocaldatetimeTable selectBeannew LocaldatetimeTable();Condition conditionBF.getCondition();condition.op("localdatetime", Op.ge, new TO_DATE("2024-07-08", "YYYY-MM-DD&…

如何選擇適合的分布式鎖技術

1. Redis鎖 優勢&#xff1a; 性能高&#xff1a;Redis作為內存數據庫&#xff0c;讀寫速度非常快&#xff0c;因此Redis鎖在性能上表現優異。 實現方便&#xff1a;Redis提供了豐富的命令集&#xff0c;可以方便地實現分布式鎖的邏輯。 劣勢&#xff1a; 可靠性&#xff1a…

Excel第31享:基于left函數的截取式數據裂變

1、需求描述 如下圖所示&#xff0c;在“Excel第30享”中統計2022年YTD各個人員的“上班工時&#xff08;a2&#xff09;”&#xff0c;需要基于工時明細表里的“日期”字段建立輔助列&#xff0c;生成“年份”字段&#xff0c;本文說明“年份”字段是怎么裂變而來的。 下圖為…

systemverilog的關聯數組

關聯數組定義 在 SystemVerilog 中&#xff0c;關聯數組&#xff08;Associative Arrays&#xff09;是一種非常靈活的數據結構&#xff0c;它可以使用任意類型的鍵&#xff08;key&#xff09;來索引數組中的元素。這使得關聯數組特別適合于實現類似哈希表&#xff08;hash t…

圖像處理:使用 OpenCV-Python 卡通化你的圖像(2)

一、說明 在圖像處理領域&#xff0c;將圖像卡通化是一種新趨勢。人們使用不同的應用程序將他們的圖像轉換為卡通圖像。如今&#xff0c;玩弄圖像是許多人的愛好。人們通常會點擊圖片并添加濾鏡或使用不同的東西自定義圖像并將其發布到社交媒體上。但我們是程序員&#xff0c;…

后端老鳥的前端初探:心得與領悟20240713

&#x1f389; 后端老鳥的前端初探&#xff1a;心得與領悟 &#x1f680; 作為一名深耕后端多年的開發者&#xff0c;我最近踏上了前端探索的征程。這段跨界之旅讓我有了許多深刻的心得與領悟&#xff0c;現在我想和大家細細分享&#xff1a; 前端技術的飛速更新 &#x1f68…

godis源碼分析——Redis協議解析器

前言 redis這個目錄下的所有代碼就是為了一個事情&#xff0c;就是適配redis。 流程 redis下的基本流程 源碼 在redis/client/client.go 主要是客戶端處理 package clientconst (created iotarunningclosed )type B struct {data chan stringticker *time.Ticker }// …

Docker安裝RabbitMQ(帶web管理端)

1.拉取帶web管理的鏡像 可以拉取rabbitmq對應版本的web管理端&#xff0c;比如&#xff1a;rabbitmq:3.9.11-management&#xff0c;也可以直接拉取帶web管理端的最新版本 rabbitmq:management. docker pull rabbitmq:3.9.11-management 注意&#xff1a;如果docker pull ra…