久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32學習—串口實驗
[打印本頁]
作者:
qinqin
時間:
2015-6-9 00:28
標題:
STM32學習—串口實驗
電路如圖所示:
?USB-USART1
?USB-USART1
?USB-USART1
USART1_IRQHandler函數(shù):
void USART1_IRQHandler(void)函數(shù)是串口1的中斷響應(yīng)函數(shù),當串口1發(fā)生了相應(yīng)的中斷后,就會跳到該函數(shù)執(zhí)行。這里設(shè)計了一個接收協(xié)議:通過這個函數(shù)配合一個數(shù)組USART_RX_BUF[] ,一個接收狀態(tài)寄存器 USART_RX_STA(此寄存器其實就是一個全局變量,由筆者自行添加。由于它起到類似寄存器的功能,這里暫且稱之為寄存器)實現(xiàn)對串口數(shù)據(jù)的接收管理。USART_RX_BUF 的大小由 USART_REC_LEN 定義,也就是一次接收的數(shù)據(jù)最大不能超過 USART_REC_LEN個字節(jié)。 USART_RX_STA 是一個接收狀態(tài)寄存器,其各位的定義如表所示:
?接收狀態(tài)寄存器位定義表
設(shè)計思路如下:
當接收到計算機發(fā)過來的數(shù)據(jù)時,把接收到的數(shù)據(jù)保存在 USART_RX_BUF中,同時在接收狀態(tài)寄存器(USART_RX_STA)中計數(shù)接收到的有效數(shù)據(jù)個數(shù),當收到回車(回車的表示由2個字節(jié)組成:0X0D 和0X0A)的第一個字節(jié) 0X0D 時,計數(shù)器將不再增加,等待 0X0A 的到來,而如果 0X0A沒有來到?,則認為這次接收失敗,重新開始下一次接收。如果順利接收到 0X0A ,則標記USART_RX_STA 的第15位,這樣完成一次接收,并等待該位被其他程序清除,從而開始下一次接收,而如果遲遲沒有收到 0X0D,那么在接收數(shù)據(jù)超過 USART_REC_LEN 的時候,則會丟棄前面的數(shù)據(jù)重新接收。
?USART1_IRQHandle函數(shù)
EN_USART1_RX 和 USART_REC_LEN 都是在 usart.h文件里面定義的,當需要使用串口接收的時候,只要在 usart.h 里面設(shè)置 EN_USART1_RX 為1即可。不使用的時候,設(shè)置EN_USART1_RX 為0即可,這樣可以省出部分 SRAM 和 FLASH,默認是設(shè)置 EN_USART1_RX為1,也就是開啟串口接收的。
OS_CRITICAL_METHOD 則是用來判斷是否使用 uc/OS,如果使用了 uc/OS,則調(diào)用OSIntEnter 和 OSIntExit 函數(shù);如果沒有使用 uc/OS,則不調(diào)用這兩個函數(shù)。
uart_init函數(shù):
void uart_init(u32 pclk2,u32bound)函數(shù)是串口1的初始化函數(shù)。該函數(shù)有2個參數(shù),一個為pclk2,是系統(tǒng)的時鐘頻率。第二個參數(shù)為需要設(shè)置的波特率,例如:9600、115200等。而這個函數(shù)的重點就是在波特率的設(shè)置,由于STM32 采用了分數(shù)波特率,所以 STM32 的串口波特率設(shè)置范圍很寬,而且誤差很小。
STM32 的每個串口都有一個自己獨立的波特率寄存器USART_BRR,通過設(shè)置該寄存器就可以達到配置不同波特率的目的。其各位描述如圖所示:
?寄存器USART_BRR各位描述
前面提到 STM32的分數(shù)波特率概念,其實就是在這個寄存器(USART_BRR)里面體現(xiàn)的。USART_BRR的最低4位(位[3:0])用來存放小數(shù)部分DIV_Fraction,緊接著的12位(位[15:4])用來存放整數(shù)部分 DIV_Mantissa,最高16位未使用。
這里簡單介紹一下波特率的計算,STM32 的串口波特率計算公式如下:
?串口波特率計算公式
上式中,fpclkx 是給串口的時鐘(PCLK1 用于 USART2、3、4、5,PCLK2 用于USART1);USARTDIV 是一個無符號定點數(shù)。只要得到 USARTDIV 的值,就可以得到串口波特率寄存器USART1->BRR的值,反過來,得到USART1->BRR的值,也可以推導出USARTDIV 的值。但更關(guān)心的是如何從 USARTDIV的值得到 USART_BRR 的值,因為一般知道的是波特率和 PCLKx的時鐘,要計算的就是 USART_BRR 的值。
接下來就可以初始化串口了,需要注意的是,這里初始化串口是按8位數(shù)據(jù)格式,1位停止位,無奇偶校驗位的。具體代碼如下:
?uart_init函數(shù)
串口最基本的設(shè)置就是波特率的設(shè)置。STM32的串口使用起來還是蠻簡單的,只要開啟了串口時鐘,并設(shè)置相應(yīng)I/0口的模式,然后配置波特率、數(shù)據(jù)位長度、奇偶校驗位等信息,就可以使用了。下面,就簡單介紹這個與串口基本配置直接相關(guān)的寄存器。
①串口時鐘使能。串口作為 STM32的一個外設(shè),其時鐘由外設(shè)時鐘使能寄存器控制,這里使用的串口1是在 APB2ENR 寄存器的第14位。除了串口1的時鐘使能在APB2ENR 寄存器,其他串口的時鐘使能位都在 APB1ENR 寄存器。
②串口復位。當外設(shè)出現(xiàn)異常的時候可以通過復位寄存器里面的對應(yīng)設(shè)置實現(xiàn)該外設(shè)的復位,然后重新配置這個外設(shè)達到讓其重新工作的目的。一般在系統(tǒng)剛開始配置外設(shè)的時候,都會先執(zhí)行復位該外設(shè)的操作。串口1的復位是通過配置APB2RSTR 寄存器的第14位來實現(xiàn)的。APB2RSTR 寄存器的各位描述如圖所示:
?APB2RSTR寄存器各位描述
從圖可知串口1的復位設(shè)置位在 APB2RSTR 的第14位。通過向該位寫1復位串口1,寫0結(jié)束復位。其他串口的復位在APB1RSTR 里面。
③串口波特率設(shè)置。通過設(shè)置 USART_BRR就可以達到配置不同波特率的目的。
④串口控制。STM32 的每個串口都有3個控制寄存器USART_CR1~3,串口的很多配置都是通過這3個寄存器來設(shè)置的。這里只要用到 USART_CR1就可以實現(xiàn)需要的功能了,該寄存器各位描述如圖所示:
?USART_CR寄存器各位描述
該寄存器的高18位沒有用到,低14位用于串口的功能設(shè)置。UE為串口使能位,通過該位置1來使能串口。M為字長選擇位,當該位為0的時候設(shè)置串口為8個字長外加n個停止位,停止位的個數(shù)(n)是根據(jù)USART_CR2 的[13:12]位設(shè)置來決定的,默認為0。PCE 為校驗使能位,設(shè)置為0,則禁止校驗,否則使能校驗。PS為校驗位選擇,設(shè)置為0則為偶校驗,否則為奇校驗。TXIE 為發(fā)送緩沖區(qū)空中斷使能位,設(shè)置該位為1,當 USART_SR 中的 TC位為1時,將產(chǎn)生串口中斷。RXNEIE 為接收緩沖區(qū)非空中斷使能,設(shè)置該位為1,當 USART_SR 中的 ORE 或者 RXNE位為1時,將產(chǎn)生串口中斷。TE 為發(fā)送使能位,設(shè)置為1將開啟串口的發(fā)送功能。RE 為接收使能位,用法同 TE。
⑤數(shù)據(jù)發(fā)送和接收。STM32 的發(fā)送與接收是通過數(shù)據(jù)寄存器USART_DR 來實現(xiàn)的,這是一個雙寄存器,包含 TDR 和RDR。當向該寄存器寫數(shù)據(jù)的時候就會自動發(fā)送,當收到數(shù)據(jù)的時候,也是存在該寄存器內(nèi)。該寄存器的各位描述如圖所示:
?USART_DR寄存器各位描述
可以看出,雖然是一個32位寄存器,但是只用了低9位(DR[8:0]),其他都保留。
DR[8:0]為串口數(shù)據(jù),包含了發(fā)送或接收的數(shù)據(jù)。由于它是由兩個寄存器組成的,一個給發(fā)送用(TDR),一個給接收用(RDR),因此兼具讀和寫的功能。TDR寄存器提供了內(nèi)部總線和輸出移位寄存器之間的并行接口。RDR 寄存器提供了輸入移位寄存器和內(nèi)部總線之間的并行接口。
當使能校驗位(USART_CR1中的PCE位被置位)進行發(fā)送時,寫到MSB的值(根據(jù)數(shù)據(jù)的長度不同,MSB是第7位或者第8位)會被后來的校驗位取代。
⑥串口狀態(tài)。串口的狀態(tài)可以通過狀態(tài)寄存器 USART_SR讀取。USART_SR 的各位描述如圖所示:
?USART_SR寄存器各位描述
這里關(guān)注即兩個位,即第5、6位 RXNE 和 TC。
當 RXNE(讀數(shù)據(jù)寄存器非空)位被置1時,就是提示已經(jīng)有數(shù)據(jù)被接收到了,并且可以讀出來。這時候要做的就是盡快讀取 USART_DR,通過讀USART_DR 可以將該位清零,也可以向該位寫0,直接清除。
當 TC(發(fā)送完成)位被置位時,表示 USART_DR內(nèi)的數(shù)據(jù)已經(jīng)被發(fā)送完成了。如果設(shè)置了這個位的中斷,則會產(chǎn)生中斷。該位也有兩種清零方式:①讀USART_SR,寫 USART_DR。②直接向該位寫零。
串口實驗:
重新建立一個工程,在 HARDWARE 文件夾下新建一個 led文件夾,用來存放按鍵輸入實驗相關(guān)的代碼。?
?在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
然后按編譯,編譯工程,得到結(jié)果如圖:
?編譯結(jié)果
軟件實現(xiàn)功能:
?串口調(diào)試助手收到的信息
?發(fā)送數(shù)據(jù)后收到的信息
該程序僅使能了發(fā)送,并沒有使能發(fā)送完成中斷。中斷是由接收產(chǎn)生的,接收到了數(shù)據(jù),接收緩沖區(qū)非空產(chǎn)生中斷。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲一区视频在线
|
a毛片在线观看
|
日韩精品一区二区在线
|
免费一级a毛片
|
日本久久久久久
|
免费一级a毛片
|
国产精品无遮挡
|
日韩综合在线
|
国产精品一区二区三区四区五区
|
成人免费激情视频
|
成人在线视频免费
|
波多野结衣乳巨码无在线观看
|
久久久久久久免费视频
|
欧美大片91
|
秋霞一区二区
|
九九国产
|
亚洲激情久久
|
精品在线观看视频
|
国产高清久久
|
一级片日韩
|
超碰123
|
91av精品
|
福利一区福利二区
|
中文字幕免费观看
|
亚色av
|
99视频网
|
亚洲成人欧美
|
欧美激情视频在线
|
一区二区三区在线免费观看
|
国产一区二区影院
|
中文字幕麻豆
|
三上悠亚一区二区
|
一级毛片一级毛片
|
丰满少妇在线观看网站
|
av激情网
|
韩国免费理论片
|
超碰在线成人
|
日韩av免费在线
|
美日韩在线
|
免费观看全黄做爰视频
|
黄色国产片
|