【stm32】標準庫學習——USART串口

目錄

一、USART串口

1.串口參數及時序

2.USART簡介?

3.配置USART基本結構

4.初始化模板?

(1) 接收一個數據

(2) 發送一個數據


一、USART串口

1.串口參數及時序

  • 波特率:串口通信的速率
  • 起始位:標志一個數據幀的開始,固定為低電平
  • 數據位:數據幀的有效載荷,1為高電平,0為低電平,低位先行
  • 校驗位:用于數據驗證,根據數據位計算得來
  • 停止位:用于數據幀間隔,固定為高電平

本節展示串口收發的功能,通常使用波特率為9600,8位數據位,即無校驗位,停止位長度為1的時序。


2.USART簡介?

·USART (Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/異步收發器

·USART是STM32內部集成的硬件外設,可根據數據寄存器的一個字節數據自動生成數據幀時序,從TX引腳發送出去,也可自動接收RX引腳的數據幀時序,拼接為一個字節數據,存放在數據寄存器里

·自帶波特率發生器,最高達4.5Mbits/s

·可配置數據位長度(8/9)、停止位長度(0.5/1/1.5/2)

·可選校驗位(無校驗/奇校驗/偶校驗)

·支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN

·STM32F103C8T6 USART資源:USART1、USART2、USART3(USART1是APB2總線的設備,剩下的是APB1的設備)


3.配置USART基本結構


4.初始化模板?

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//把PA9配置為復用推挽輸出,供USART的TX使用
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//初始化PA10引腳
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//可選浮空或上拉輸入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化USART 9600波特率 無流控 無校驗 8位字長 1位停止位 選擇發送和接收模式
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate=9600;//波特率
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制
USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//串口模式
USART_InitStructure.USART_Parity=USART_Parity_No;//校驗位選擇無校驗
USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位長度
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字長選擇8位
USART_Init(USART1,&USART_InitStructure);//開啟RXNE標志位到NVIC的輸出
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//優先級分組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//中斷通道
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);USART_Cmd(USART1,ENABLE);

查看引腳定義表

可見USART1的TX和RX分別對應PA9和PA10引腳,初始化PA9時要配置成復用推挽輸出模式。

關于USART的結構體參數USART_Mode,需要接收或發送的哪一個功能就選哪一個,兩個都要就用“|”操作或起來。


(1) 接收一個數據

方法一:

模板里使用中斷觸發接收數據,首先開啟RXNE到中斷的通道,用USART_ITConfig函數,再配置NVIC優先級分組等參數;關于RXNE標志位

RXNE:讀數據寄存器非空(Read data register not empty)

  • 當RDR移位寄存器中的數據被轉移到USART DR寄存器中,該位被硬件置位。如果USART CR1寄存器中的RXNEIE為1,則產生中斷。對USARTDR的讀操作可以將該位清零。RXNE位也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。
  • 0:數據沒有收到:
  • 1:收到數據,可以讀出。

?有數據時會觸發中斷,中斷函數從啟動文件里找

中斷函數示例:

void USART1_IRQHandler(void)
{if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){//。。。要進行的操作USART_ClearITPendingBit(USART1,USART_IT_RXNE);//若讀出收到的數據,不用手動清零}
}

讀出數據用函數USART_ReceiveData,手冊里說讀DR硬件會自動清零標志位。

方法二:

在主函數里不斷判斷RXNE標志位,如果置1了,就說明收到數據了,那再調用ReceiveData,讀取DR寄存器就行了。

int main(void)
{OLED Init();serial Init();'while(1){if(USART GetFlagstatus (USART1 USART FLAG RXNE)==SET){RxData=USART ReceiveData(USART1);OLED ShowHexNum(l,1,RxData,2);}}
???????}


(2) 發送一個數據

發送數據用函數USART_SendData,發送完判斷一下TXE標志位即可

關于TXE標志位

  • TXE:發送數據寄存器空(Transmit data register empty)當TDR寄存器中的數據被硬件轉移到移位寄存器的時候,該位被硬件置位。如果USARTCR1寄存器中的TXEIE為1,則產生中斷。對USARTDR的寫操作,將該位清零。
  • 0:數據還沒有被轉移到移位寄存器
  • 1:數據已經被轉移到移位寄存器。

