USART串口通信(stm32)

一、串口通信

通信的目的:將一個設備的數據傳送到另一個設備,擴展硬件系統

通信協議:制定通信的規則,通信雙方按照協議規則進行數據收發

STM32F103C8T6 USART資源: USART1、 USART2、 USART3

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

可配置數據位長度(8/9)、停止位長度(0.5/1/1.5/2 -->一般都是一個停止位)??

可選校驗位(無校驗/奇校驗/偶校驗-->一般不用)

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

支持同步模式(多一個輸出時鐘,之后變成同步通信--->一般不用)、硬件流控制(多一條硬件的線,如果接收方準備好接收則硬件線就置高電平,否則置低電平,這樣就不會導致對方發送數據過快,沒有處理的數據被覆蓋-->一般不用硬件流方式)、DMA、智能卡、IrDA、LIN

二、接線規則

簡單雙向串口通信有兩根通信線(發送端TX和接收端RX) ,TX與RX要交叉連接 ,當只需單向的數據傳輸時,可以只接一根通信線 當電平標準不一致時,需要加電平轉換芯片。

三、串口參數、時序

波特率:串口通信的速率(例如:1Mbps,則1S傳輸1000位數據)

起始位:標志一個數據幀的開始,固定為低電平(空閑時是高電平)

數據位:數據幀的有效載荷,1為高電平,0為低電平,低位先行

校驗位:用于數據驗證,根據數據位計算得來(例如:奇校驗->包括校驗位的9個數據中的1要為奇數(1110 1110 1),偶校驗->包括校驗位的9個數據位中的1要為偶數(1100 1100 0))

停止位:用于數據幀間隔,固定為高電平(0.5/1/1.5/2)

停止位:用于數據幀間隔,固定為高電平(0.5/1/1.5/2)

四、數據發送和接收、寄存器、引腳圖

發送數據寄存器(TDR)和接收數據寄存器(RDR)占用同一個地址,在程序中表現出來的只有一個DR寄存器,寫的時候從TDR寫進去,讀的時候從RDR讀。

發送移位數據寄存器:把數據一位一位的移出去

? ? ? ? ? ? ? ? 例發送:給TDR寫入一個0X55(0101 0101)數據,此時硬件檢測到寫入數據了(數據在發送數據寄存器),就會檢查移位寄存器是否有別的數據在移位,如果沒有0x55就會整體全部進入移位數據寄存器,當數據從TDR數據寄存器進入移位寄存器時,會置一個TXE(TX Empty發送數據寄存器空)的標志位,如果標志位是1,則說明發送數據寄存器為空,可以向發送數據寄存器繼續寫入數據。移位數據寄存器有數據時,在發送控制器的驅動下,將數據發送到TX。移位數據寄存器為空時TC標志位置1;(低位先行)

? ? ? ? ? ? ? ? 例接收:RX有數據時在接收控制器的驅動下將數據一位一位的移動到移位寄存器,當移位寄存器收滿一個字節時,就會將數據整體一下子全部轉移到數據寄存器(RDR),接收移位寄存器是從高位往低位的方向移動(高位先行)。當RXNE置1是說明接收數據寄存器有數據

五、代碼

