嵌入式系統(tǒng)導(dǎo)論(第2版)-教學(xué)課件 嵌入式導(dǎo)論07_第1頁
嵌入式系統(tǒng)導(dǎo)論(第2版)-教學(xué)課件 嵌入式導(dǎo)論07_第2頁
嵌入式系統(tǒng)導(dǎo)論(第2版)-教學(xué)課件 嵌入式導(dǎo)論07_第3頁
嵌入式系統(tǒng)導(dǎo)論(第2版)-教學(xué)課件 嵌入式導(dǎo)論07_第4頁
嵌入式系統(tǒng)導(dǎo)論(第2版)-教學(xué)課件 嵌入式導(dǎo)論07_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

嵌入式系統(tǒng)導(dǎo)論主講教師:第7章

STM32的USART本章內(nèi)容提要7.1串行異步通信7.2通用同步異步接收發(fā)送器(USART)7.3USART應(yīng)用示例: 實(shí)現(xiàn)C語言標(biāo)準(zhǔn)輸入輸出函數(shù)串行通信并行傳輸7.1串行異步通信串行數(shù)據(jù)傳輸將數(shù)據(jù)分解成二進(jìn)制位用一條信號(hào)線一位一位順序傳輸數(shù)據(jù)通信線路少,遠(yuǎn)距離通信的成本低適合于遠(yuǎn)距離數(shù)據(jù)傳送和近距離數(shù)據(jù)傳送可以減小芯片尺寸、提升傳輸速率需制定通信協(xié)議(通信規(guī)程),解決傳送速率、信息格式、數(shù)據(jù)同步、數(shù)據(jù)校驗(yàn)等問題串行異步通信:以字符為單位進(jìn)行傳輸串行同步通信:以一個(gè)數(shù)據(jù)塊(幀)為傳輸單位串行串行異步通信字符格式起始位——每個(gè)字符開始傳送的標(biāo)志,起始位采用邏輯0電平數(shù)據(jù)位——數(shù)據(jù)位緊跟著起始位傳送。由5~8個(gè)二進(jìn)制位組成,低位先傳送校驗(yàn)位——用于校驗(yàn)是否傳送正確;可選擇奇檢驗(yàn)、偶校驗(yàn)或不傳送校驗(yàn)位停止位——表示該字符傳送結(jié)束。停止位采用邏輯1電平,可選擇1、1.5或2位起始位校驗(yàn)位停止位空閑位數(shù)據(jù)位低位高位字符0/10/10/10/110111…空閑位——傳送字符之間的邏輯1電平,表示沒有進(jìn)行傳送串行同步通信以一個(gè)數(shù)據(jù)塊(幀)為傳輸單位每個(gè)數(shù)據(jù)塊附加1個(gè)或2個(gè)同步字符最后以校驗(yàn)字符結(jié)束同步通信的傳輸效率和速率較高,硬件電路較復(fù)雜串行同步通信主要應(yīng)用在網(wǎng)絡(luò)當(dāng)中最常使用高級(jí)數(shù)據(jù)鏈路控制協(xié)議HDLC~~~~同步字符數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)校驗(yàn)字符數(shù)據(jù)傳輸速率(帶寬)數(shù)據(jù)傳輸速率=比特率(BitRate)每秒傳輸?shù)亩M(jìn)制位數(shù)bps字符中每個(gè)二進(jìn)制位持續(xù)的時(shí)間長度都一樣, 是數(shù)據(jù)傳輸速率的倒數(shù)進(jìn)行二進(jìn)制數(shù)碼傳輸,每位時(shí)間長度相等: 比特率=波特率(BaudRate)過去,限制在50bps到9600bps之間現(xiàn)在,可以達(dá)到115200bps或更高異步串行接口標(biāo)準(zhǔn)美國電子工業(yè)協(xié)會(huì)EIA制定1962年公布,1969年修訂1987年1月正式改名為EIA-232D數(shù)據(jù)終端設(shè)備DTE與數(shù)據(jù)通信設(shè)備DCE標(biāo)準(zhǔn)接口25針插口9針插口232C接口的引腳定義TxD:發(fā)送數(shù)據(jù)RxD:接收數(shù)據(jù)RTS:請(qǐng)求發(fā)送CTS:清除發(fā)送(允許發(fā)送)DTR:數(shù)據(jù)終端準(zhǔn)備好DSR:數(shù)據(jù)裝置準(zhǔn)備好GND:信號(hào)地

CD:載波檢測(DCD)

