久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9334|回復: 0
收起左側

STM32F407串口USART配置詳細教程 附源程序

[復制鏈接]
ID:763998 發表于 2020-6-19 15:49 | 顯示全部樓層 |閱讀模式

USART的概述

2.1.1 什么是USART?USART的作用?

              USART:通用同步異步收發器。

              USART的作用:能夠靈活地與外部設備進行全雙工數據交換

2.1.2 USART的特征

<1> 全雙工異步通信

<2> 可配置為 16 倍過采樣或 8 倍過采樣

<3> 小數波特率發生器系統

<4> 數據字長度可編程( 8 位或 9 位)

<5> 停止位可配置 - 支持 1 或 2 個停止位

<6> 發送器和接收器具有單獨使能位

<7>傳輸檢測標志:

— 接收緩沖區已滿

— 發送緩沖區為空

— 傳輸結束標志

<8>十個具有標志位的中斷源:

— CTS 變化

— LIN 停止符號檢測

發送數據寄存器為空

發送完成

接收數據寄存器已滿

接收到線路空閑

— 溢出錯誤

— 幀錯誤

— 噪聲錯誤

— 奇偶校驗錯誤




      • USART功能描述

任何USART雙向通信均需要至少兩個引腳:

接收數據輸入引腳 (RX)

發送數據引腳輸出 (TX)

              正常 USART 模式下

                            發送或接收前保持空閑線路

                            起始位

                            數據(字長 8 位或 9 位),最低有效位在前

                            用于指示幀傳輸已完成的 0.5 個、 1 個、 1.5 個、 2 個停止位

              TX引腳在起始位工作期間處于低電平狀態。在停止位工作期間處于高電平狀態。

2.2 USART的框架

2.2.1發送數據過程

數據發送過程.png

放大后的各個部分:

GPIO部分:

映射部分:

USART部分:

2.2.2接收數據過程

數據接收過程.png

放大后的各個部分:

GPIO部分:

映射部分:

USART部分:

2.2.3 發送與接收過程解讀

GPIO要配為復用功能

復用與通用的區別:這里的外設就是USART