#include "usart.h"
#include "stm32f10x.h"void usart_init(void)
{GPIO_InitTypeDef gpioInit;			//定義配置GPIO的結構體USART_InitTypeDef usartInit;		//定義配置串口的結構體NVIC_InitTypeDef NVICInit;		    //定義配置中斷控制的結構體
//1.配置時鐘:  GPIO口的時鐘,串口的時鐘, 引腳復用的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//USART 中斷的配置//2.配置GPIO的結構體//配置PA9(TX)gpioInit.GPIO_Mode  = GPIO_Mode_AF_PP;gpioInit.GPIO_Pin   = GPIO_Pin_9;gpioInit.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA, &gpioInit);//配置PA10(rx)gpioInit.GPIO_Mode  = GPIO_Mode_IN_FLOATING;gpioInit.GPIO_Pin   = GPIO_Pin_10;GPIO_Init(GPIOA, &gpioInit);//3.配置串口的結構體usartInit.USART_BaudRate             = 115200;                 		  //配置波特率為9600usartInit.USART_HardwareFlowControl  = USART_HardwareFlowControl_None;//是否開啟硬件流控模式usartInit.USART_Mode				 = USART_Mode_Rx | USART_Mode_Tx; //設置模式為讀和寫方式usartInit.USART_Parity				 = USART_Parity_No;				  //設置奇偶校驗位為空usartInit.USART_StopBits			 = USART_StopBits_1;			  //設置停止為1usartInit.USART_WordLength			 = USART_WordLength_8b;			  //設置發送或者接收的幀數為八字節USART_Init(USART1, &usartInit);                                       //初始化串口的結構體USART_Cmd(USART1, ENABLE);											  //打開串口//配置NVIC中斷控制器
//	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVICInit.NVIC_IRQChannel = USART1_IRQn;NVICInit.NVIC_IRQChannelCmd = ENABLE;NVICInit.NVIC_IRQChannelPreemptionPriority = 1;NVICInit.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVICInit);}
//發送字符
void USARTSsendData(USART_TypeDef* USARTx, uint16_t Data)
{USART_SendData(USARTx,Data);  //等待發送數據寄存器中的數據被取走while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);//等待高電平,數據發送完是高電平
}//發送字符串,字符串所以數據都發送完之后才跳出中斷
void USARTSsendStr(USART_TypeDef* USARTx, char *str)
{uint16_t i = 0;do{USARTSsendData(USARTx, *(str+i));i++;}while(*(str+i) != '\0');//等待發送移位寄存器(為空)while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);//等待高電平,數據發送完是高電平}
//USART_FLAG_TC就是用來標志,發送移位寄存器中的數據有沒有全部發送出去
//其實USART_FLAG_TXE就是用來標志一個事件的,通過它的值可以知道該事件有沒有發生(即發送數據寄存器中的數據有沒有被取走)。
//重定向輸出函數
int fputc(int ch,FILE *F)
{USART_SendData(USART1,(uint8_t) ch);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待高電平,數據發送完是高電平return ch;//內容是通過串口發送的,而不是這個返回值}//重定向輸入
int fgetc(FILE *F)
{while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待高電平,數據發送完是高電平return (int)USART_ReceiveData(USART1);						//高電平的時候,收到數據可以讀出數據,0是沒有數據}//void USART1_IRQHandler(void)
//{
//	char tmp; 
//	if(USART_GetITStatus(USART1, USART_IT_RXNE) ==SET )
//	{
//		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
//		tmp = USART_ReceiveData(USART1);
//		USART_SendData(USART2, tmp);
//		while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);//等待發送完成
//	}
//	
//}/*@arg USART_FLAG_CTS:  CTS Change flag (not available for UART4 and UART5) CTS標志位*     @arg USART_FLAG_LBD:  LIN Break detection flag							//LIN中斷檢測位
*     @arg USART_FLAG_TXE:  Transmit data register empty flag					//發送數據寄存器空標志位
*     @arg USART_FLAG_TC:   Transmission Complete flag						//發送完成空標志位*     @arg USART_FLAG_RXNE: Receive data register not empty flag			//接收數據寄存器非空標志位*     @arg USART_FLAG_IDLE: Idle Line detection flag						//空閑總線標志位*     @arg USART_FLAG_ORE:  OverRun Error flag							//溢出錯誤標志位*     @arg USART_FLAG_NE:   Noise Error flag								//噪聲錯誤標注位*     @arg USART_FLAG_FE:   Framing Error flag							//幀錯誤標志位*     @arg USART_FLAG_PE:   Parity Error flag								//奇偶錯誤標志位* @retval The new state of USART_FLAG (SET or RESET).
*/

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

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

相關文章

方正暢享全媒體新聞采編系統 binary.do SQL注入漏洞復現

0x01 產品簡介 方正暢享全媒體新聞生產系統是以內容資產為核心的智能化融合媒體業務平臺,融合了報、網、端、微、自媒體分發平臺等全渠道內容。該平臺由協調指揮調度、數據資源聚合、融合生產、全渠道發布、智能傳播分析、融合考核等多個平臺組成,貫穿新聞生產策、采、編、發…

【華三包過】2024年/華三H3C/云計算GB0-713

H3CNE-cloud-云計算-713 想轉行 想繼續深入 題庫覆蓋百分百,題庫有新版106道新版113道舊版88道 H3C認證云計算工程師(H3C Certified Network Engineer for Cloud,簡稱H3CNE-Cloud) 認證定位于全面掌握虛擬化技術原理及相關產品/…

半導體行業AI機器視覺的應用探討(3)-效益如何評估

作為半導體廠的IT經理,評估AI機器視覺帶來的經濟收益和管理收益是一個多維度的過程,需要綜合考慮成本節約、效率提升、質量改進等多個方面。以下是一個具體的評估方案: 1. 成本效益分析(CBA) **步驟**: - **初始投資成本**:列出所有與AI機器視覺系統相關的初始投資,包…

c++二進制輸出

輸入一個數&#xff0c;輸出n個數&#xff0c;數可以是0或1&#xff1b;輸入&#xff1a;4輸出&#xff1a;0010&#xff1b;提示&#xff1a;本題要用到rand(),srand(time(0));代碼如下&#xff1a;#include<bits/stdc.h> #include<windows.h> using namespace s…

MySQL的數據庫和表

查看數據庫 命令行的方式&#xff1a; cd /mysql/bin mysql.exe -uroot -p IP&#xff08;不是連接自己&#xff09; 端口&#xff08;不是3306&#xff09; show databases; 直接使用圖形化界面點擊&#xff1a; 查看庫里的表 使用命令行查看&#xff1a; 進入mysql數據庫 u…

JavaFX學習教程二

一、JavaFX 體系結構 JavaFX 場景圖(Scene Graph)是構建 JavaFX 應用程序的起點&#xff0c;一種樹狀數據結構&#xff0c;用于排列&#xff08;和分組&#xff09;圖形對象&#xff0c;以便于邏輯表示。 stage:舞臺&#xff0c;操作系統窗口的 JavaFX 表示&#xff0c;是所有…

Nodejs+Socket.io+Web端完成聊天

前言 源碼獲取:nodeexpresssocket.ioweb: 聊天demo (gitee.com) 目錄結構 后端依賴 啟動方式 前端是html正常啟動 后端是node app.js 后端app.js核心代碼 const express require(express) const app express() var http require(http).Server(app) var io require(so…

掌握C++回調:按值捕獲、按引用捕獲與弱引用

文章目錄 一、按引用捕獲和按值捕獲1.1 原理1.2 案例 二、弱引用2.1 原理2.2 案例一2.3 案例二&#xff1a;使用base庫的弱引用 三、總結 在C回調中&#xff0c;當使用Lambda表達式捕獲外部變量時&#xff0c;有兩種捕獲方式&#xff1a;按值捕獲和按引用捕獲。 一、按引用捕獲…

Matlab自學筆記三十:元胞數組的修改、添加、刪除和連接

1.說明 元胞數組的子數組或元素也是元胞型的&#xff0c;其元素內容&#xff08;值&#xff09;是本身類型&#xff0c;因此&#xff0c;在添、刪、改和連接處理時&#xff0c;必須明確每個元素的值的類型和大小&#xff0c;否則&#xff0c;編程報錯是不可避免的了。看本文前…

Python 點云裁剪

點云裁剪 一、介紹1.1 概念1.2 函數講解二、代碼示例2.1 代碼實現2.2 代碼講解三、結果示例一、介紹 1.1 概念 點云裁剪 :根據待裁剪對象的多邊形體積(json文件)實現點云的裁剪。 1.2 函數講解 下面代碼示例中主要用到了兩個函數。 讀取待裁剪對象的多邊形體積信息(json文…

淺談C++函數

目錄 一、函數的概念二、調用函數的兩個前提三、函數傳參的三種形式四、函數返回類型 一、函數的概念 函數是C程序的基本模塊&#xff0c;通常一個C程序由一個或多個函數組成。函數可以完成用戶指定的任務&#xff0c;一般分為庫函數和用戶自定義的函數。函數由函數頭和函數體…

先進制造aps專題六 aps軟件開發最大的難點,設備甘特圖開發

aps軟件開發最大的難點&#xff0c;設備甘特圖開發 一般認為&#xff0c;aps軟開發中&#xff0c;算法是難的&#xff0c;排程算法難&#xff0c;優化算法更難&#xff0c;但其實最大的難點是設備甘特圖開發 aps軟件設備甘特圖開發的幾個難點如下 1 和項目甘特圖一行顯示一個…

02. Flink 快速上手

02. Flink 快速上手 1、創建項目導入依賴 pom文件&#xff1a; <properties><flink.version>1.17.0</flink.version> </properties><dependency><groupId>org.apache.flink</groupId><artifactId>flink-streaming-java<…

k8s配置pods滾動發布

背景 采用微服務架構部署的應用&#xff0c;部署方式都要用到容器化部署k8s容器編排&#xff0c;最近我在公司負載的系統也是用的上述架構部署&#xff0c;但是隨著系統的運行&#xff0c;用戶提的需求就會越多&#xff0c;每次更新的話都要停機發布&#xff0c;最用戶側來說就…

【C語言刷題系列】求一個數組中兩個元素a和b的和最接近整數m

&#x1f493; 博客主頁&#xff1a;倔強的石頭的CSDN主頁 &#x1f4dd;Gitee主頁&#xff1a;倔強的石頭的gitee主頁 ? 文章專欄&#xff1a;C語言刷題系列 目錄 一、問題描述 二、解題思路 解題思路&#xff1a; 解題步驟: 三、C語言代碼實現及測試 一、問題描述 給定一…

指北者智能音樂學習機隆重亮相廣州國際樂器展

2024年5月23-26日廣州國際樂器展覽會在廣交會展館B區隆重開幕&#xff0c;本屆展會開設5大展廳、50000平方米的主題展區&#xff0c;吸引了700多家國內外參展商參展&#xff0c;打造集展示、商貿、文化交流、文娛于一體的廣闊平臺。深圳市指北科技有限公司也攜旗下品牌指北者智…

AWS云服務器每月費用高昂,如何優化達到節省目的?

AWS云服務器每月費用可能因不同的使用情況和配置而有所不同。為了優化并節省AWS云服務器的費用&#xff0c;aws的合作伙伴九河云提供了一些建議&#xff1a; &#xff08;1&#xff09;調整實例大小&#xff1a;確保你使用的實例大小與你的工作負載相匹配。實例的容量每增加一倍…

Gopeed的高級用法

Gopeed是一個開源全平臺下載器&#xff0c;具體簡介請參考&#xff1a; “狗屁下載器”&#xff1f;Gopeed - 開源全平臺下載器 (免費輕量 / 比 Aria2 好用 / 遠程下載) - 異次元軟件世界 (iplaysoft.com) 這里主要介紹下自己摸索出來的 Gopeed 的高級做法。 有的網站添加的…

時政|醫療結果互認

背景&#xff08;存在的問題&#xff09; 看同一種病&#xff0c;換一家醫院甚至換一個院區、換一個科室&#xff0c;檢查檢驗還得再來一遍&#xff0c;費錢又費時。開展檢查檢驗結果互認&#xff0c;可以明顯減輕患者就醫負擔。患者不用做重復檢查&#xff0c;也可節約就醫時…

基于JSP/Servlet校園二手交易平臺(二)

目錄 2 開發技術及開發環境 2.1 Java語言簡介 2.2 J2EE技術介紹 2.3 Servlet/JSP技術 2.4 MVC 簡介 2.5 Struts 技術 2.6 Hibernate 技術 2.6.1 應用程序的分層體系結構 2.6.2 Hibernate的應用及API簡介 2.7 開發環境及環境配置 2.7.1 Java/JSP系統環境 2.7.2 JSP環…