RI:振鈴指示保護(hù)地(機(jī)殼地)TxC:發(fā)送器時(shí)鐘RxC:接收器時(shí)鐘232C接口的連接連接調(diào)制解調(diào)器:通過電話線路遠(yuǎn)距離通信直接(零調(diào)制解調(diào)器)連接:進(jìn)行短距離通信不使用聯(lián)絡(luò)信號(hào)的3線相連微機(jī)TxDRxDGND微機(jī)微機(jī)DSRDTRTxDRxDRTSCTSGND微機(jī)“偽”使用聯(lián)絡(luò)信號(hào)的3線相連傳輸制式全雙工通信同時(shí)雙向傳輸站A站B站A站B站A站B半雙工通信分時(shí)雙向傳輸單工通信單向傳輸7.2通用同步/異步接收/發(fā)送器實(shí)現(xiàn)串行數(shù)據(jù)傳輸需要并行到串行和串行到并行的轉(zhuǎn)換并按照傳輸協(xié)議發(fā)送和接收每個(gè)字符(或數(shù)據(jù)塊)可由軟件實(shí)現(xiàn),也可用硬件實(shí)現(xiàn)通用同步異步接收發(fā)送器USART是用硬件實(shí)現(xiàn) 串行通信的接口電路UniversalSynchronousAsynchronousReceiver/Transmitter處理器USARTSTM32的串行通信接口USARTSTM32具有多達(dá)5個(gè)USART接口USART1連接高速APB2總線、運(yùn)行速度為72MHz(支持高達(dá)4.5Mbps的傳輸速率)其他位于APB1總線、36MHz(2.25Mbps傳輸速率)STM32的USART接口具有多種操作模式異步全雙工通信、同步單路通信和半雙工單線通信支持LIN、智能卡、IrDA、多處理器通信每個(gè)USART接口具有兩個(gè)DMA通道用于接收Rx和發(fā)送Tx數(shù)據(jù)與存儲(chǔ)器之間的高速傳送UniversalSynchronousAsynchronousReceiver/TransmitterUSART結(jié)構(gòu)圖USART的增強(qiáng)功能局部互聯(lián)網(wǎng)絡(luò)LIN(LocalInterconnectionnetwork)主要針對(duì)車輛中低成本的LIN總線智能卡(SmartCard)內(nèi)嵌芯片的集成電路(IC)卡兼容ISO7816-3標(biāo)準(zhǔn)的異步智能卡協(xié)議紅外線接口IrDA(InfraredDataAssociation)短距離、點(diǎn)對(duì)點(diǎn)直線數(shù)據(jù)傳輸支持SIRENDEC傳輸編碼解碼協(xié)議USART接口的引腳USART接口通過3個(gè)引腳連接外設(shè)Tx

發(fā)送數(shù)據(jù)輸出(TransmitDataOut)Rx

接收數(shù)據(jù)輸入(ReceiveDataIn)CK

發(fā)送時(shí)鐘輸出,用于同步傳輸模式(CK引腳早期版本被稱為SCLK)實(shí)現(xiàn)硬件流程控制需要如下引腳nCTS

清除發(fā)送(ClearToSend) 若為高電平,在當(dāng)前傳輸結(jié)束前阻止下個(gè)數(shù)據(jù)發(fā)送nRTS

發(fā)送請(qǐng)求(RequestToSend) 若為低電平,表明USART準(zhǔn)備好接收數(shù)據(jù)USART寄存器寄存器縮寫寄存器中文名稱USART_SR狀態(tài)寄存器USART_DR數(shù)據(jù)寄存器USART_BRR波特率寄存器USART_CR1控制寄存器1USART_CR2控制寄存器2USART_CR3控制寄存器3USART_GTPR時(shí)間保護(hù)和預(yù)分頻寄存器異步串行通信協(xié)議嵌入式開發(fā)系統(tǒng)可以連接PC機(jī)串口用于程序下載、系統(tǒng)調(diào)試等嵌入式開發(fā)板與PC機(jī)的串口連接通常采用簡單的交叉3線、不采用聯(lián)絡(luò)信號(hào)支持全雙工通信異步串行通信協(xié)議以字符為單位,需設(shè)置波特率(傳輸率)、數(shù)據(jù)位數(shù)奇偶校驗(yàn)、停止位個(gè)數(shù)7.3USART應(yīng)用示例:實(shí)現(xiàn)標(biāo)準(zhǔn)輸入輸出函數(shù)使用3線交叉線連接USART1端口與PC機(jī)串口1編寫USART1初始化配置函數(shù)將輸入輸出函數(shù)重定向到USART1端口編寫字符發(fā)送fputc函數(shù)編寫字符接收fgetc函數(shù)不使用半主機(jī)模式復(fù)用功能USART1_REMAP=0USART1_REMAP=1USART1_TXPA9PB6USART1_RXPA10PB7USART初始化配置啟動(dòng)USART時(shí)鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)

