STM32F103_USART_GPIO配置及相应的IO口设置
STM32 系列單片機(jī) GPIO 資料收集及總結(jié)
一、GPIO 配置
1.1 I/O 口的輸出模式下,有 3 種輸出速度可選(2MHz、10MHz 和 50MHz),這個(gè)速度是指 I/O 口驅(qū)動(dòng)電路的
響應(yīng)速度而不是輸出信號(hào)的速度,
輸出信號(hào)的速度與程序有關(guān)
(芯片內(nèi)部在 I/O 口 的輸出部分安排了多個(gè)響應(yīng)速度不同的輸出驅(qū)動(dòng)電路,用戶可以根據(jù)自己的需要選擇合適的驅(qū)動(dòng)電路)。通過選擇速度來選擇不同的輸出驅(qū)動(dòng)模塊,達(dá)到最佳的噪聲 控制和降低功耗的目的。高頻的驅(qū)動(dòng)電路,噪聲也高,當(dāng)不需要高的輸出頻率時(shí),請(qǐng)選用低頻驅(qū)動(dòng)電路,這樣非常有利于提高系統(tǒng)的 EMI 性能。當(dāng)然如果要輸出較高頻率的信號(hào),但卻選用了較低頻率的驅(qū)動(dòng)模塊,很可能會(huì)得到失真的輸出信號(hào)。關(guān)鍵是 GPIO 的引腳速度跟應(yīng)用匹配(推薦 10 倍以上?)。比如:
1.1.1 對(duì)于串口,假如最大波特率只需 115.2k,那么用 2M 的 GPIO 的引腳速度就夠了,既省電也噪聲小。
1.1.2 對(duì)于 I2C 接口,假如使用 400k 波特率,若想把余量留大些,那么用 2M 的 GPIO 的引腳速度或許不夠,這時(shí)可以選用 10M 的 GPIO 引腳速度。
1.1.3 對(duì)于 SPI 接口,假如使用 18M 或 9M 波特率,用 10M 的 GPIO 的引腳速度顯然不夠了,需要選用 50M的 GPIO 的引腳速度。
1.2 GPIO 口設(shè)為輸入時(shí),輸出驅(qū)動(dòng)電路與端口是斷開,所以輸出速度配置無意義。
1.3 在復(fù)位期間和剛復(fù)位后,復(fù)用功能未開啟,I/O 端口被配置成浮空輸入模式。
1.4 所有端口都有外部中斷能力。為了使用外部中斷線,端口必須配置成輸入模式。
1.5 GPIO 口的配置具有上鎖功能,當(dāng)配置好 GPIO 口后,可以通過程序鎖住配置組合,直到下次芯片復(fù)位才能解鎖。
2、推挽輸出與開漏輸出的區(qū)別
推挽輸出:可以輸出高,低電平,連接數(shù)字器件;開漏輸出:輸出端相當(dāng)于三極管的集電極. 要得到高電平狀態(tài)需要上拉電阻才行. 適合于做電流型的驅(qū)動(dòng),其吸收電流的能力相對(duì)強(qiáng)(一般 20ma 以內(nèi)).
推挽結(jié)構(gòu)一般是指兩個(gè)三極管分別受兩互補(bǔ)信號(hào)的控制,總是在一個(gè)三極管導(dǎo)通的時(shí)候另一個(gè)截止.
要實(shí)現(xiàn) 線與 需要用 OC(open collector)門電路.是兩個(gè)參數(shù)相同的三極管或 MOSFET,以推挽方式存在于電路中,各負(fù)責(zé)正負(fù)半周的波形放大任務(wù),電路工作時(shí),兩只對(duì)稱的功率開關(guān)管每次只有一個(gè)導(dǎo)通,所以導(dǎo)通損耗小,效率高。輸出既可以向負(fù)載灌電流,也可以從負(fù)載抽取電流當(dāng)端口配置為輸出時(shí):開漏模式:輸出 0 時(shí),N-MOS 導(dǎo)通,P-MOS 不被激活,輸出 0。
輸出 1 時(shí),N-MOS 高阻, P-MOS 不被激活,輸出 1(需要外部上拉電路);此模式可以把端口作為雙向 IO使用。
推挽模式:輸出 0 時(shí),N-MOS 導(dǎo)通,P-MOS 高阻 ,輸出 0。
輸出 1 時(shí),N-MOS 高阻,P-MOS 導(dǎo)通,輸出 1(不需要外部上拉電路)。
簡(jiǎn)單來說開漏是 0 的時(shí)候接 GND 1 的時(shí)候浮空 推挽是 0 的時(shí)候接 GND 1 的時(shí)候接 VCC
3、在 STM32 中選用 IO 模式
(1) 浮空輸入_IN_FLOATING ——浮空輸入,可以做 KEY 識(shí)別,RX1
(2)帶上拉輸入_IPU——IO 內(nèi)部上拉電阻輸入
(3)帶下拉輸入_IPD—— IO 內(nèi)部下拉電阻輸入
(4) 模擬輸入_AIN ——應(yīng)用 ADC 模擬輸入,或者低功耗下省電
(5)開漏輸出_OUT_OD ——IO 輸出 0 接 GND,IO 輸出 1,懸空,需要外接上拉電阻,才能實(shí)現(xiàn)輸出高電平。當(dāng)輸出為 1 時(shí),IO 口的狀態(tài)由上拉電阻拉高電平,但由于是開漏輸出模式,這樣 IO 口也就可以由外部電路改變?yōu)榈碗娖交虿蛔???梢宰x IO 輸入電平變化,實(shí)現(xiàn) C51 的 IO 雙向功能
(6)推挽輸出_OUT_PP ——IO 輸出 0-接 GND, IO 輸出 1 -接 VCC,讀輸入值是未知的
(7)復(fù)用功能的推挽輸出_AF_PP ——片內(nèi)外設(shè)功能(I2C 的 SCL,SDA)
(8)復(fù)用功能的開漏輸出_AF_OD——片內(nèi)外設(shè)功能(TX1,MOSI,MISO.SCK.SS)
實(shí)例總結(jié):
(1)模擬 I2C 使用開漏輸出_OUT_OD,接上拉電阻,能夠正確輸出 0 和 1;讀值時(shí)先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以讀 IO 的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
(2)如果是無上拉電阻,IO 默認(rèn)是高電平;需要讀取 IO 的值,可以使用;帶上拉輸入_IPU 和浮空輸入_IN_FLOATING 和 開漏輸出_OUT_OD
4、IO 低功耗:
關(guān)于模擬輸入&低功耗,根據(jù) STM32 的低功耗 AN(AN2629)及其源文件,在 STOP 模式下,為了得到盡量低的功耗,確實(shí)把所有的 IO(包括非 A/D 輸入的 GPIO)都設(shè)置為模擬輸入
5、程序
(1)時(shí)鐘:
(2)IO 配置:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // IR 輸入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);(3)輸出輸入:
輸出 0:GPIO_ResetBits(GPIOB, GPIO_Pin_0) 輸出 1:GPIO_SetBits(GPIOB, GPIO_Pin_0) 輸入: GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)簡(jiǎn)單來說開漏是 0 的時(shí)候接 GND 1 的時(shí)候浮空 推挽是 0 的時(shí)候接 GND 1 的時(shí)候接 VCC
關(guān)于 STM32 上電復(fù)位瞬間 I/O 口的電平狀態(tài)STM32 上電復(fù)位瞬間 I/O 口的電平狀態(tài)默認(rèn)是浮空輸入,因此是高阻。做到低功耗.STM32 的 IO 管腳配置口默認(rèn)為浮空輸入,把選擇權(quán)留給用戶,這是一個(gè)很大的優(yōu)勢(shì):一方面浮空輸入確保不會(huì)出現(xiàn)用戶不希望的默認(rèn)電平(此時(shí)電平取決于用戶的外圍電路);另一方面降低了功耗,因?yàn)椴还苁巧侠€是下拉,都會(huì)有電流消耗。從另一個(gè)角度來看,不管 I/O 管腳的默認(rèn)配置如何,還是需要在輸出的管腳外加上拉或下拉,這是為了保證芯片上電期間和復(fù)位時(shí),輸出的管腳始終處于已知的電平。
─ 輸入浮空
─ 輸入上拉
─ 輸入下拉
─ 模擬輸入
─ 開漏輸出
─ 推挽式輸出
─ 推挽式復(fù)用功能
─ 開漏復(fù)用功能
IO 端口復(fù)位后處于浮空狀態(tài),也就是其電平狀態(tài)由外圍電路決定,這很重要,如果設(shè)計(jì)工業(yè)品的話,這是必須要確定的;IO 引腳可以兼容 5V 電源;
stm32 串口 1,2,3,4,5 為什么不工作?
請(qǐng)注意一些常規(guī)問題,譬如:
UART3 和 SPI2 有沖突,要把 SPI 的時(shí)鐘關(guān)掉。仔細(xì)分析程序,最有可能的就是 rcc 了,我把她們?nèi)即蜷_了,結(jié)果我逐一調(diào)試,發(fā)現(xiàn)RCC_APB1Periph_I2C1,RCC_APB1Periph_I2C2 打開導(dǎo)致 usart3 不正常,RCC_AHBPeriph_SDIO 打開導(dǎo)致usart4 不正常,想的可能是管腳沖突,打開管教定義,呵呵,的確如此。
usart1 是 APB2,USART2,3,UART4,5 都是 APB1 的, 這個(gè)不會(huì)搞錯(cuò)的。
一般來說,代碼要處理一下幾部分內(nèi)容:
STM32 UART 的使用過程
1、使用 UART 前必須啟動(dòng)相應(yīng)的外設(shè)時(shí)鐘,其主要用到固件庫的 RCC_APBnPeriphClockCmd 函數(shù)。使能 UART1:使用
使能 UART2:使用
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE)2、使用中斷進(jìn)行 UART 操作的需要配置 NVIC,設(shè)置中斷優(yōu)先級(jí)。如:
/* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* Enable the USART1 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);3、配置相應(yīng)的 GPIO 口。
如 果 系 統(tǒng) 的 UART 需 要 進(jìn) 行 重 映 射 , 需 要 使 用 GPIO_PinRemapConfig 函 數(shù) 進(jìn) 行 重 映 射 , 如 :
將 Rx 配置為:浮空輸入模式,Tx 配置為帶上拉的第二功模式。并用 GPIO_Init() 函數(shù)初始化。如:
/* Configure USART2 Rx PA3 input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Tx (PA.09) as alternate push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure);4、配置 UART
當(dāng)在 conf 文件種配置正確的外晶振后,在 USART_InitTypeDef 定義的結(jié)構(gòu)體種直接寫入 UART 的波特率、
通訊長(zhǎng)頓、模式、硬件通訊控制,收發(fā)模式。再用 USART_Init()進(jìn)行初始化。如:
而后使能收發(fā)中斷。如:
/* Enable USART1 Receive and Transmit interrupts */USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_ITConfig(USART1, USART_IT_TXE, ENABLE); // USART_ITConfig(USART1, USART_IT_TXE, DISABLE);注意:一般不將 TXE 中斷使能。因?yàn)橐坏⒋酥袛嗍鼓?如果 UART 發(fā)送緩沖區(qū)空,則會(huì)立即進(jìn)入 UART 中
斷中,因此可在程序中需要發(fā)送數(shù)據(jù)處,使能 TXE 中斷。在 UART 中斷種用 USART_SendData()來發(fā)送數(shù)
據(jù)。
完成中斷使能后,還需要使能 UART 口:
如:
中斷程序(stm32f10x_it.c)可以如下完成發(fā)送:注意所有的的串口中斷需要在中斷服務(wù)程序中判斷中斷
源以分別處理。
STM32 UART 整理說明該接口通過 3 個(gè)引腳連接到另外的外部設(shè)備上。
任何 USART 雙向通信都至少需要兩個(gè)引腳:接收數(shù)據(jù)輸入 RX 和發(fā)送數(shù)據(jù)輸出 TX當(dāng)發(fā)送器禁能時(shí)輸出引腳恢復(fù)到 I/O 端口配置。當(dāng)發(fā)送器使能時(shí)且無數(shù)據(jù)發(fā)送,TX 引腳為高電平。
字長(zhǎng)可以通過設(shè)置 USART_CR1 寄存器中的 M 位來選擇是 8 位還是 9 位
TX 引腳在起始位期間為低,停止位期間為高空閑符被認(rèn)為是一個(gè)全“1”的幀,其后緊跟著包含數(shù)據(jù)的下一個(gè)幀的起始位(“1”的數(shù)目包含了停止位的數(shù)目)
間隙符被認(rèn)為是一個(gè)幀周期都接收到“0”。在間隙幀之后,發(fā)送器插入 1 個(gè)或者 2 個(gè)的停止位(邏輯“1”)來應(yīng)答起始位發(fā)送器發(fā)送器可以發(fā)送 8 或者 9 位的數(shù)據(jù)字,這取決于 M 位的狀態(tài)。相關(guān)時(shí)鐘脈沖在 SCLK 引腳輸出
1、字符發(fā)送
USART 發(fā)送期間,TX 引腳先出現(xiàn)最低有效位。這種模式下,USART_DR 寄存器包含了一個(gè)內(nèi)部總線和發(fā)送移位寄存器之間的緩沖區(qū) TDR。每個(gè)字符之前都有一位邏輯低電平的起始位,以可設(shè)置數(shù)目的停止位結(jié)束。TE 位使能之后將發(fā)送一個(gè)空閑幀
2、可配置的停止位
1 個(gè)停止位:這是陌生人的停止位數(shù)目
2 個(gè)停止位:常規(guī) USART,單線和調(diào)制解調(diào)器模式下支持
0.5 個(gè)停止位:當(dāng)處于智能卡模式下接收數(shù)據(jù)時(shí)使用
1.5 個(gè)停止位:當(dāng)處于智能卡模式下發(fā)送數(shù)據(jù)時(shí)使用空閑幀的發(fā)送包含了停止位。
間隙幀是 10(11)個(gè)低位之后跟著配置的停止位
配置流程:通過把 USART_CR1 寄存器中的 UE 位寫 1 來使能 USART->配置 USART_CR1 寄存器中的 M 位來定義字長(zhǎng)->配置 USART_CR2 寄存器中的停止位數(shù)目->若采用多緩沖通信選擇 USART_CR3 寄存器中的 DMA 使能位
(DMAT),按照多緩沖通信中解釋的配置 DMA 寄存器->設(shè)置 USART_CR1 寄存器中的 TE 位來發(fā)送一個(gè)空閑幀來作為第一次發(fā)送->通過 USART_BRR 寄存器選擇期望的波特率->往 USART_DR 寄存器中寫入要發(fā)送的數(shù)據(jù),這也將清除 TXE 位。
3、單字節(jié)通信
清除 TXE 位一般都是通過往數(shù)據(jù)寄存器中寫入數(shù)據(jù)完成的
TXE 是由硬件設(shè)置的,它表明:數(shù)據(jù)已經(jīng)從 TDR 中轉(zhuǎn)移到移位寄存器了,數(shù)據(jù)發(fā)送已經(jīng)開始;TDR 寄存器是空的;下一個(gè)數(shù)據(jù)可以寫入 USART_DR 寄存器,而不會(huì)覆蓋前面的數(shù)據(jù),當(dāng)發(fā)送在進(jìn)行時(shí),一個(gè)對(duì) USART_DR 寄存器的寫命令將數(shù)據(jù)保存到 TDR 寄存器中,并且當(dāng)前傳輸完成之后,TDR 寄存器中的數(shù)據(jù)將被復(fù)制到移位寄存器中。當(dāng)沒有進(jìn)行發(fā)送時(shí),往 USART_DR 寄存器中寫入一個(gè)數(shù)據(jù),數(shù)據(jù)將直接被放入移位寄存器,發(fā)送開始,TXE位將被立即置 1
當(dāng)一個(gè)幀發(fā)送完成時(shí)(結(jié)束位之后),TC 位被置 1清除 TC 位是通過下面的軟件操作完成的:(1)讀一次 USART_SR 寄存器(2)寫一次 USART_DR 寄存器(TC 位也可以通過對(duì)它寫 0 清除,這個(gè)清除序列只建議在多緩存通信中使用)
4、間隙字符設(shè)置 SBK 位將發(fā)送一個(gè)間隙字符。若 SBK 位被置 1,在完成當(dāng)前的發(fā)送之后將在 TX 線路上發(fā)送一個(gè)間隙字符。這一位在間隙字符發(fā)送完成時(shí)由硬件復(fù)位。USART 在最后一個(gè)間隙幀的末端插入一個(gè)邏輯 1,從而保證下一個(gè)幀的起始位能被識(shí)別軟件在間隙符發(fā)送之前復(fù)位 SBK,間隙符將不會(huì)被發(fā)送
5、空閑符
設(shè)置 TE 位將驅(qū)動(dòng) USART 在第一個(gè)數(shù)據(jù)幀之前發(fā)送一個(gè)空閑幀
接收器接收器可以接收 8 位或 9 位的數(shù)據(jù)字,這取決于 USART_CR1 寄存器中的 M 位
1、字符接收
在一次 USART 接收期間,RX 引腳最先接收到最低有效位。這種模式下,USART_DR 寄存器由一個(gè)內(nèi)部總線和接收移位寄存器之間的緩沖區(qū)(RDR)構(gòu)成
配置流程:通過把 USART_CR1 寄存器中的 UE 位寫 1 來使能 USART->配置 USART_CR1 寄存器中的 M 位來定義字長(zhǎng)->配置 USART_CR2 寄存器中的停止位數(shù)目->若發(fā)生多緩沖通信,選擇 USART_CR3 寄存器中的 DMA 使能位(DMAT)->通過波特率寄存器 USART_BRR 來選擇期望的波特率->置位 USART_CR1 寄存器中的 RE,這將使能接收器開始尋找起始位。當(dāng)接收到一個(gè)字符時(shí):RXNE 位被置 1,表明移位寄存器的內(nèi)容被轉(zhuǎn)移到 RDR
如果 RXNEIE 位被置 1,將產(chǎn)生一個(gè)中斷接收期間若發(fā)現(xiàn)幀錯(cuò)誤,噪音或者溢出錯(cuò)誤錯(cuò)誤標(biāo)志將會(huì)被置 1多緩沖接收中,RXNE 在每接收到一個(gè)字節(jié)都會(huì)被置 1 并通過 DMA 讀取數(shù)據(jù)寄存器來清除在單緩沖模式,清除 RXNE 位是由軟件讀取 USART_DR 寄存器萬層。RXNE 標(biāo)志也可以通過對(duì)它寫 0 清除。RXNE位必須在下一個(gè)字符接收完成前被清除,否則將產(chǎn)生溢出錯(cuò)誤
2、間隙符:
當(dāng)接收到間隙符時(shí),USART 把它當(dāng)做幀錯(cuò)誤處理
3、空閑符:
當(dāng)接收到空閑幀時(shí),將和接收到數(shù)據(jù)一樣處理,此外如果 IDLEIE 位被置 1 的話將產(chǎn)生一個(gè)中斷
4、溢出錯(cuò)誤
當(dāng)接收到一個(gè)字符,而 RXNE 位還沒有被復(fù)位,這時(shí)候?qū)⒊霈F(xiàn)錯(cuò)誤。在 RXNE 位被清除之前數(shù)據(jù)不能從移位寄存器轉(zhuǎn)移到 RDR 寄存器出現(xiàn)溢出錯(cuò)誤時(shí),ORE 位被置 1,通過在讀 USART_SR 寄存器之后讀 USART_DR 寄存器,ORE 位被復(fù)位ORE 位被置 1 時(shí),表明至少 1 個(gè)數(shù)據(jù)已經(jīng)丟失:若 RXNE=1,上一個(gè)有效數(shù)據(jù)存放在接收寄存器 RDR,并且可讀;RXNE=0,上一個(gè)有效數(shù)據(jù)已被讀出,RDR 中無可讀數(shù)據(jù)
5、噪音錯(cuò)誤
在幀內(nèi)發(fā)現(xiàn)噪音:NE 在 RXNE 位的上升沿被置 1無效的數(shù)據(jù)從移位寄存器轉(zhuǎn)移到 USART_DR 寄存器若為單字節(jié)通信,將不產(chǎn)生中斷;多緩沖通信下,若USART_CR3 寄存器中的 EIE 位準(zhǔn)備置 1,將導(dǎo)致一個(gè)中斷NE 位通過依次讀取 USART_SR 寄存器和 USART_DR 寄存器復(fù)位
6、幀錯(cuò)誤
由于沒有同步上或大量噪音的原因,停止位沒有在與其的時(shí)間上接和收識(shí)出來當(dāng)發(fā)現(xiàn)幀錯(cuò)誤時(shí):FE 位被硬件置 1;無效的數(shù)據(jù)從移位寄存器轉(zhuǎn)移到USART_DR 寄存器;若為單字節(jié)通信,將不會(huì)產(chǎn)生中斷,但這一位將和自身產(chǎn)生中斷的 RXNE 位一起上升,多緩沖通信中,若 USART_CR3 寄存器中的 EIE 位被置 1,將導(dǎo)致一個(gè)中斷NE 位通過一次讀取 USART_SR 寄存器和 USART_DR 寄存器復(fù)位
7、接收期間配置停止位
要接收的停止位的數(shù)目可以通過控制寄存器 2 中的控制為配置。普通模式下可以是 1 位或者 2 位。智能卡模式下可能是 0.5 位或 1.5 位分?jǐn)?shù)波特率的產(chǎn)生接收器和發(fā)送器(RX 和 TX)都是設(shè)置城 USARTDIV 整數(shù)和小數(shù)寄存器中配置的值。TX/RX 波特率=Fck/(16*USARTDIV)
例子:從 BRR 寄存器的值計(jì)算得到 USARTDIV
如果 DIV_Mantissa=27D,DIV_Fraction=12D(BRR=1BCH),那么 Mantissa(USARTDIV)=27D Fraciton(USARTDIV)=12/16=0.75D 因此,USARTDIV=27.75D 在寫入 USART_BRR 后,波特率計(jì)數(shù)器會(huì)被波特率寄存器中的新值更新,因此在處理期間不應(yīng)改變波特率寄 存器的值 只有 USART1 是由 PCK2(最大位 72MHZ)提供時(shí)鐘,其他的都由 PCLK1 提供時(shí)鐘(最大為 36MHZ)多處理器通信
利用 USART 可以進(jìn)行多處理器通信(只需把多個(gè) USART 連接城一個(gè)網(wǎng)絡(luò))。
未編址設(shè)備可以通過靜默功能的方式置為靜默模式。靜默模式下:所有接收狀態(tài)位都不會(huì)被設(shè)置所有的接收中斷都被禁止USART_CR1 寄存器中的 RWU 位被置 1,RWU 可以硬件自動(dòng)控制或者在某些條件下有軟件寫USART 可以通過兩種方式進(jìn)入和退出靜默模式:
如果 WAKE 位被復(fù)位,采用空閑線路檢測(cè)模式
如果 WAKE 位被置位,采用地址標(biāo)記檢測(cè)模式
1、空閑線路檢測(cè)模式(WAKE=0)
當(dāng) RWU 位被寫 1 時(shí),USART 進(jìn)入靜默模式
當(dāng)發(fā)現(xiàn)空閑幀時(shí),USART 退出靜默模式,RWU 位也將被硬件清除,但是 USART_SR 寄存器中的 IDLE 位不會(huì)被
置 1.RWU 也可以被軟件清 0
2、地址標(biāo)記檢測(cè)(WAKE=1)
此模式下,MSB 為 1 的字節(jié)被認(rèn)為是地址,否則被認(rèn)為是數(shù)據(jù)。
當(dāng)接收到一個(gè)和預(yù)先設(shè)置在 USART_CR2 寄存器中 ADD 位中的地址不匹配的地址字符,USART 進(jìn)入靜默模式。
當(dāng)接收到一個(gè)和設(shè)置的地址匹配的地址字符,USART 退出靜默模式。RWU 被清除,后面的字節(jié)也將正常接收,
RXNE 位會(huì)因?yàn)榻邮盏降刂纷址恢?1.
當(dāng)接收端緩沖區(qū)沒有數(shù)據(jù)時(shí)(USART_SR 寄存器中的 RXNE=0),RWU 位可以被寫 0 或者 1,否則寫操作會(huì)被忽
略。
在選擇靜默模式之前(設(shè)置 RWU 位)。USART 必須先接收一個(gè)數(shù)據(jù)字節(jié),否則它不能運(yùn)行在通過空閑線路檢
測(cè)喚醒的靜默模式。
在地址標(biāo)志檢測(cè)喚醒配置中(WAKE=1),RWU 位在 RXNE 位被置 1 時(shí)不能通過軟件修改奇偶控制
可以通過設(shè)置 USART_CR1 寄存器中的 PCE 位來使能奇偶控制。
發(fā)送模式:若 USART_CR1 的 PCE 位被置位,寫進(jìn)數(shù)據(jù)寄存器的數(shù)據(jù) MSB 位被校驗(yàn)位替換后發(fā)送出去。
LIN 模式
此模式通過 USART_CR2 寄存器的 LINEN 位選擇。LIN 模式下,CLKEN 位,STOP[1:0]位,SCEN,HDSEL,IREN
必須保持清除狀態(tài)
1、LIN 發(fā)送
與正常 USART 發(fā)送存在如下區(qū)別:清除 M 位來設(shè)置 8 位字長(zhǎng)度;設(shè)置 LINEN 位進(jìn)入 LIN 模式,此情況下,
設(shè)置 SBK 位來發(fā)送 13 個(gè)“0”作為間隙符,然后發(fā)送一個(gè)“1”來開啟其實(shí)檢測(cè)
2、LIN 接收
當(dāng) LIN 模式被使能時(shí),間隙檢測(cè)電路被激活。檢測(cè)和正常 USART 接收器完全獨(dú)立。間隙不管是在空閑時(shí)或
者接收幀期間發(fā)生都能被檢測(cè)到
檢測(cè)起始位的方法和尋找間隙符或者數(shù)據(jù)是一樣的。發(fā)現(xiàn)起始位后,電路采樣下面的位。若 10(LBDL=0)或
者 11 位(LBDL=1)連續(xù)的位都是 0,且金鉤一個(gè)分隔符,USART_SR 寄存器的 LBD 標(biāo)志被置 1
如果第 10 或者 11 次采樣之前采樣到 1,間隙檢測(cè)電路取消當(dāng)前的檢測(cè)而重新查找一個(gè)起始位
LIN 模式被使能,一旦發(fā)生了幀錯(cuò)誤,接收器不會(huì)停止直到間隙字沒有完成時(shí)接收到一個(gè)“1”或檢測(cè)到間
隙后接收到一個(gè)分隔符
USART 同步模式
同步模式是通過往 USART_CR2 寄存器中的 CLKEN 位寫 1 來選擇。此模式下,下面這些位必須保持清除狀態(tài):
LINEN,SCEN,HDSEL,IREN
USART 允許用戶在主模式下控制雙向同步串行通信。SCLK 引腳是 USART 發(fā)送者時(shí)鐘的輸出。起始位和停止
位期間不會(huì)往 SCLK 發(fā)送時(shí)鐘脈沖。
在空閑,實(shí)際數(shù)據(jù)到來前和發(fā)送間隙期間,外部時(shí)鐘不會(huì)被激活
SCLK 和 TX 同步,TX 上的數(shù)據(jù)也是同步的。USART 接收器和異步模式采用不同的工作方式。若 RE=1,數(shù)據(jù)
在 SCLK 上采樣而沒有任何過采樣
SCLK 引腳和 TX 引腳一起工作,故只有在發(fā)送使能時(shí)且數(shù)據(jù)在發(fā)送時(shí)才會(huì)提供時(shí)鐘,這就意味著不可能在
不發(fā)送數(shù)據(jù)時(shí)接收到同步數(shù)據(jù)
LBCL,CPOL,CPHA 必須在發(fā)送器和接收器都禁能時(shí)選擇,這些為在發(fā)送器或者接收器使能時(shí)不能改變
建議在同一條指令中設(shè)置 TE 和 RE 位以保證接收器的建立時(shí)間和保持時(shí)間最小
單線半雙工模式
此模式通過設(shè)置 USART_CR3 寄存器中的 HDSEL 位來選擇。此模式下必須保持下面這些位的清除狀態(tài):
LINEN,CLKEN,SCEN,HDSEL,IREN
一旦 HDSEL 被寫 1:RX 不再被使用;無數(shù)據(jù)傳輸時(shí),TX 總是被釋放的。因此,它在空閑狀態(tài)或接收狀態(tài)時(shí)
表現(xiàn)為一個(gè)標(biāo)準(zhǔn) I/O 口,該 I/O 口在不被 USART 驅(qū)動(dòng)時(shí),必須配置成懸空呼入或開漏的輸出高。
特別的是,發(fā)送永遠(yuǎn)都不會(huì)被硬件阻止,一旦 TE 位被置 1 并且數(shù)據(jù)寫入數(shù)據(jù)寄存器,發(fā)送就會(huì)連續(xù)發(fā)生智能卡
智能卡模式是通過設(shè)置 USART_CR3 寄存器中的 SCEN 位來選擇。此模式下,下面這些為必須保持清除狀態(tài):
LINEN,HDSEL,IREN
CLKEN 位可能被設(shè)置,從而為智能卡提供時(shí)鐘
智能卡接口設(shè)計(jì)是支持 ISO7816-3 標(biāo)準(zhǔn)中定義的一部協(xié)議的智能卡。USART 應(yīng)做如下配置:8 位數(shù)據(jù)家奇偶
校驗(yàn),USART_CR1 寄存器中的 M=1,PCE=1,并且滿足如下條件之一:
接收時(shí) 0.5 停止位:USART_CR2 中的 STOP=01
發(fā)送時(shí) 1.5 停止位,USART_CR2 中的 STOP=11
當(dāng)與智能卡相連時(shí),USART 的 TX 輸出驅(qū)動(dòng)一個(gè)智能卡也驅(qū)動(dòng)的雙向線(SW_RX 和 TX 必須連接到相同的 I/O)。
在發(fā)送起始位和數(shù)據(jù)字節(jié)時(shí),TX_EN 被置有效,而在停止位被置無效。這樣接收器只能在出現(xiàn)奇偶錯(cuò)誤時(shí)
才能驅(qū)動(dòng)這條線路。若沒有使用 TX_EN,在停止位期間 TX 被拉高,這樣只要 TX 被配置成開漏,接受者也可
以驅(qū)動(dòng)這條線路
智能卡是一個(gè)單線半雙工通信協(xié)議
通過發(fā)送移位寄存器的數(shù)據(jù)發(fā)送至少延遲 1/2 的波特時(shí)鐘
如果在接收 1/2 停止位幀時(shí)檢測(cè)到奇偶錯(cuò)誤,發(fā)送線路在完成接收幀時(shí)拉低并保持一個(gè)波特時(shí)鐘
置 TC 標(biāo)記有效可以通過設(shè)置保護(hù)時(shí)間寄存器延遲
TC 標(biāo)志的撤銷不會(huì)受智能卡模式影響
如果發(fā)送器檢測(cè)到幀錯(cuò)誤,NACK 不會(huì)被發(fā)送器的接收模塊當(dāng)做起始位
在接收器端,若檢測(cè)到奇偶錯(cuò)誤并且發(fā)送了 NACK,接收器不會(huì)把 NACK 當(dāng)做起始位
智能卡模式下,間隙符是沒有意義的,帶幀錯(cuò)誤的 00H 數(shù)據(jù)被看做是數(shù)據(jù)而不是間隙符
當(dāng)來回切換 TE 位時(shí),不會(huì)發(fā)送空閑幀。ISO 協(xié)議沒有定義空閑幀
USART 能夠通過 SCLK 輸出位智能卡提供時(shí)鐘。在智能卡模式下,SCLK 和通信無關(guān),而是先通過一個(gè) 5 位預(yù)
分頻器簡(jiǎn)單地用內(nèi)部的外設(shè)輸入時(shí)鐘來驅(qū)動(dòng)智能卡的時(shí)鐘。
IrDA SIR ENDEC 模塊
IrDA 模式是通過設(shè)置 USART_CR3 寄存器中的 IREN 位來選擇的。此模式下,下面這些位必須保持清除狀態(tài):
LINE,STOP,CLKEN,SCEN,HDSEL
SIR 發(fā)送編碼器對(duì)從 USART 輸出的 NRZ 比特流進(jìn)行調(diào)制。正常模式下,發(fā)送的脈寬定義在 3/16 位周期
SIR 接收解碼器借條來自紅外檢測(cè)器歸零位流,且向 USART 輸出 NRZ 串行比特流。在空閑狀態(tài)里,解碼器
的輸入就通常是高。發(fā)送器輸出和解碼器輸入有相反的極性。
IrDA 是一個(gè)半雙工通信協(xié)議,如果發(fā)送器忙,IrDA 解碼器將忽略所有 IRDA 接收線路上的數(shù)據(jù)。如果接收
器忙,TX 上從 USART 到 IrDA 的數(shù)據(jù)不會(huì)被 IrDA 編碼。在接收數(shù)據(jù)時(shí),應(yīng)避免發(fā)送數(shù)據(jù),否則要發(fā)送的數(shù)
據(jù)可能被破壞
“0”是作為高脈沖發(fā)送,而“1”是作為“0”發(fā)送
SIR 解碼器把 IrDA 兼容的接收信號(hào)轉(zhuǎn)變成 USART 的比特流
SIR 接收邏輯把高狀態(tài)邏輯“1”,而低脈沖看做邏輯“0”
發(fā)送編碼器輸出和解碼器輸入有相反的極性??臻e時(shí) SIR 的輸出是低電平
IrDA 規(guī)范要求可接受的脈沖大于 1.41 微秒,可接受的脈沖寬度是可設(shè)置的。
接收器可以和低功耗發(fā)送器通信
在 IrDA 模式下,USART_CR2 寄存器中的 STOP 位必須設(shè)置城 1 停止位
IrDA 低功耗模式敘述如下:
發(fā)送器:脈寬 3 倍于低功耗波特率。低功耗模式下可設(shè)置預(yù)分頻值對(duì)系統(tǒng)時(shí)鐘分頻接收器:與正常模式下接收類似。USART 應(yīng)忽略寬度小于 1PSC 的脈沖
使用 DMA 的連續(xù)通信
USART 可以利用 DMA 進(jìn)行連續(xù)通信。RX 和 TX 緩沖器可以獨(dú)立產(chǎn)生 DMA 請(qǐng)求
1、使用 DMA 發(fā)送
DMA 模式發(fā)送可以通過設(shè)置 USART_CR3 寄存器中的 DMAT 位使能。只要 TXE 位被置 1,數(shù)據(jù)就可以通過 DMA
外設(shè)從配置好的 SARM 區(qū)域?qū)氲?USART_DR 寄存器。使用下面的流程映射一個(gè)用于發(fā)送的 DMA 通道
把 USART_DR 寄存器的地址寫到 DMA 控制寄存器,配置成傳輸?shù)哪繕?biāo)地址,每次 TXE 事件發(fā)生時(shí),數(shù)據(jù)將從
存儲(chǔ)器轉(zhuǎn)移到這個(gè)地址
把存儲(chǔ)器的地址寫到 DMA 控制寄存器,配置成傳輸?shù)脑吹刂?每次 TXE 時(shí)間發(fā)生時(shí),數(shù)據(jù)將從這個(gè)存儲(chǔ)器
區(qū)域轉(zhuǎn)移到 USART_DR 寄存器
把要發(fā)送的字節(jié)總數(shù)寫入 DMA 控制寄存器
在 DMA 寄存器中設(shè)置通道的優(yōu)先級(jí)
根據(jù)應(yīng)用需要,設(shè)置半/全傳輸?shù)?DMA 中斷
利用 DMA 寄存器激活通道
當(dāng)傳輸?shù)臄?shù)目達(dá)到 DMA 控制寄存器中設(shè)置的值時(shí),DMA 控制寄存器在 DMA 通道中斷向量上產(chǎn)生一個(gè)中斷。
若要使用 DMA 來發(fā)送,不要使能 TXEIE
2、使用 DMA 接收
DMA 模式接收可以通過設(shè)置 USART_CR3 寄存器中的 DMAR 位使。只要接收到一個(gè)數(shù)據(jù)字節(jié),數(shù)據(jù)就可以通過
DMA 外設(shè)從 USART_DR 寄存器導(dǎo)入到配置好的 SARM 區(qū)域。使用下面的流程映射一個(gè)用于 USART 接收的 DMA
通道
把 USART_DR 寄存器的地址寫到 DMA 控制寄存器,配置成傳輸?shù)哪繕?biāo)地址,每次 RXNE 事件發(fā)生時(shí),數(shù)據(jù)將
從這個(gè)地址轉(zhuǎn)移到存儲(chǔ)器
把存儲(chǔ)器的地址寫到 DMA 控制寄存器,配置成傳輸?shù)哪繕?biāo)地址,每次 RXNE 事件發(fā)生時(shí),數(shù)據(jù)將從 USART_DR
寄存器轉(zhuǎn)移到這個(gè)存儲(chǔ)器區(qū)域
把要發(fā)送的字節(jié)總數(shù)寫入 DMA 控制寄存器
在 DMA 寄存器中設(shè)置通道的優(yōu)先級(jí)
根據(jù)應(yīng)用需要,設(shè)置半/全傳輸?shù)?DMA 中斷
當(dāng)傳輸?shù)臄?shù)目達(dá)到 DMA 控制寄存器中設(shè)置的值時(shí),DMA 控制寄存器在 DMA 通道中斷向量上產(chǎn)生一個(gè)中斷。
若使用 DMA 來接收,不要使能 RXNEIE 位
3、多緩沖通信中的錯(cuò)誤標(biāo)志和中斷產(chǎn)生
在多緩沖通信情況下,傳輸過程中發(fā)生任何錯(cuò)誤,錯(cuò)誤標(biāo)志都將在當(dāng)前字節(jié)之后置有效。在單字節(jié)接收中,
和 RXNE 一起置有效的幀錯(cuò)誤,溢出錯(cuò)誤和噪音錯(cuò)誤,它們有獨(dú)立的錯(cuò)誤標(biāo)志中斷使能位,若被使能,初相
任何一個(gè)錯(cuò)誤,都會(huì)在當(dāng)前字節(jié)傳輸之后產(chǎn)生中斷
硬件流控制
可以通過 nCTS 輸入和 nRTS 輸出來控制兩個(gè)設(shè)備之間的串行數(shù)據(jù)流
RTS 和 CTS 流控制可以分別通過 USART_CR3 寄存器中的 RTSE 和 CTSE 位來使能
1、RTS 流控制
若 RTS 流控制被使能,那么只要 USART 接收器準(zhǔn)備好了接收新數(shù)據(jù),nRTS 有效。當(dāng)接收寄存器為空時(shí),nTRS
無效,表明希望在發(fā)送當(dāng)前幀結(jié)束后停止傳輸
2、CTS 流控制若 CTS 流控制被使能,那么發(fā)送器在發(fā)送下一個(gè)幀之前檢查 nCTS 輸入。若 nCTS 有效,那么下一個(gè)數(shù)據(jù)將
被發(fā)送,否則發(fā)送不會(huì)發(fā)生。若 nCTS 在發(fā)送期間變?yōu)闊o效,當(dāng)前的傳輸完成之后停止發(fā)送
當(dāng) CTSE=1 時(shí),一旦 nCTS 輸入翻轉(zhuǎn),CTSIF 狀態(tài)位自動(dòng)被硬件置位,這表明接收器是否準(zhǔn)備好了通信。若
USART_CR3 寄存器中的 CTSIE 位被置 1,將產(chǎn)生一個(gè)中斷。
總結(jié)
以上是生活随笔為你收集整理的STM32F103_USART_GPIO配置及相应的IO口设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【2017年第1期】专题导读:大数据与信
- 下一篇: 工业大数据的应用与实践