STM32-USART串口配置教程和printf函數實現(寄存器版)

本章概述思維導圖


通信介紹

通信介紹概況

通信,至少是需要兩個對象,一個收一個發數據。

根據數據通信的傳輸時序協調方式,可分為:同步通信和異步通信;

根據數據通信的傳輸線路可分為:串行通信和并行通信;

根據數據通信的傳輸方向性及雙向交互能力可分為:單工通信和雙工通信(半雙工通信和全雙工通信)

同步通信和異步通信定義

同步通信:發送方與接收方通過共享時鐘線的時鐘信號,確保數據按固定時間間隔傳輸,接收方能準確預測數據到達時間;

異步通信:發送方與接收方無共享時鐘線,通過數據包或數據幀格式(如起始信號/停止位)協調傳輸數據;

同步和異步的區別:同步通訊需要有時鐘信號控制,通過時鐘線的高低電平控制數據的收發;異步通信沒有時鐘信號控制,通過數據幀格式控制數據的收發(大家約定好通信速度(波特率));

小心得:就是一個有時鐘線提供時鐘時序,一個沒有時鐘線;

串行通信和并行通信定義

串行通信:數據按位順序傳輸,使用單條線路進行數據得傳輸。例如,發送字節?10110010?時,先傳?1,再傳?0,以此類推。

并行通信:數據的多個位(通常8位、16位等)同時通過多條線獨立線路并行傳輸。如傳輸字節?10110010,會使用8根數據線,每根線同時傳1位。

串行和并行的區別;

串行通信指同一時刻,只能收或發一個bit位信息,因此只用一根數據信號線即可;并行通信指同一時刻,可以收或發多個bit位信息,因此需要多根數據信號線才行;

單工和半雙工、全雙工定義

單工通信:數據僅能沿固定方向單向傳輸,發送端與接收端角色不可互換。

應用場景:廣播系統(電臺→聽眾、衛星數據下行)、傳感器網絡(如溫濕度傳感器→數據中心)等;

半雙工通信:同一信道分時復用,雙方交替發送和接收;

應用場景:對講機、傳統Wi-Fi;

全雙工通信:雙方可同時發送和接收數據;

應用場景:電話通話、以太網交換機等;

單工和半雙工、全雙工的區別:

單工通信:單工要么收要么發,只能做接收設備或者發送設備。接收器不能發送數據給 ?發送器。例如:收音機;?

半雙工通信:雙發都可以發送數據,雙方不能同時發送數據或接收數據;只有一根發送/接收數據信號線。(特點:可以收可以發,但是不能同時收發)例如:對講機;?

全雙工通信:雙方可以同時發送或者接收數據;有兩根發送/接收數據信號線;(特點:可以同時即發送又接收數據)例如:手機

USART串口通信

串口(USART)通訊:異步通訊、全雙工、串行通訊、總線協議;

USART通用同步異步收發器,是一種通用的串行、異步/同步通信總線。該總線有兩條數據信號線,可以實現全雙工的發送和接收;

波特率:用于描述USART串口通信時的通信速度,其單位(bps)即每秒鐘傳送的位(bit) 的數量

上位機:就是連接串口的電腦或者手機上的APP軟件;是在自動化控制系統中,用于監控 和控制下位機(如單片機、PLC等)的計算機。它可以直接發送操作指令給下位機, 并接收下位機的反饋數據,通過用戶操作交互界面向用戶展示數據。

USART采用幀格式從低位開始發送數據——>高位

串口通信是不允許連續發送,避免累積誤差。所以發送完一字節數據后就得停止重新發送;

USART1串口1電路原理圖

1. 分析原理圖,查看對應引腳

分析原理圖這是串口USART1實現下載程序功能

我們不能隨意配置USART1的引腳,要根據STM32F103X引腳定義手冊來查看USART1配置的引腳;

TXD發送數據腳--->PA10(數據接收腳)

RXD接收數據腳--->PA9 (數據發送腳)

串口屬于自行控制數據的收發,所以我們應設置GPIO引腳模式為復用模式;

發送對接收;PA10設置為復用輸入模式,PA9設置為復用輸出模式;

2. 配置串口1(USART1)模塊初始化函數

配置USART1串口初始化函數步驟:

1. 開時鐘

2. 對串口1模塊開啟復位時鐘,在取消復位;

3. 配置GPIO模式

4.?通過在USART_CR1寄存器上置位UE位來激活USART

5.?編程USART_CR1的M位來定義字長。

6.?在USART_CR2中編程停止位的位數。

7.?利用USART_BRR寄存器選擇要求的波特率。

8.?設置USART_CR1中的TE位,發送一個空閑幀作為第一次數據發送。

9.?設置USART_CR1的RE位。激活接收器,使它開始尋找起始位。