GPIO復(fù)用引腳初始化USART1_Tx(發(fā)送信號(hào))復(fù)用PA9引腳USART1_Rx(接收信號(hào))復(fù)用PA10引腳USART初始化配置為:115200-8-N-1(波特率-數(shù)據(jù)位數(shù)-校驗(yàn)方式-停止位數(shù))允許USART工作

USART_Cmd(USART1,ENABLE)GPIO復(fù)用引腳初始化啟動(dòng)GPIOA端口時(shí)鐘

RCC_APB2PeriphClockCmd(RCC_APB2Perih_GPIOA,ENABLE)

使用GPIO_Init函數(shù)初始化GPIO引腳PA9(USART1_TX)需設(shè)置為推挽復(fù)用輸出PA10(USART1_RX)需配置為浮空輸入或上拉輸入U(xiǎn)SART引腳通信配置

GPIO配置USARTx_TX全雙工復(fù)用推挽輸出半雙工同步模式復(fù)用推挽輸出USARTx_RX全雙工浮空輸入

/上拉輸入半雙工同步模式未用??捎糜谕ㄓ肐/O參考手冊USART初始化USART初始化函數(shù)

voidUSART_Init(

USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct)

USARTx(要配置的串口):USART1~UART5USART_InitStruct指向USART_InitTypeDef結(jié)構(gòu)變量的指針typedef

struct{uint32_tUSART_BaudRate;/*通信波特率*/uint16_tUSART_WordLength;/*數(shù)據(jù)位數(shù)*/uint16_tUSART_StopBits;/*停止位數(shù)*/uint16_tUSART_Parity;/*校驗(yàn)?zāi)J?/uint16_tUSART_Mode;/*接收發(fā)送模式*/uint16_tUSART_HardwareFlowControl;/*硬件流控制*/}USART_InitTypeDef;幫助文檔USART初始化(115200-8-N-1)USART_InitTypeDef

USART_InitStructure;USART_InitStructure.USART_BaudRate=115200;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);

USART_Cmd(USART1,ENABLE);重定向(Retarget)C語言輸入輸出函數(shù)默認(rèn)設(shè)備:鍵盤和顯示器要使用scanf和printf函數(shù),需要重定向?qū)⑤斎氲男畔⒅匦露ㄏ騺碜酝庠O(shè)(USART1端口)將輸出的信息重新定向去到外設(shè)(USART1端口)用戶可以重新編寫C語言的庫函數(shù)當(dāng)C編譯器檢查到與C庫函數(shù)相同名稱的函數(shù)時(shí)優(yōu)先采用用戶編寫的函數(shù),實(shí)現(xiàn)重定向1.編寫fputc函數(shù)2.編寫fgetc函數(shù)3.不使用半主機(jī)模式printfHello×USART的數(shù)據(jù)收發(fā)函數(shù)接收數(shù)據(jù)的函數(shù)uint16_tUSART_ReceiveData(USART_TypeDef*USARTx)函數(shù)調(diào)用的返回值就是最新接收的數(shù)據(jù)發(fā)送數(shù)據(jù)的函數(shù)voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData)參數(shù)Data就是要發(fā)送的數(shù)據(jù)雖然是一個(gè)16位數(shù)據(jù),實(shí)際上只使用其低8位1.編寫fputc函數(shù)在C標(biāo)準(zhǔn)庫函數(shù)中,printf函數(shù)實(shí)質(zhì)是一個(gè)宏需要調(diào)用fputc實(shí)現(xiàn)一個(gè)字符輸出int

fputc(int

ch,FILE*f){USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);returnch;}USART_GetFlagStatus用于檢測發(fā)送完成USART_GetFlagStatus函數(shù)用于檢測發(fā)送完成

FlagStatus

USART_GetFlagStatus(USART_TypeDef*USARTx,uint16_tUSART_FLAG)要檢測的狀態(tài)是參數(shù)USART_FLAG·USART_FLAG_CTS(CTS改變標(biāo)志,UART4和UART5上不可用)·USART_FLAG_LBD(LIN中止檢測標(biāo)志)·USART_FLAG_TXE(發(fā)送數(shù)據(jù)寄存器空標(biāo)志)·USART_FLAG_TC(發(fā)送完成標(biāo)志)·USART_FLAG_RXNE(接收數(shù)據(jù)寄存器非空標(biāo)志)·USART_FLAG_IDLE(空閑線檢測標(biāo)志)·USART_FLAG_ORE(溢出錯(cuò)誤標(biāo)志)·USART_FLAG_NE(噪聲錯(cuò)誤標(biāo)志)·USART_FLAG_FE(幀錯(cuò)誤標(biāo)志)·USART_FLAG_PE(校驗(yàn)錯(cuò)標(biāo)志)返回值USART_FLAG說明置位(SET)或復(fù)位(RESET)幫助文檔2.

