USART非同步序列口輸入輸出

2021-08-10 17:29:58 字數 4686 閱讀 6881

5.usart非同步序列口輸入輸出

《需要知道的序列口相關庫函式》

1.初始化函式

void usart_init(usartx, usart_initstruct);

我的嵌入式開發板stm32f107僅有2個支援rs232協議可以實現全雙工的非同步序列通訊的串列埠,

因此x僅可能為1,2

typedef stuct

usart_inittypedef;

按照上面結構體初始化串列埠即可。

2. 使能函式

usart_cmd(usartx, functionalstatenewstate);

newstate: enable   使能序列口外設

disable 失能序列口外設

3. 接收資料

u8usart_receivedata(usartx,data)

檢查指定的序列通訊標誌位設定與否

flagstatususart_getflagstatus(usartx, usart_flag)

《序列初始化》

1. 串列埠的初始化,然後使能

usart_inittypedef  usart_inistructure;

gpio_inittypedefgpio_initstructure;

usart_deinit(usart1);

//設定串列埠波特率115200

usart_initstructure.usart_baudrate = 115200;                        

//串列埠一幀接收8位資料   

usart_initstructure.usart_wordlength =usart_wordlength_8b;        

//資料幀結尾有1個停止位

usart_initstructure.usart_stopbits =usart_stopbits_1;              

//不採用奇偶校驗

usart_initstructure.usart_parity= usart_parity_no;                  

//不使用硬體流控制

usart_initstructure.usart_hardwareflowcontrol= usart_hardwareflowcontrol_none;     

//串列埠1輸入輸出端都使能

usart_initstructure.usart_mode= usart_mode_rx | usart_mode_tx;     

usart_init(usart1&usart_initstructure);

usart_cmd(usart1 , enable);

gpio_initstructure.gpio_pin= gpio_pin_9;       //電路圖對應pa9

gpio_initstructure.gpio_speed= gpio_speed_50mhz;

gpio_initstructure.gpio_mode= gpio_mode_af_pp;//復用推挽輸出

gpio_init(gpioa, &gpio_initstructure);

gpio_initstructure.gpio_pin= gpio_pin_10;     //電路圖對應pa10

gpio_initstructure.gpio_mode= gpio_mode_in_floating;//浮空輸入

gpio_init(gpioa,&gpio_initstructure);

標準printf執行retarget處理,呼叫庫函式向串列埠傳送資訊

注意:編譯前請在工程屬性的 "target「-》」code generation「中勾選」use microlib「,否則沒有輸出

usart_senddata(usartx,u8 data); 傳送位元組函式

usart_getflagstatus(usartx,usart_flag_tc); 傳送位元組完成標誌位

用於判斷傳送完成,每傳送完成乙個位元組,傳送下一位元組。

main.c檔案頭新增#include,並進行retarget處理

#ifdef __gnuc__

/* with gcc/raisonance, small printf (

option ldlinker->libraries->small printf

set to 'yes') calls __io_putchar() */

#define putchar_prototype int__io_putchar(int ch)

#else

#define putchar_prototype int fputc(int ch,file *f)

#endif /* __gnuc__ */

檔案中新增結構體                       

putchar_prototype

return ch; }

串列埠通訊的深入研究

rz編碼和nrz編碼:

rz編碼其中正電平->歸零代表1,負電平->歸零代表0,因為每位傳輸後都要歸零,所以接受者只要在訊號歸零取樣即可,這樣不需要單獨的時鐘訊號,但是在rz編碼中,大部分的資料頻寬,都用來傳輸「歸零」而浪費掉了。

nrz 取消了資料歸零的過程,直接讀取線路上的訊號,因此節省了頻寬,但同時也就需要時鐘連線以保證能夠正確的接受資料。 

usart就是採用了nrz的非同步序列通訊方式

波特率:串列埠每秒傳送的bit個數

傳輸時間的計算(以2k資料b,每幀8位資料,1位停止位,波特率9600,傳輸完成花費時間)

t = 2*1024/8*(8+1)/9600 = 0.24s

資料位:    計算機每傳送乙個資訊包(幀)的位數,8個字是一位元組,cortex-m3提供的有8位和9位,    

這裡要注意下如果選用了奇偶校驗,那麼資料位必須為9位,否則輸出的資料會與實際不符。                  

停止位:    位於單個包的最後一位,典型值有1,2用於提供校正時間同步的機會

