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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32學習—串口實驗

[復制鏈接]
ID:82083 發表于 2015-6-9 00:28 | 顯示全部樓層 |閱讀模式
電路如圖所示:
?USB-USART1


?USB-USART1


?USB-USART1


USART1_IRQHandler函數:
void USART1_IRQHandler(void)函數是串口1的中斷響應函數,當串口1發生了相應的中斷后,就會跳到該函數執行。這里設計了一個接收協議:通過這個函數配合一個數組USART_RX_BUF[] ,一個接收狀態寄存器 USART_RX_STA(此寄存器其實就是一個全局變量,由筆者自行添加。由于它起到類似寄存器的功能,這里暫且稱之為寄存器)實現對串口數據的接收管理。USART_RX_BUF 的大小由 USART_REC_LEN 定義,也就是一次接收的數據最大不能超過 USART_REC_LEN個字節。 USART_RX_STA 是一個接收狀態寄存器,其各位的定義如表所示:
?接收狀態寄存器位定義表


設計思路如下:
當接收到計算機發過來的數據時,把接收到的數據保存在 USART_RX_BUF中,同時在接收狀態寄存器(USART_RX_STA)中計數接收到的有效數據個數,當收到回車(回車的表示由2個字節組成:0X0D 和0X0A)的第一個字節 0X0D 時,計數器將不再增加,等待 0X0A 的到來,而如果 0X0A沒有來到?,則認為這次接收失敗,重新開始下一次接收。如果順利接收到 0X0A ,則標記USART_RX_STA 的第15位,這樣完成一次接收,并等待該位被其他程序清除,從而開始下一次接收,而如果遲遲沒有收到 0X0D,那么在接收數據超過 USART_REC_LEN 的時候,則會丟棄前面的數據重新接收。
?USART1_IRQHandle函數


EN_USART1_RX 和 USART_REC_LEN 都是在 usart.h文件里面定義的,當需要使用串口接收的時候,只要在 usart.h 里面設置 EN_USART1_RX 為1即可。不使用的時候,設置EN_USART1_RX 為0即可,這樣可以省出部分 SRAM 和 FLASH,默認是設置 EN_USART1_RX為1,也就是開啟串口接收的。
OS_CRITICAL_METHOD 則是用來判斷是否使用 uc/OS,如果使用了 uc/OS,則調用OSIntEnter 和 OSIntExit 函數;如果沒有使用 uc/OS,則不調用這兩個函數。

uart_init函數:
void uart_init(u32 pclk2,u32bound)函數是串口1的初始化函數。該函數有2個參數,一個為pclk2,是系統的時鐘頻率。第二個參數為需要設置的波特率,例如:9600、115200等。而這個函數的重點就是在波特率的設置,由于STM32 采用了分數波特率,所以 STM32 的串口波特率設置范圍很寬,而且誤差很小。
STM32 的每個串口都有一個自己獨立的波特率寄存器USART_BRR,通過設置該寄存器就可以達到配置不同波特率的目的。其各位描述如圖所示:
?寄存器USART_BRR各位描述


前面提到 STM32的分數波特率概念,其實就是在這個寄存器(USART_BRR)里面體現的。USART_BRR的最低4位(位[3:0])用來存放小數部分DIV_Fraction,緊接著的12位(位[15:4])用來存放整數部分 DIV_Mantissa,最高16位未使用。
這里簡單介紹一下波特率的計算,STM32 的串口波特率計算公式如下:
?串口波特率計算公式


上式中,fpclkx 是給串口的時鐘(PCLK1 用于 USART2、3、4、5,PCLK2 用于USART1);USARTDIV 是一個無符號定點數。只要得到 USARTDIV 的值,就可以得到串口波特率寄存器USART1->BRR的值,反過來,得到USART1->BRR的值,也可以推導出USARTDIV 的值。但更關心的是如何從 USARTDIV的值得到 USART_BRR 的值,因為一般知道的是波特率和 PCLKx的時鐘,要計算的就是 USART_BRR 的值。
接下來就可以初始化串口了,需要注意的是,這里初始化串口是按8位數據格式,1位停止位,無奇偶校驗位的。具體代碼如下:
?uart_init函數



串口最基本的設置就是波特率的設置。STM32的串口使用起來還是蠻簡單的,只要開啟了串口時鐘,并設置相應I/0口的模式,然后配置波特率、數據位長度、奇偶校驗位等信息,就可以使用了。下面,就簡單介紹這個與串口基本配置直接相關的寄存器。
①串口時鐘使能。串口作為 STM32的一個外設,其時鐘由外設時鐘使能寄存器控制,這里使用的串口1是在 APB2ENR 寄存器的第14位。除了串口1的時鐘使能在APB2ENR 寄存器,其他串口的時鐘使能位都在 APB1ENR 寄存器。
②串口復位。當外設出現異常的時候可以通過復位寄存器里面的對應設置實現該外設的復位,然后重新配置這個外設達到讓其重新工作的目的。一般在系統剛開始配置外設的時候,都會先執行復位該外設的操作。串口1的復位是通過配置APB2RSTR 寄存器的第14位來實現的。APB2RSTR 寄存器的各位描述如圖所示:
?APB2RSTR寄存器各位描述