代碼示例:

#include "USART1.h"
/*USART1串口初始化函數形參bps——>保持通信的波特率PA10設置為輸入模式,PA9設置為復用輸出模式;
*/
void USART1_Init(u32 bps)
{
//  1. 開時鐘RCC->APB2ENR|=1<<2;//開啟PA時鐘;RCC->APB2ENR|=1<<14;//開啟USART1時鐘
//  2. 對串口1模塊開啟復位時鐘,在取消復位;RCC->APB2RSTR|=1<<14;//開啟USART1復位時鐘,復位這一步可以省略配置USART1步驟RCC->APB2RSTR&=~(1<<14);//取消復位時鐘,關閉復位
//  3. 配置GPIO模式GPIOA->CRH&=0xfffff00f;//清空PA10、PA9引腳模式GPIOA->CRH|=0x000008b0;//PA10輸入PA9輸出
//  4.通過在USART_CR1寄存器上置位UE位來激活USARTUSART1->CR1|=1<<13;
//  5.編程USART_CR1的M位來定義字長。USART1->CR1&=~(1<<12);
//  6.在USART_CR2中編程停止位的位數。USART1->CR2&=~(0x3<<12);
//  7.利用USART_BRR寄存器選擇要求的波特率。USART1->BRR=72000000/bps;
//  8.設置USART_CR1中的TE位,發送一個空閑幀作為第一次數據發送。USART1->CR1|=1<<3;
//  9.設置USART_CR1的RE位。激活接收器,使它開始尋找起始位。USART1->CR1|=1<<2;
}

3. USART1串口底層發送數據函數

USART1串口數據發送函數(以數據幀格式發送):

配置步驟:

1.把發送的數據放入到USART_DR數據寄存器

2.判斷USART_SR狀態寄存器的TXE(發送數據寄存器空)位數據是否發送完成

代碼示例:

/*USART1串口底層數據發送函數形參:temp——>發送的數據
*/
void USART1_TX(u8 *temp)
{while(*temp){USART1->DR=*temp++;while(&(USART1->SR&1<<7)){}}
}

測試USART1串口初始化函數和USART1串口底層發送函數

代碼示例:

#include "LED.h"
#include "Delay.h"
#include "SYSTICK.h"
#include "BEEP.h"
#include "KEY.h"
#include "USART1.h"
int main()
{LED_Init();//LED燈初始化函數BEEP_Init();//蜂鳴器初始化函數KEY_Init();//按鍵初始化函數USART1_Init(115200);//USART1串口1初始化函數USART1_TX((u8 *)"串口1初始化完成\n");//發送"串口1初始化完成"這句話while(1){}
}

測試結果:

4. 串口讀取/接收數據操作

操作步驟:

1. 首先判斷USART1_SR寄存器中RXNE(讀數據寄存器非空),置1表示收到數據,可以讀出。置0表示數據沒有收到;

2. 將收到數據返回給上位機終端顯示

代碼示例:

#include "LED.h"
#include "Delay.h"
#include "SYSTICK.h"
#include "BEEP.h"
#include "KEY.h"
#include "USART1.h"
int main()
{LED_Init();//LED燈初始化函數BEEP_Init();//蜂鳴器初始化函數KEY_Init();//按鍵初始化函數USART1_Init(115200);//USART1串口1初始化函數USART1_TX((u8 *)"串口1初始化完成\n");u8 dat=0;while(1){if(USART1->SR&1<<5){dat=USART1->DR;//讀取數據USART1->DR=dat;//將讀取的數據在上位機軟件顯示}}
}

上位機軟件發送數據給USART1串口判斷是否接收:

發送結果顯示:

5. printf( )打印函數使用USART1底層實現?

在我們以后項目開發過程中會遇到各種各樣的開發問題,使用printf( )函數可以讓我們快速方便的查找問題!解決問題!下面是利用串口1實現printf( )函數的底層實現;

配置步驟:

1.在<stdio.h>文件中查找函數fputc

2.創建printf( )打印函數

3.實現printf函數還需在keil v5中的魔法棒中第二個選項卡Target中勾選右上角的Use Micro LIB;

代碼示例:

/*printf函數底層接口實現形參:tx——發送的內容注意:不需要聲明喲!
*/
int fputc(int tx, FILE *stream)
{USART1->DR=tx;while(!(USART1->SR&1<<7)){}return tx;
}

第三步操作:

測試printf( )函數實現代碼示例:


#include "USART1.h"
#include "stdio.h"
int main()
{USART1_Init(115200);//USART1串口1初始化函數printf("大河向東流哇\n天上的星星參北斗哇\n嘿嘿 參北斗哇\n生死之交一碗酒哇\n說走咱就走哇\n你有我有全都有哇\n嘿嘿 全都有哇\n");while(1){}
}