為1時標志可以繼續發了,和RXNE對應,為1時表示接收到了數據,可以讀了,以免繼續發數據被覆蓋了。?

發送數據代碼示例

//發送一個數據
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//TXE發送數據寄存器空標志位,為1即空//硬件會將標志位清零
}

見手冊描述,我們對DR進行讀操作,硬件會將標志位清零,所以這里不需要我們像收數據一樣手動清除標志位。?

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

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

相關文章

黑馬Day01-03集開始

03集 JSX jsx里面可以寫 表達式,表達式里面會返回一個值js語法的擴展,需要babel解析才能夠在瀏覽器運行 語法 使用花括號 {} ,在里面進行編寫jsx代碼04集 高頻場景 使用引號傳遞字符串 使用js變量 函數調用和方法調用 使用js對象.js自帶的一些對象或new出來的對象{&quo…

vue 路由學習

params 不能傳遞對象類型如 [ ]和{ } query傳參 總結: query傳參既可以通過name 和path 找到路由規則里的組件,所以為了統一避免非必要麻煩 無論是使用query傳參還是 params傳參 映射路由建議統一使用 name 進階 props的使用 備注:資料來自…

JDK安裝全攻略:開啟Java編程大門

目錄 一、安裝前準備1.1 確認系統類型1.2 檢查系統要求1.3 下載 JDK 安裝包 二、Windows 系統下 JDK 安裝步驟2.1 雙擊安裝包2.2 選擇安裝目錄2.3 完成安裝 三、Windows 系統環境變量配置3.1 打開環境變量設置3.2 配置 JAVA_HOME 變量3.3 配置 Path 變量3.4 驗證配置 四、Linux…

《P1253 扶蘇的問題》

題目描述 給定一個長度為 n 的序列 a,要求支持如下三個操作: 給定區間 [l,r],將區間內每個數都修改為 x。給定區間 [l,r],將區間內每個數都加上 x。給定區間 [l,r],求區間內的最大值。 輸入格式 第一行是兩個整數&…

09.【C語言學習筆記】指針(一)

目錄 1. 內存和地址 1.1 內存 1.2 究竟該如何理解編址 2. 指針變量和地址 2.1 取地址操作符(&) 2.2 指針變量和解引用操作符(*) 2.2.1 指針變量 2.2.2 如何拆解指針類型 2.2.3 解引用操作符 * 2.3 指針變量的大小…

Java中static關鍵字的作用與使用詳解

static是Java中一個非常重要的關鍵字,它可以用來修飾變量、方法、代碼塊和嵌套類。下面將從多個方面詳細解釋static的作用和使用方法。 一、static變量(類變量) 作用 static變量屬于類,而不是類的某個實例。所有實例共享同一個s…

HMLDM-UD100A 型工業激光測距儀通過modbusRTU 轉 profinet 網關輕松接入到西門子1200plc

HMLDM-UD100A 型工業激光測距儀通過modbusRTU 轉 profinet 網關輕松接入到西門子1200plc 在現代工業生產與自動化控制領域,精準的測量設備與高效的通信技術至關重要。HMLDM-UD100A 型工業激光測距儀憑借其高精度、穩定性強等優勢,廣泛應用于各類工業場景…

數據結構與算法:圖論——深度優先搜索dfs

深度優先搜索dfs 提到深度優先搜索(dfs),就不得不說和廣度優先搜索(bfs)有什么區別 根據搜索方式的不同,可以將圖的遍歷分為「深度優先搜索」和「廣度優先搜索」。 深度優先搜索:從某一頂點出…

數組題解——?合并區間【LeetCode】

56. 合并區間 排序: 將所有區間按起始位置 start 從小到大排序。這樣,重疊的區間會相鄰排列,方便后續合并。 合并: 初始化一個空列表 merged,用于存儲合并后的區間。遍歷排序后的區間列表: 如果 merged 為…

關于高精度和鏈表的詳細講解(從屬于GESP五級)

本章內容 高精度 鏈表 位數再多,只管穩穩進位,終會把答案寫滿。 一、高精度 1. 什么是高精度 ? 定義 “高精度整數”指不受 C 原生整型 (int / long long) 位寬限制,而用數組模擬任意位數的大整數。 ? 必要性 64 位 long long 僅能…

Python自動化框架選型指南:Selenium/Airflow/Celery該選誰?

在Python自動化領域,Selenium、Airflow和Celery是三個高頻出現的工具,但它們的定位和適用場景截然不同。許多開發者在技術選型時容易混淆它們的邊界,導致項目架構臃腫或功能不匹配。本文將通過對比分析,幫你明確不同場景下的最佳選擇。 一、框架定位與核心功能對比 框架核…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | DrinkWater(喝水記錄組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— DrinkWater組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> 語法結…

UAVAI-YOLO:無人機航拍圖像的小目標檢測模型

摘要 針對無人機航拍圖像目標檢測效果差的問題&#xff0c;提出改進的UAVAI-YOLO模型。首先&#xff0c;為使模型獲得更加豐富的語義信息&#xff0c;使用改進可變形卷積網絡&#xff08;deformable convolutional networks&#xff0c;DCN&#xff09;替換原骨干&#xff08…

Solidity 入門教程(一):Hello Web3,從一個字符串開始!

學習 Solidity 最好的方式&#xff0c;就是寫出你的第一個合約&#xff01;在本篇文章中&#xff0c;我們將用極簡的代碼&#xff0c;通過 Remix 平臺快速實現并運行一個 “Hello Web3!” 合約&#xff0c;正式邁入智能合約開發的大門。 一、什么是 Solidity&#xff1f; Sol…

串擾與包地

串擾與包地&#xff1a; 串擾與包地一直是業界非常關心的一個問題&#xff0c;圍繞著它們的爭論非常多&#xff0c;那到底是包地好 還是不包地好呢?高速先生嘗試著從理論和實際測試上來給大家做一個分析。 為了驗證它&#xff0c;高速先生做了以下幾種情況&#xff0c;如圖5-…

leetcode hot 100之:二叉樹的最近公共祖先

本來不打算寫的哈哈哈但是發現這一道遞歸我是有思路的&#xff01;&#xff01;自己能想到一些方向&#xff01;我真棒&#xff01;所以記錄一下哈哈哈 我的思路&#xff1a; 1、祖先一定是自身或往上找&#xff0c;所以如何逆著走呢&#xff1f; 2、3種情況&#xff1a; 有…

【VUE】某時間某空間占用情況效果展示,vue2+element ui實現。場景:會議室占用、教室占用等。

某時間某空間占用情況效果展示&#xff0c;vue2element ui實現。場景&#xff1a;會議室占用、教室占用等。 場景說明&#xff1a; 現在需要基于vue2和el-table實現每日會議室個時間點占用情況。 已知數據&#xff1a; 1、會議室數據&#xff08;名稱&#xff0c;id&#xff…

Git更換源方式記錄

本文首發地址&#xff1a;https://www.dawnsite.cn/archives/198.html 該方式前提是本地項目已關聯遠程倉庫&#xff0c;由于業務變更git地址改變 1. 移除本地已有遠程倉庫 git remote remove origin2. 添加新的遠程倉庫源 git remote add origin "clone地址"3.一步…

前端面試專欄-主流框架:12. Vue3響應式原理與API

&#x1f525; 歡迎來到前端面試通關指南專欄&#xff01;從js精講到框架到實戰&#xff0c;漸進系統化學習&#xff0c;堅持解鎖新技能&#xff0c;祝你輕松拿下心儀offer。 前端面試通關指南專欄主頁 前端面試專欄規劃詳情 Vue3響應式原理與API詳解 一、引言 Vue3作為Vue.j…

DAY 37 早停策略和模型權重的保存

早停策略 import torch.nn as nn import torch.optim as optim import time import matplotlib.pyplot as plt from tqdm import tqdm# Define the MLP model class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 nn.Linear(X_train.shape[1], 10)s…