發送過程:

  • 內核把數據交給USART的發送數據寄存器(TDR
  • TDR通過并行總線,一次性寫入到發送移位寄存器中
  • 發送移位寄存器移位一位一位的傳輸數據,直到數據發送完畢。
  • 發送移位寄存器沒有數據時,TDR才把數據一次寫入。

接收過程:

  • 接收移位寄存器從外部獲取每一位數據
  • 當移位數據寄存器擠滿8位或9位數據時,通過并行總線,一次發送到接收數據寄存器(RDR
  • 只能等移位寄存器湊夠8位或9位數據時,才會把數據發送到RDR,內核此時才能讀取到正確的數據。

注意:

              發送數據寄存器(TDR)與接收數據寄存器(RDR)是兩個寄存器,寫代碼時只有DR,DR代表發送數據寄存器還是接收數據寄存器,取決于所在函數是接收還是發送。

2.2.4 USART映射解讀

查看原理圖,可知USART1的發送TX與接收RX對應引腳分別為PA9\PA10。

這也是M3默認的映射引腳。

與PA9與PA10可知我們選擇的復用寄存器是GPIOx_AFRH

由圖可知,

  • 配置PA9PA10為復用功能
  • 找引腳對應的復用功能寄存器,PA9\PA10對應AFRH寄存器
  • AFRH中找引腳對應控制位,PA9?AFRH9[3:0]PA10?AFRH10[3:0]
  • 通過映射圖可知,USART1對應的值為AF7
  • AF7寫入PA9\PA10對應控制位的位置

2.3 USART波特率的配置

2.3.1 配置波特率公式

              fCK看USART掛載的外設總線,可知84MHz

OVER8根據控制寄存器1的位15可知,默認采用16倍過采樣,OVER8=0

USARTDIV根據下面公式,算得:

2.3.2 實際配置波特率過程

《1》確定需要配置的波特率、采用默認過采用模式

《2》根據公式1,可求出USARTDIV

《3》USARTDIV是寫入到波特率寄存器 (USART_BRR)的浮點數,由于寄存器不能直接寫入浮點數,所以需要把整數和小數分開寫入到USART_BRR中。

《4》查看寄存器USART_BRR可知,12位控制整數,4位控制小數。

《5》USARTDIV的一個浮點數,進行強制轉換為整型,即可獲得它的整數部分DIV_Mantissa,最后通過USATRDIV公式,可算出小數部分DIV_Fraction。

《6》在寫入整數部分時,整數位要左移4位,因為從位4開始寫入整數部分,小數部分直接寫入。

2.4 軟件設計

2.4.1 USART配置流程

              《1》開GPIOA\USART1時鐘

              《2》配置GPIOA為復用推挽輸出

              《3》映射PA9與PA10到USART_TX\USART_RX

              《4》配置波特率

              《5》配置USART模塊

2.4.2 USART模塊配置

  • 使能發送器、接受器
  • 使能USATR
  • 其他位使用默認值。如:16倍過采樣、8位字長、1位停止位等

2.4.3 USAR1初始化函數

  1. /**********************************************************************
  2. *函數名:USART1_Init
  3. *功  能:串口初始化
  4. *參  數:波特率
  5. *返  回:無
  6. *備  注:
  7. PA9  -發送--USART1_TX
  8. PA10 -接受--USART1_RX
  9. 以芯片為對象,出去的叫發送,進來的叫接收
  10. **********************************************************************/
  11. void USART1_Init(int baud)
  12. {
  13.               float usartdiv;
  14.               u32 DIV_Mantissa,DIV_Fraction;
  15.               //1.開啟時鐘
  16.               RCC->APB2ENR |= 1<<4;              //開啟USART1時鐘                           
  17.               RCC->AHB1ENR |= 1<<0;              //開啟PA端口時鐘                                         
  18.               //2.配置GPIO
  19.               GPIOA->MODER &=~(3<<2*9);                            // 復用
  20.               GPIOA->MODER |= (2<<2*9);                           
  21.               GPIOA->MODER &=~(3<<2*10);            
  22.               GPIOA->MODER |= (2<<2*10);            
  23.               GPIOA->OTYPER &=~(1<<9);                            // 推挽
  24.               GPIOA->OTYPER &=~(1<<10);                           
  25.               GPIOA->OSPEEDR &=~(3<<2*9);              // 25M
  26.               GPIOA->OSPEEDR |=1<<2*9;                           
  27.               GPIOA->OSPEEDR &=~(3<<2*10);
  28.               GPIOA->OSPEEDR |=1<<2*10;                           
  29.               GPIOA->PUPDR &=~(3<<2*9);  // 無上下拉
  30.               GPIOA->PUPDR &=~(3<<2*10);
  31.               //3.端口映射
  32.               GPIOA->AFR[1] &=~(0xf<<4);            
  33.               GPIOA->AFR[1] |=(7<<4);                                         
  34.               GPIOA->AFR[1] &=~(0xf<<8);            
  35.               GPIOA->AFR[1] |=(7<<8);                                         
  36.               //4.設置波特率
  37.               usartdiv=84*1000000/(16.0*baud);
  38.               DIV_Mantissa=usartdiv;// 整數部分
  39.               DIV_Fraction=(usartdiv-DIV_Mantissa)*16;// 小數部分
  40.               USART1->BRR = DIV_Mantissa<<4|DIV_Fraction;                           
  41.               //5.配置USART1
  42.               USART1->CR1 |= 1<<2; // 接收使能
  43.               USART1->CR1 |= 1<<3; // 發送使能
  44.               USART1->CR1 |= 1<<13;// USART1使能
  45. 2.4.4 USART1發送與接收字節符函數
  46. /**********************************************************************
  47. *函數名:USART1_Send_Byte
  48. *功  能:發送數據給串口軟件
  49. *參  數:數據
  50. *返  回:無
  51. *備  注:
  52. 寄存器                            狀態                                                                                    位
  53. USART->SR              等待發送完成                             6,7
  54. **********************************************************************/
  55. void USART1_Send_Byte(u8 data)
  56. {
  57.               while(!(USART1->SR & 1<<6));//等待發送完成
  58.               USART1->DR = data;
  59. }
  60. /**********************************************************************
  61. *函數名:USART1_Receive_Byte
  62. *功  能:接收從串口軟件發送過來的數據
  63. *參  數:無
  64. *返  回:數據
  65. *備  注:
  66. 寄存器                            狀態                                                                                    位
  67. USART->SR              等待接收完成                             5
  68. **********************************************************************/
  69. u8 USART1_Receive_Byte(void)
  70. {
  71.               u8 data;
  72.               while(!(USART1->SR & 1<<5));//等待接收完成
  73.               data = USART1->DR;
  74.               return data;
  75. }
  76. 2.4.5 USART1發送與接收字符串函數
  77. /**********************************************************************
  78. *函數名:USART1_Send_String
  79. *功  能:發送字符串數據給串口軟件
  80. *參  數:字符串數據
  81. *返  回:無
  82. *備  注:
  83. 寄存器                            狀態                                                                                    位
  84. USART->SR              等待發送完成                             6,7
  85. **********************************************************************/
  86. void USART1_Send_String(u8 *data)
  87. {
  88.               while(*data != '\0')//是否字符串結束標志符
  89.               {
  90.                             USART1_Send_Byte(*data);
  91.                             data++;//指向下一個字符
  92.               }
  93. }
  94. u8 USART1_receiveBuf[128];
  95. /**********************************************************************
  96. *函數名:USART1_Receive_String
  97. *功  能:接收從串口軟件發送給內核發數據
  98. *參  數:緩沖區數組,存放數據
  99. *返  回:無
  100. *備  注:
  101. 寄存器                            狀態                                                                                    位
  102. USART->SR              等待接收完成                             5
  103. **********************************************************************/
  104. void USART1_Receive_String(void)
  105. {
  106.               static u8 i=0;
  107.               u8 data;
  108.               while(1)
  109.               {
  110.                             data = USART1_Receive_Byte();//接收一個字符
  111.                             if(data == '\n')
  112.                             {
  113.                                           USART1_receiveBuf[ i]='\0';//添加字符串結束標志符
  114.                                           i=0;//索引清零
  115.                                          return;
  116.                             }
  117.                             USART1_receiveBuf[i++] = data;//把字符存放在字符數組中
  118.               }
  119. }</i>
復制代碼

2.5 補充

2.5.1 問答

<1>串口是什么?有什么用?

串口是一種串行全雙通信接口,同步或異步收發數據,但一般我們只使用異步功能。

常用于與外部設備通信、交互信息。外部若有串口通信接口,就可以與單片機進行通信,如ESP8266模塊、RS485模塊等。


<2>同步與異步的理解?

同步與異步基于兩個設備討論:

同步:它們有共同的時鐘線,由時鐘線控制收發

異步:它們沒有公共的時鐘線,需要雙方配置一樣的波特率,保證收發的準確。


<3>串行與并行

串行:

只有一根線或兩個根數據線,一次只能收發一位數據。兩根線的設計是為了兩個設備能同時收發一位數據。

并行:

有多根數據線,一般是8的倍數,假設是8根數據線,一次可傳送一個字節(8位)的數據。


<4>單工、半雙工、全雙工

單共:

一方只能接收,另一方只能發送,從始至終發送方向不變,單方向固定。例如:廣播與收音機。廣播只能發出信號,收音機只能接收信號,兩者互換不能正常工作。

半雙工:

某一時間段,一方發送。另一方接收;另一個時間段,一方接收,另一方發送。雙方都可以發送和接收,但不能同時發送或接收。例如:對講機。

全雙工:

雙方可以都可以同時收發。例如:電話


<5>波特率是什么為什么要配置波特率?

              一秒鐘能傳輸的二級進制位數。假設9600代表1秒鐘可以一次傳輸9600位。即9.6Kbit。

              異步通信雙方需要有個約定,發送方以多少速度(波特率)發送數據過去(例如9600),接收方就必須以對應的速度(速度)接收,從而保證讀取到正確的數據。


<6>如何保證數據準確發送過去呢

              USART串口通信自帶有通信協議,一幀數據位10位或11位,常常使用10位作為一幀數據。

              一幀數據的構成:

  • 1個啟動位(低電平)
  • 數據幀(8位或9位,如果開啟奇偶校驗,最高位是奇偶檢驗位,位7或位8,但是一般不開啟)
  • 停止位(高電平,0.5位、1位、1.5位、2位,一般選1位停止位)
  • 綜上,一般串口一幀數據為10(1個啟動位、8個數據位、1個停止位)


<7>知識領悟

模塊學習心得:

  • 掌握基本概念
  • 理解并記住模塊的特性
  • 模塊框圖的工作流程,信號走向,邏輯(重點)
  • 看懂模塊的時序圖,理解其他相關知識
  • 會配置寄存器(即使上面的不是很理解,但是盡量理解)
復用與通用.png

3.USART.docx

1.74 MB, 下載次數: 10, 下載積分: 黑幣 -5

程序.7z

293.03 KB, 下載次數: 25, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天碰夜夜操 | 欧美一a一片一级一片 | 夜夜干夜夜操 | a国产一区二区免费入口 | 性生生活大片免费看视频 | 国产精品久久一区二区三区 | 色秀网站| 久久88 | av在线免费播放 | 成人精品在线观看 | 给我免费的视频在线观看 | 国产精品美女久久久久久免费 | 国产免国产免费 | 国产精品一区二区久久 | 久久久久久久久国产成人免费 | 亚洲 中文 欧美 日韩 在线观看 | 99亚洲| 日韩中文字幕在线观看 | 日韩专区中文字幕 | 91av精品| 一区二区三区在线看 | 亚洲成人在线免费 | 亚洲福利在线观看 | 一区二区三区在线 | 国产高清精品一区二区三区 | 欧美aaaaaaaaaa | 成人精品一区二区三区中文字幕 | 欧美一二三 | 91爱啪啪| 色www精品视频在线观看 | 欧美国产一区二区 | 欧美三级在线 | 久久99精品久久久久久国产越南 | 欧美一级欧美一级在线播放 | 美女日皮网站 | 国产精品一区在线 | 精品中文字幕视频 | 女同久久另类99精品国产 | 日韩精品a在线观看图片 | 97在线观视频免费观看 | 亚洲国产小视频 |