編寫fgetc函數(shù)標(biāo)準(zhǔn)輸入函數(shù)scanf函數(shù)通過調(diào)用fputc實(shí)現(xiàn)int

fgetc(int

ch,FILE*f){intch;while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);ch=USART_ReceiveData(USART1);/*實(shí)現(xiàn)鍵盤輸入的回顯功能*/while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);USART_SendData(USART1,(uint8_t)ch);returnch;}3.

不使用半主機(jī)模式半主機(jī)模式(Semihosting)將ARM應(yīng)用程序的I/O在主機(jī)(PC機(jī))上體現(xiàn)出來printf、scanf等函數(shù)使用主機(jī)的屏幕和鍵盤使開發(fā)人員可以通過PC機(jī)的標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)和標(biāo)準(zhǔn)輸出設(shè)備(顯示器)調(diào)試ARM處理器代碼將printf、scanf等函數(shù)重定向到USART端口 就不能再采用半主機(jī)模式,方法有兩種(1)使用微庫(2)添加retarget.c文件使用C標(biāo)準(zhǔn)輸入輸出函數(shù),需包含stdio.h(1)使用微庫(UseMicroLIB)KeilMDK特別為嵌入式應(yīng)用編寫的小型C庫僅實(shí)現(xiàn)了基本的、簡單的函數(shù),例如printf、scanf不能使用高級(jí)的fprintf、fopen等微庫不使用半主機(jī)模式在MDK集成環(huán)境的目標(biāo)選項(xiàng)中,從代碼生成欄(CodeGeneration),選擇使用微庫MicroLib的選擇(目標(biāo)選項(xiàng))(2)添加retarget.c文件如果仍使用標(biāo)準(zhǔn)C庫需要用戶重新編寫使用半主機(jī)模式的函數(shù)在MDK安裝目錄中有一個(gè)文件retarget.c為用戶編寫自己的函數(shù)提供的模板用戶可以將文件復(fù)制到工程目錄中,添加到項(xiàng)目中,并進(jìn)行修改retarget.c主要修改是編輯fputc、fgetc函數(shù)的實(shí)現(xiàn)代碼本例刪除(已在其他文件實(shí)現(xiàn)了這兩個(gè)函數(shù))

#include<stdio.h>#pragma

import(__use_no_semihosting_swi)FILE__stdout;FILE__stdin;void_sys_exit(int

return_code){while(1);/*endlessloop*/}【例7-1】信息交互應(yīng)用程序?qū)崿F(xiàn)在PC機(jī)終端程序中進(jìn)行信息交互intmain(void){ charmsg[100]; inttemp; USART1_Config(); //USART1配置

printf("\r\n演示printf和scanf函數(shù)\r\n"); printf("輸入一個(gè)字符串:"); scanf("%s",msg); printf("\r\n輸入的字符串是:%s\r\n",msg);

……}調(diào)試運(yùn)行軟件模擬查看View→串行窗口SerialWindows→UART#1程序調(diào)試運(yùn)行時(shí),該窗口有printf輸出結(jié)果激活該窗口也可利用scanf函數(shù)輸入信息在線硬件仿真使用3線交叉串口電纜連接PC機(jī)串口和目標(biāo)板USART1端口運(yùn)行PC機(jī)的超級(jí)終端程序,設(shè)置其傳輸協(xié)議是“1152008-N-1”連接好目標(biāo)板硬件仿真器,打開電源,運(yùn)行程序在PC機(jī)超級(jí)終端程序中,與目標(biāo)板交互【例7-2】接收中斷驅(qū)動(dòng)LED燈點(diǎn)亮USART接口的中斷應(yīng)用、實(shí)現(xiàn)功能從PC機(jī)鍵盤輸入數(shù)字1、2或3,從PC機(jī)串口發(fā)送給嵌入式系統(tǒng)的USART1接口USART1接收數(shù)字后,觸發(fā)中斷中斷服務(wù)程序獲取具體的數(shù)字, 并相應(yīng)控制LED1、LED2或LED3燈點(diǎn)亮USART中斷連接USART中斷相關(guān)函數(shù)USART中斷配置函數(shù)voidUSART_ITConfig(USART_TypeDef*USARTx,uint16_tUSART_IT,FunctionalState

NewState)

獲取中斷狀態(tài)函數(shù)ITStatus

USART_GetITStatus(USART_TypeDef*USARTx,uint16_tUSART_IT)

清除中斷標(biāo)志函數(shù)voidUSART_ClearITPendingBit(USART_TypeDef*USARTx,uint16_tUSART_IT)USART中斷標(biāo)志和事件標(biāo)志中斷請(qǐng)求中斷標(biāo)志事

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論