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線上的時鐘脈衝的上...