測試結果

6. 顯示USART1接收到的數據

代碼示例:

#include "stm32f10x.h"
#include "Delay.h"
#include "USART.h"
#include <stdio.h>int main()
{USART1_Init(115200);//串口1初始化函數USART1_TX((u8 *)"串口1初始化成功\n");u8 dat;	//讀取數據	u8 buffer[100];//接收數據的數組 	u8 cnt=0;//下標while(1){if(USART1->SR&1<<5){dat=USART1->DR;//讀取數據buffer[cnt]=dat;//將讀取的數據放入到數組中if(dat == '\n'){buffer[cnt-1]='\0';//上位機軟件設置時以\r\n結尾。手動把\r改成數組結束標準符printf("buf=%s;\tcnt=%d\n",buffer,cnt);cnt=0;}else cnt++;}}
}

制作不易!喜歡的小伙伴給個小贊贊!喜歡我的小伙伴可以點關注!有不懂的地方和需要的資源隨時問我喲!

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

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

相關文章

4種靈活的方法從POCO手機中刪除聯系人

許多POCO用戶經常需要清理聯系人列表&#xff0c;刪除重復或過時的條目&#xff0c;或者在出售或贈送手機之前刪除個人或敏感聯系人。無論是為了隱私、組織管理&#xff0c;還是僅僅是為了管理存儲空間&#xff0c;高效地刪除POCO手機中的聯系人是至關重要的。本文將介紹4種智能…

航段導航計算機 (Segment_Navigator) 設計與實現

航段導航計算機 (Segment_Navigator) 設計與實現 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家&#xff0c;覺得好請收藏。點擊跳轉到網站。 1. 引言 航段導航計算機是現代航空電子系統中的關鍵組件&a…

input.1是onnx輸入的名稱,但是依然警告不是

導出動態軸的時候發現&#xff0c;明明input.1就是onnx的名字&#xff0c;但是依然有警告說不是&#xff1b;/miniconda3/envs/py38/lib/python3.8/site-packages/torch/onnx/utils.py:2078: UserWarning: Provided key input.1 for dynamic axes is not a valid input/output …

生成式人工智能展望報告-歐盟-02-技術方面

原文地址 摘要 本章的重點是GenAI的技術層面&#xff0c;首先是對其能力和局限性的評估。它強調了部署GenAI系統所帶來的網絡安全挑戰。會議討論了新出現的技術趨勢&#xff0c;為決策者和利益攸關方提供了前瞻性的視角。關鍵問題包括確保GenAI應用程序的安全性和可靠性所需的…

人工智能與云計算雙輪驅動:元宇宙如何重構全球產業生態

一、人工智能在元宇宙中的核心應用1. 內容生成與虛擬世界構建生成式AI&#xff08;AIGC&#xff09;&#xff1a;通過AI算法自動生成3D模型、虛擬場景和角色&#xff0c;顯著降低內容制作成本和時間。例如&#xff1a;聯想晨星元宇宙平臺&#xff1a;利用AIGC技術實現低成本、高…

企業信息管理系統開發實戰:基于 Spring Boot+MyBatis+Thymeleaf

引言&#xff1a;企業信息管理系統的核心價值在企業日常運營中&#xff0c;高效的信息管理是提升效率的關鍵。本文將手把手教你開發一套企業信息管理系統&#xff0c;涵蓋用戶登錄、信息增刪改查、權限控制等核心功能。系統采用 Spring Boot 作為后端框架&#xff0c;MyBatis 處…

NLP自然語言處理的一些疑點整理

PyTorch評估模式&#xff08;torch.no_grad和model.eval&#xff09;差異在PyTorch中&#xff0c;model.eval()和torch.no_grad()是模型評估和推理階段的兩個關鍵工具&#xff0c;它們各自扮演著不同的角色&#xff0c;但常常被一起使用以確保模型行為的正確性和計算效率。理解…

物流倉儲自動化升級:Modbus TCP與DeviceNet的協議融合實踐

一、項目背景在我們物流廠的日常運營中&#xff0c;分揀效率和倉儲精準度一直是瓶頸。傳統人工分揀不僅速度慢&#xff0c;還容易因疲勞出錯&#xff1b;倉儲區域的貨物定位全靠人工記錄&#xff0c;時常出現找貨難、盤點耗時的問題。生產線的核心控制依賴施耐德PLC&#xff0c…

產品動態 | 同創永益IStorM Chaos 混沌工程平臺V4.0震撼發布:智能驅動,筑牢系統穩定性防線

