




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、通過(guò)學(xué)習(xí)USART1深入STM32F107VCT6的串口通信(2012-05-05 13:27:28) 轉(zhuǎn)載標(biāo)簽: 波特率串口引腳函數(shù)雜談分類: STM32 STM32有數(shù)個(gè)串口,每個(gè)串口都有一個(gè)自己獨(dú)立的波特率寄存器USART_BRR,通過(guò)設(shè)置該寄存器就可以達(dá)到配置不同波特率的目的,由于STM32采用分?jǐn)?shù)波特率,所以STM32的串口波特率設(shè)置范圍很寬,而且誤差很小。 在STM32的參考手冊(cè)中,串口被描述成通用同步異步收發(fā)器(USART),它提供了一種靈活的方法與
2、使用工業(yè)標(biāo)準(zhǔn)NRZ異步串行數(shù)據(jù)格式的外部設(shè)備之間進(jìn)行全雙工數(shù)據(jù)交換。USART利用分?jǐn)?shù)波特率發(fā)生器提供寬范圍的波特率選擇。它支持同步單向通信和半雙工單線通信,也支持LIN(局部互聯(lián)網(wǎng)),智能卡協(xié)議和IrDA(紅外數(shù)據(jù)組織)SIR ENDEC規(guī)范,以及調(diào)制解調(diào)器(CTS/RTS)操作。它還允許多處理器通信。還可以使用DMA方式,實(shí)現(xiàn)高速數(shù)據(jù)通信。USART通過(guò)3個(gè)引腳與其他設(shè)備連接在一起,任何USART雙向通信至少需要2個(gè)引腳:接受數(shù)據(jù)輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)。RX: 接受數(shù)據(jù)串行輸入。通過(guò)過(guò)采樣技術(shù)來(lái)區(qū)別數(shù)據(jù)和噪音,從而恢復(fù)數(shù)據(jù)。TX: 發(fā)送數(shù)據(jù)輸出。當(dāng)發(fā)送器被禁止時(shí),輸出引腳恢復(fù)到
3、它的I/O端口配置。當(dāng)發(fā)送器被激活,并且不發(fā)送數(shù)據(jù)時(shí),TX引腳處處于高電平。在單線和智能卡模式里,此I/O口被同時(shí)用于數(shù)據(jù)的發(fā)送和接收。 一般有兩種工作方式:查詢和中斷。(1)查詢:串口程序不斷地循環(huán)查詢,看看當(dāng)前有沒(méi)有數(shù)據(jù)要它傳送。如果有,就幫助傳送(可以從PC到STM32板子,也可以從STM32板子到PC)。(2)中斷:平時(shí)串口只要打開(kāi)中斷即可。如果發(fā)現(xiàn)有一個(gè)中斷來(lái),則意味著要它幫助傳輸數(shù)據(jù)它就馬上進(jìn)行數(shù)據(jù)的傳送。同樣,可以從 PC到STM3板子,也可以從STM32板子到PC注意:發(fā)動(dòng)和接受都需要配合標(biāo)志等待。只能對(duì)一個(gè)字節(jié)操作,對(duì)字符串等大量數(shù)據(jù)操作需要寫(xiě)函數(shù)使用串口所需設(shè)置:
4、RCC初始化里面打開(kāi)RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx);GPIO里面管腳設(shè)定:串口RX(50Hz,IN_FLOATING);串口TX(50Hz,AF_PP);printf函數(shù)重定義(不必理解,調(diào)試通過(guò)以備后用)需要c標(biāo)準(zhǔn)函數(shù):#include "stdio.h"增加為putchar函數(shù)。int putchar(int c) /putchar函數(shù)if (c = 'n')putchar('r'); /將printf的n變成rUSART_SendData(USART1, c); /發(fā)送字符wh
5、ile(USART_GetFlagStatus(USART1, USART_FLAG_TXE) = RESET) /等待發(fā)送結(jié)束return c; /返回值printf使用變量輸出:%c字符,%d整數(shù),%f浮點(diǎn)數(shù),%s字符串,/n或/r為換行。注意:只能用于main.c中。另外:STM32支持三個(gè)串口,在usart1默認(rèn)引腳被占用的情況下可以將usart1映射到PB0.6和PB0.7上。實(shí)現(xiàn)的方法 如下: 1、打開(kāi)GPIO的AFIO時(shí)鐘,使用stm32功能模塊之前,必須開(kāi)時(shí)鐘; 2、使能USART1的映射,
6、 3、配置USART1映射后的GPIO(PB0.6,PB0.7)具體實(shí)現(xiàn):1、在set_systm函數(shù)中添加如下模塊,打開(kāi)AFIO時(shí)鐘,使能USART1映射#ifdef USB_TO_KLINE_USART1_REMAPRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); #endif2、在set_systm函數(shù)中添加如下模塊,配置USART1映射后的GPIO#ifdef USB_TO_KLINE_USART1_REMAP
7、0; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode =
8、 GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);#else GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO
9、_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure);#endif 例: #include "stm32f10x.h"#include "stm32_eval.h" #include <stdio.h>USART_InitTypeDef USART_InitStructur
10、e; /定義結(jié)構(gòu)體類型變量void GPIO_Configuration(void); /聲明GPIO配置函數(shù)#ifdef _GNUC_ #define PUTCHAR_PROTOTYPE int _io_putchar(int ch) /此處定義為putchar應(yīng)用#else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif int main(void) SystemInit();
11、160; /配置系統(tǒng)時(shí)鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_AFIO, ENABLE); /打開(kāi)APB2功能時(shí)鐘(UART1為連接在APB2上的高速外設(shè))開(kāi)啟了串口時(shí)鐘和復(fù)用功能時(shí)鐘 GPIO_Configuration(); /調(diào)用GPIO配置函數(shù)
12、160; USART_InitStructure.USART_BaudRate = 115200; /設(shè)置USART傳輸波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; /設(shè)置USART傳輸數(shù)據(jù)位一幀為8位 USART_InitStructure.USART_StopBits
13、= USART_StopBits_1; /設(shè)置USART傳輸每幀一個(gè)停止位 USART_InitStructure.USART_Parity = USART_Parity_No; /設(shè)置USART無(wú)奇偶校驗(yàn) USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /設(shè)置USART無(wú)硬件流控制 USART_In
14、itStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;/開(kāi)啟USART發(fā)送和接受功能 USART_Init(USART1, &USART_InitStructure); /初始化USART1設(shè)置 USART_Cmd(USART1, ENABLE); /開(kāi)啟USART1 print
15、f("nr 李繼超是個(gè)好人嗎? nr"); printf("nr 回答:李繼超是個(gè)大好人! nr"); printf("nr 菏澤是個(gè)是個(gè)美麗的地方! nr"); printf("nr 發(fā)生了什么?你是猴子請(qǐng)來(lái)的救兵嗎?
16、160; nr"); printf("nr 嗯!李繼超的確是個(gè)大好人!你才魔道呢!哼! nr"); /配置輸出數(shù)據(jù) while (1) void GPIO_Configuration(void) GPIO_InitTypeDef GPIO_InitStructure; /定義結(jié)構(gòu)體變量類型 RCC_APB2PeriphClockCmd(RCC_APB2Periph
17、_GPIOA, ENABLE); /打開(kāi)GPIOA的功能時(shí)鐘 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /選擇GPIO引腳GPIO_Pin_9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /設(shè)置GPIO速率 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /設(shè)置GPIO_pin_9為 復(fù)用功能 推挽輸出
18、 GPIO_Init(GPIOA, &GPIO_InitStructure); /初始化GPIO_Pin_9設(shè)置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /選擇GPIO引腳GPIO_Pin_10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /設(shè)置GPIO_Pin_10浮空輸入 GPIO_Init(GPIOA, &GPIO_Init
19、Structure); /初始化GPIO_Pin_10設(shè)置 PUTCHAR_PROTOTYPE /重定義printf函數(shù) USART_SendData(USART1, (uint8_t) ch); /發(fā)送字符串 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) = RESET)/ 檢測(cè)是否發(fā)送完成 return
20、 ch;#ifdef USE_FULL_ASSERTvoid assert_failed(uint8_t* file, uint32_t line) while (1) #endif將AVR上的隊(duì)列串口驅(qū)動(dòng)程序修改后,運(yùn)行在STM32開(kāi)發(fā)板,采用中斷方式接收和中斷發(fā)送,并加入了緩沖收發(fā)隊(duì)列操作。由于該驅(qū)動(dòng)是用來(lái)操作西門子的TC35或MC55等通信模塊,所以加入了“等待串口接收完成”函數(shù),該函數(shù)需要一個(gè)10ms的定時(shí)進(jìn)行計(jì)數(shù)累加。#define SMS_UART0_c/*
21、60; STM32 UART1 driver* File : UART0.c* By : hjjft*/
22、60; 這里將串口1寫(xiě)作0,主要原因是AVR是串口0,為了方便移植,這里仍然稱為串口0 /static char UART0_RxBufUART0_RX_BUFFER_SIZE;static volatile unsigned char UART0_RxHead;/
23、static volatile unsigned char UART0_RxTail;static char UART0_TxBufUART0_TX_BUFFER_SIZE;/static volatile unsigned char UART0_TxHead;static volatile unsigned char UART0_TxTail;/-static volatile unsigned char Frame_counting;/* Function Name : NVIC_Configuration* Description : Co
24、nfigures Vector Table base location.* Input : None* Output : None* Return : None*/void NVIC_USART_Configuration(void) NVIC_InitTypeDef NVIC_Init
25、Structure; /* Enable the USART1 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; / NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10; / NVIC_InitStructure.NVIC_IRQChannelCmd
26、= ENABLE; NVIC_Init(&NVIC_InitStructure);void GPIO_USART_Configuration(void) GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mo
27、de_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA.10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_
28、Init(GPIOA, &GPIO_InitStructure);/* Function Name : USART_Configuration* Description : Configures the USART1.* Input : None* Output : None* Return
29、 : None*/void USART_Configuration(unsigned long baudrate) USART_InitTypeDef USART_InitStructure; USART_ClockInitTypeDef USART_ClockInitqlt; /* USART1 configuration -*/ /* USART1 configured as follow: - BaudRate = 115
30、200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals)
31、 - Receive and transmit enabled - USART Clock disabled - USART CPOL: Clock is active low - USART CPHA: Data is captured on the middle
32、0; - USART LastBit: The clock pulse of the last data bit is not output to the SCLK pin */ USART_InitStructure.USA
33、RT_BaudRate = baudrate; 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;
34、 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; / USART_Init(USART1, &USART_InitStructure); USART_ClockInitqlt.USART_Clock= USART_Clock_Disable; USART_ClockInitqlt.USART_CPOL = USART_CPOL_Low; / USART_ClockInitqlt.USART_CPHA = USART_CPHA_2Edge; /
35、60; USART_ClockInitqlt.USART_LastBit = USART_LastBit_Disable;/ USART_ClockInit(USART1,&USART_ClockInitqlt); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); USART_Cmd(USART1, ENABLE);/串口初始化void UART0_InitUART( unsigned long baudrate ) RCC_APB2PeriphClockCm
36、d(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); NVIC_USART_Configuration(); GPIO_USART_Configuration(); USART_Configuration(baudrate); UART0_RxTail = 0; UART0_RxHead = 0; UART0_TxTail = 0; UART0_TxHead = 0;/-void SIGN
37、AL_Usart0_RX(void) /接收中斷 u8 data; u8 tmphead; data = USART_ReceiveData(USART1); / Frame_counting = 0; tmphead = ( UART0_RxHead + 1 ) & UART0_RX_BUFFER_MA
38、SK; / UART0_RxHead = tmphead; / if ( tmphead = UART0_RxTail ) /這里加入隊(duì)列溢出保護(hù)
39、0; UART0_RxBuftmphead = data; /-void SIGNAL_Usart0_TX(void) /發(fā)送中斷 u8 tmptail; if ( UART0_TxHead != UART0_TxTail ) tmptail = ( UART0_TxTail + 1 ) & UART0_TX_BUF
40、FER_MASK; UART0_TxTail = tmptail; USART_SendData(USART1, UART0_TxBuftmptail); else U
41、SART_ITConfig(USART1,USART_IT_TXE,DISABLE);/ /從接收隊(duì)列讀取一個(gè)字符unsigned char UART0_ReceiveByte( void ) unsigned char tmptail; while ( UART0_RxHead = UART0_RxTail ); / tmptail
42、 = ( UART0_RxTail + 1 ) & UART0_RX_BUFFER_MASK; UART0_RxTail = tmptail; return UART0_RxBuftmptail; /將一個(gè)字節(jié)放入發(fā)送隊(duì)列void UART0_TransmitByte( char data ) unsigned char tmphead;
43、 tmphead = ( UART0_TxHead + 1 ) & UART0_TX_BUFFER_MASK; while ( tmphead = UART0_TxTail ); UART0_TxBuftmphead = data;
44、 UART0_TxHead = tmphead; USART_ITConfig(USART1,USART_IT_TXE,ENABLE);/發(fā)送一個(gè)字符串void UART0_Transmitstr( char *str) / / unsigned int i="0" while(*str)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 煙草設(shè)備智能制造與大數(shù)據(jù)分析考核試卷
- 鹽行業(yè)競(jìng)爭(zhēng)戰(zhàn)略與發(fā)展方向考核試卷
- 小學(xué)四年級(jí)數(shù)學(xué)四則運(yùn)算練習(xí)題50道
- 7-3寄存器傳輸語(yǔ)言
- 洛陽(yáng)商業(yè)職業(yè)學(xué)院《實(shí)驗(yàn)診斷E》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川省遂寧蓬溪縣聯(lián)考2024-2025學(xué)年初三5月中考模擬試題英語(yǔ)試題試卷含答案
- 四川輕化工大學(xué)《智能微電網(wǎng)控制技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古呼和浩特市賽罕區(qū)2025屆初三3月月考語(yǔ)文試題含解析
- 江西省鷹潭市余江區(qū)2024-2025學(xué)年三下數(shù)學(xué)期末檢測(cè)試題含解析
- 江西省彭澤縣湖西中學(xué)2024-2025學(xué)年普通高中教育教學(xué)質(zhì)量監(jiān)測(cè)考試(1月)生物試題含解析
- 物理跨學(xué)科實(shí)踐:制作微型密度計(jì)+課件2024-2025學(xué)年人教版物理八年級(jí)下冊(cè)
- 2024四川瀘州市公共交通集團(tuán)有限公司招聘1人筆試參考題庫(kù)附帶答案詳解
- 北京市海淀區(qū)2024年七年級(jí)下學(xué)期數(shù)學(xué)期中考試試卷(附答案)
- 兒童保健學(xué)課件:緒論
- 中小學(xué)校園安全穩(wěn)定工作崗位責(zé)任清單
- 論提高行政效率的途徑 開(kāi)題報(bào)告
- 校園安全存在問(wèn)題及對(duì)策
- NY∕T 309-1996 全國(guó)耕地類型區(qū)、耕地地力等級(jí)劃分
- 濃縮機(jī)的選擇與計(jì)算
- 滬教版六年級(jí)下冊(cè)單詞表
- 地基基礎(chǔ)軟弱下臥層驗(yàn)算計(jì)算表格
評(píng)論
0/150
提交評(píng)論