奇偶校驗位:當使能後在串列埠通訊資料msb(最高有效位)中插入經計算的校驗位,9位時為資料第9位,用           於檢錯

硬體流控制:用於資料流控制,通訊的雙方由此交換是否停止後繼續接收資訊,避免因處理資料速度問題而出現的快取溢位,導致資料的丟失。

cts:只有cts輸入訊號有效(低電平)時才能傳送資料。如果在資料傳輸的過程中,cts訊號                 變成無效,那麼發完這個資料後,傳輸就停止下來。如果當cts為無效時,向資料暫存器裡寫資料,則要等到cts有效時才會傳送這個資料。

rts:只有接收緩衝區內有空餘的空間時才請求下乙個資料。當前資料傳送完成後,傳送操作就                    

需要暫停下來。如果可以接收資料了,將rts輸出置為有效(拉至低電平)

序列通訊傳輸幀的格式(詳見stm32中文參考手冊25.3.1):

資料幀:8位/9位,包含起始位(低電平),但不包含停止位(高電平),因此資料幀的長度為8/9(資料長度位)+1/2(停止位)

空閒幀:包含停止位,匯流排持續高電平(傳送使能後將傳送乙個空閒幀)

斷開幀:持續低電平,後跟停止位,因此斷開幀的長度為不應大於10/11位,串列埠te置1時會傳送個斷開幀。

波特率usart->brr暫存器的配置(詳見stm32中文參考手冊25.3.4,用於暫存器控制,需要了解,最好掌握):

根據

可以求出usartdiv,再根據計算轉換為2進製數,即usaer->brr的值。

以36mhz,波特率為例9600

則usartdiv=3.6*10^7/(16*9600) = 234.375

轉換為二進位制整數部分為)0xea

小數部分轉化為16進製為 0x0.6

則usart->brr= 0xea6

《串列埠輸入輸出實驗》

串列埠的輸入輸出實驗與上訴並沒有什麼太大區別,為具體流程如下(以串列埠1為例):

1.串列埠復位

usart_deinit(usart1);

2.使能輸入輸出口的對應區域的外設時鐘以及復用功能時鐘,初始化對應gpio輸入輸出方式。

輸出方式:復用推挽輸出,輸入方式:浮空輸入

rcc_apb2periphclockcmd(rcc_apb2periph_gpioa|rcc_apb2periph_afio,enable);

。。。。。。

gpio_init(gpiox, &gpio_instructure);

3.使能串列埠時鐘,初始化串列埠

rcc_apb2periphclockcmd(rcc_apb2periph_usart1,  enable);

。。。。。。

usart_init(usart1,&usart_instructure);

usart_cmd(usart1 ,enable);

4.串列埠輸出昨天已經學習,輸入呼叫庫函式,即可以接收到數值。

const int maxlength= 20;         //快取區長度

char storesting[maxlength];

只要在接受函式中用do /while()迴圈,以收到回車(\n)表示接收截至。

大於等於maxlength仍未收到回車則輸出超出申請陣列範圍,返回

小於maxlength收到回車則迴圈結束返回,將陣列傳送給printf輸出。

序列非同步通訊 微控制器序列口介紹

序列口是微控制器與外界進行資訊交換的工具,8051微控制器的通訊方式有兩種 並行通訊 資料的各位同時傳送或接收。序列通訊 資料一位一位次序傳送或接收。非同步通訊 字元格式規定能使雙方把0和1串理解成同一種意義,原則上自由制定,通用角度使用標準如ascii 波特率即資料傳輸速率,每秒傳送的二進位制位數...

STM32io口輸入輸出的理解

於 最近在看資料手冊的時候,發現在cortex m3裡,對於gpio的配置種類有8種之多 1 gpio mode ain 模擬輸入 2 gpio mode in floating 浮空輸入 3 gpio mode ipd 下拉輸入 4 gpio mode ipu 上拉輸入 5 gpio mode o...

I2C匯流排序列序列輸入輸出結構

iic匯流排的序列輸入輸出結構保證了iic匯流排的資料暫存器中能儲存匯流排上的最新資料。sdat和ack組成乙個9為的移位暫存器,它組成乙個環狀結構。序列輸出的同時不斷採入匯流排上的資料。ack標誌位由匯流排控制,並可以由cpu訪問 存入1對應的是非應答,存入0對應的應答 在scl線上的時鐘脈衝的上...