當混沌工程從試點走向企業級大規模推廣&#xff0c;標準化缺失、專家依賴高、實施效率低等痛點成為阻礙系統穩定性升級的 “攔路虎”。此刻&#xff0c;同創永益重磅推出IStorM Chaos 混沌工程平臺 V4.0&#xff0c;以智能技術為核心驅動力&#xff0c;為企業構建更高效、更靈活…

C++中的反向迭代器

C中的反向迭代器 為啥反向迭代器的講解要單獨拎出來講&#xff0c;沒有在講各個容器的時候順手講了呢&#xff1f; 主要是因為c中的反向迭代器和正向迭代器的實現不太一樣。 它思想不復雜&#xff0c;主要是巧。來&#xff0c;我們按照我們剛剛的想法把代碼寫出來 #pragma once…

【一步步ai】數據增強與預處理

提升NL2SQL系統性能是一個復雜的多維度優化問題&#xff0c;涉及數據工程、模型架構、訓練策略和評估方法等多個層面。以下是一些有效的提升方向和具體方法&#xff1a; 一、數據增強與預處理 多樣化數據生成 模板擴展&#xff1a;基于SQL語法模板自動生成多樣化的NL-SQL對&am…

站在哪個肩膀上開始學習卡爾曼濾波

站在哪個肩膀上開始學習卡爾曼濾波前言從自適應濾波的角度正交性原理到維納解kalman濾波的提出innovation process新息過程kalman濾波算法Kalman 自適應濾波器算法初始條件輸入觀測向量過程已知參數計算&#xff1a;n1&#xff0c;2&#xff0c;3&#xff0c;..參考前言 不知道…

什么是FCR,如何提升FCR?

? FCR&#xff08;First Call Resolution&#xff0c;首次呼叫解決率&#xff09;&#xff0c;意思是指客戶首次聯系客服時&#xff0c;問題在單次交互中被完全解決的比率。? ?FCR &#xff08;首次解決的通話量 / 總首次通話量&#xff09; 100%一、關鍵要點&…

【瀏覽器插件沖突】Edge瀏覽器加載不出來CSDN創作者中心

【瀏覽器插件沖突】Edge瀏覽器加載不出來CSDN創作者中心寫在最前面報錯GPT的全部回復&#xff0c;可以參考&#x1f50d; 具體錯誤解釋&#xff1a;1. **CORS錯誤**2. **XHR 請求失敗**3. **ReaderArticleFinder / Readability**&#x1f6e0;? 為什么頁面沒有內容顯示&#x…

從零開發Java坦克大戰:架構設計與難點突破 (下)

6. 游戲引擎類:6.1 完整源碼展示: import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.HashSet; import java.util.Random; import java.util.Set;public class Gam…

Git下載與安裝全攻略

引言 Git是當今最流行的分布式版本控制系統&#xff0c;由Linus Torvalds于2005年創建。它幫助開發者高效管理代碼變更&#xff0c;支持多人協作開發&#xff0c;是現代軟件開發不可或缺的工具。無論是個人項目還是團隊協作&#xff0c;Git都能提供強大的版本控制功能。 本文…

【Elasticsearch】快照生命周期管理 SLM(理論篇)

《Elasticsearch 集群》系列&#xff0c;共包含以下文章&#xff1a; 1?? 冷熱集群架構2?? 合適的鍋炒合適的菜&#xff1a;性能與成本平衡原理公式解析3?? ILM&#xff08;Index Lifecycle Management&#xff09;策略詳解4?? Elasticsearch 跨機房部署5?? 快照與恢…

深入理解 UDP 協議:從原理到實戰的技術解析

UDP&#xff08;User Datagram Protocol&#xff0c;用戶數據報協議&#xff09;作為 TCP 的 "輕量型伙伴"&#xff0c;在實時通信、流媒體傳輸等場景中發揮著不可替代的作用。與 TCP 的可靠傳輸不同&#xff0c;UDP 以 "簡單、快速、無連接" 為設計理念&a…

c語言-數據結構-沿順相同樹解決對稱二叉樹問題的兩種思路

二叉樹OJ前言對稱二叉樹前言 本篇繼續講解二叉樹OJ題目之對稱二叉樹 對稱二叉樹 題目鏈接&#xff1a;https://leetcode.cn/problems/symmetric-tree/description/ 該題要求比較這棵樹是否對稱&#xff0c;對稱&#xff0c;指的是結構對稱并且值也要對稱&#xff0c;即對應…

云原生可觀測-日志觀測(Loki)最佳實踐

一、Loki 簡介 云原生可觀測三大支柱 支柱工具用途MetricsPrometheus性能趨勢、系統負載LogsLoki原始事件記錄、錯誤診斷TracesTempo / Jaeger分布式鏈路追蹤 一、Loki 簡介 1.1 Loki 是什么 Loki 是由 Grafana Labs 開發的 日志聚合系統&#xff0c;與 Prometheus 架構一…