從圖可知串口1的復位設置位在 APB2RSTR 的第14位。通過向該位寫1復位串口1,寫0結束復位。其他串口的復位在APB1RSTR 里面。
③串口波特率設置。通過設置 USART_BRR就可以達到配置不同波特率的目的。
④串口控制。STM32 的每個串口都有3個控制寄存器USART_CR1~3,串口的很多配置都是通過這3個寄存器來設置的。這里只要用到 USART_CR1就可以實現需要的功能了,該寄存器各位描述如圖所示:
?USART_CR寄存器各位描述


該寄存器的高18位沒有用到,低14位用于串口的功能設置。UE為串口使能位,通過該位置1來使能串口。M為字長選擇位,當該位為0的時候設置串口為8個字長外加n個停止位,停止位的個數(n)是根據USART_CR2 的[13:12]位設置來決定的,默認為0。PCE 為校驗使能位,設置為0,則禁止校驗,否則使能校驗。PS為校驗位選擇,設置為0則為偶校驗,否則為奇校驗。TXIE 為發送緩沖區空中斷使能位,設置該位為1,當 USART_SR 中的 TC位為1時,將產生串口中斷。RXNEIE 為接收緩沖區非空中斷使能,設置該位為1,當 USART_SR 中的 ORE 或者 RXNE位為1時,將產生串口中斷。TE 為發送使能位,設置為1將開啟串口的發送功能。RE 為接收使能位,用法同 TE。
⑤數據發送和接收。STM32 的發送與接收是通過數據寄存器USART_DR 來實現的,這是一個雙寄存器,包含 TDR 和RDR。當向該寄存器寫數據的時候就會自動發送,當收到數據的時候,也是存在該寄存器內。該寄存器的各位描述如圖所示:
?USART_DR寄存器各位描述  


可以看出,雖然是一個32位寄存器,但是只用了低9位(DR[8:0]),其他都保留。
DR[8:0]為串口數據,包含了發送或接收的數據。由于它是由兩個寄存器組成的,一個給發送用(TDR),一個給接收用(RDR),因此兼具讀和寫的功能。TDR寄存器提供了內部總線和輸出移位寄存器之間的并行接口。RDR 寄存器提供了輸入移位寄存器和內部總線之間的并行接口。
當使能校驗位(USART_CR1中的PCE位被置位)進行發送時,寫到MSB的值(根據數據的長度不同,MSB是第7位或者第8位)會被后來的校驗位取代。
⑥串口狀態。串口的狀態可以通過狀態寄存器 USART_SR讀取。USART_SR 的各位描述如圖所示:
?USART_SR寄存器各位描述


這里關注即兩個位,即第5、6位 RXNE 和 TC。
當 RXNE(讀數據寄存器非空)位被置1時,就是提示已經有數據被接收到了,并且可以讀出來。這時候要做的就是盡快讀取 USART_DR,通過讀USART_DR 可以將該位清零,也可以向該位寫0,直接清除。
當 TC(發送完成)位被置位時,表示 USART_DR內的數據已經被發送完成了。如果設置了這個位的中斷,則會產生中斷。該位也有兩種清零方式:①讀USART_SR,寫 USART_DR。②直接向該位寫零。

串口實驗:
重新建立一個工程,在 HARDWARE 文件夾下新建一個 led文件夾,用來存放按鍵輸入實驗相關的代碼。?
?在HARDWARE 下新增 LED 文件夾


然后我們打開 USER 文件夾下的 USER.uvproj工程,按新建按鈕新建一個文件,然后保存在 HARDWARE->led 文件夾下面,保存為led.h,在該文件中輸入如下代碼:
?led.h


保存 led.h 代碼,然后我們按同樣的方法新建一個 led.c 文件,也保存在 led 文件夾 下面。在led.c 中輸入如下代碼:
?led.c


我們把 led.c 加入到 HARDWARE 里面,如圖所示:
?將led.c 添加到HARDWARE中


回到主界面,在 USER.c 中輸入如下代碼:

?user.c


?user.c


然后按編譯,編譯工程,得到結果如圖:

?編譯結果


軟件實現功能:
?串口調試助手收到的信息


?發送數據后收到的信息


該程序僅使能了發送,并沒有使能發送完成中斷。中斷是由接收產生的,接收到了數據,接收緩沖區非空產生中斷。

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 无码一区二区三区视频 | 一区二区亚洲 | 一区二区三区精品在线视频 | 久久99精品久久久久久国产越南 | 久久99精品国产麻豆婷婷 | 日韩欧美1区2区 | 国产伦精品一区二区三区照片91 | 日韩欧美国产精品一区 | 在线一区视频 | 9久久精品 | 欧美美女爱爱 | 国产一区久久 | 色视频一区二区 | 亚洲精品久久久久中文字幕欢迎你 | 精品免费在线 | 视频1区| 香蕉视频在线播放 | 欧美在线小视频 | www.99精品| 日日夜夜天天干 | 午夜天堂精品久久久久 | 在线男人天堂 | 亚洲精品www久久久 www.蜜桃av | 国户精品久久久久久久久久久不卡 | 日本小视频网站 | 雨宫琴音一区二区在线 | 91国内外精品自在线播放 | 午夜在线免费观看视频 | 男女视频在线观看免费 | 91久久国产综合久久 | 欧美一区二区三区久久精品 | 精品一区av | 精品视频一区二区三区在线观看 | 精品免费国产 | 成人黄色电影在线观看 | 国产成人免费视频网站高清观看视频 | 日韩在线观看中文字幕 | 亚洲国产精品福利 | 国产在线激情视频 | 欧美性受xxxx白人性爽 | 亚洲精久|