stm32之USART学习
首先,我是看著這位博主的文章受到的啟發,進而加深了自己對USART的理解。下面是自己改裝并實驗過的程序。
原文:http://www.cnblogs.com/greatwgb/archive/2011/07/28/2119350.html
?
1.?????串口的基本概念
在STM32的參考手冊中,串口被描述成通用同步異步收發器(USART),它提供了一種靈活的方法與使用工業標準NRZ異步串行數據格式的外部設備之間進行全雙工數據交換。USART利用分數波特率發生器提供寬范圍的波特率選擇。它支持同步單向通信和半雙工單線通信,也支持LIN(局部互聯網),智能卡協議和IrDA(紅外數據組織)SIR ENDEC規范,以及調制解調器(CTS/RTS)操作。它還允許多處理器通信。還可以使用DMA方式,實現高速數據通信。
USART通過3個引腳與其他設備連接在一起,任何USART雙向通信至少需要2個引腳:接受數據輸入(RX)和發送數據輸出(TX)。
RX:?接受數據串行輸入。通過過采樣技術來區別數據和噪音,從而恢復數據。
TX:?發送數據輸出。當發送器被禁止時,輸出引腳恢復到它的I/O端口配置。當發送器被激活,并且不發送數據時,TX引腳處處于高電平。在單線和智能卡模式里,此I/O口被同時用于數據的發送和接收。
?
2.?????串口的如何工作的
一般有兩種方式:查詢和中斷。
(1)查詢:串口程序不斷地循環查詢,看看當前有沒有數據要它傳送。如果有,就幫助傳送(可以從PC到STM32板子,也可以從STM32板子到PC)。
(2)中斷:平時串口只要打開中斷即可。如果發現有一個中斷來,則意味著要它幫助傳輸數據——它就馬上進行數據的傳送。同樣,可以從?PC到STM3板子,也可以從STM32板子到PC。
?
程序源碼:
/*************************************USART(通用同步異步收發器)實驗 使用USART1實現數據的發送與接收 日期:2016.2.25******************************************/#include "stm32f10x.h"FlagStatus RX_status;//void RCC_cfg(); void GPIO_cfg(void); void USART_cfg(void); void NVIC_cfg(void);int main() {int i;unsigned char TxBuf1[] = "HELLO,QIANSHUAI,Welcome to my STM32! Please press any key!";GPIO_cfg();NVIC_cfg();USART_cfg();USART_ClearFlag(USART1,USART_FLAG_TC); //清除標志位,否則第1位數據會丟失for( i=0;TxBuf1[i]!='\0';i++) //發送數據,當有數據在發送的時候,Pg14會亮 {USART_SendData(USART1,TxBuf1[i]);GPIO_SetBits(GPIOG,GPIO_Pin_14);while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //等待數據發送完畢 GPIO_ResetBits(GPIOG,GPIO_Pin_14);}while(1);}//IO口配置 void GPIO_cfg() {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);//實驗發現,當不使能RCC_APB2Periph_USART1時,運行也不會報錯,但是串口助手顯示程序一直卡在發送狀態,led一直亮著。// GPIO_StructInit(&GPIO_InitStructure); //我的板子的例程中并沒有聲明這一句GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9作為US1的TX端,打開復用,負責發送數據GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//PA10作為US1的RX端,負責接收數據GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure);//LED2顯示串口正在發送/接收數據GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOG, &GPIO_InitStructure); }//串口初始化,在初始化USART前應該先把GPIO設置好,USART是GPIO的復用功能. void USART_cfg() {USART_InitTypeDef USART_InitStructure;USART_StructInit(&USART_InitStructure); //將結構體設置為缺省狀態 USART_InitStructure.USART_BaudRate = 115200; //波特率設置為115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //一幀數據的寬度設置為8bits USART_InitStructure.USART_StopBits = USART_StopBits_1; //在幀結尾傳輸1個停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶失能模式,無奇偶校驗 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //發送/接收使能 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制失能 USART_Init(USART1, &USART_InitStructure); //根據參數初始化串口1寄存器 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //打開串口1的中斷響應函數 USART_Cmd(USART1, ENABLE); //打開串口1 }//配置中斷 void NVIC_cfg() {NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //選擇中斷分組2 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //選擇串口1中斷NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占式中斷優先級設置為0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應式中斷優先級設置為0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷NVIC_Init(&NVIC_InitStructure); }//然后在stm32f10x_it.c文件中找到相應的中斷處理函數,并填入一下內容。 //注意在stm32f10x_it.c中,要聲明一下外部變量RX_status//extern FlagStatus RX_status;void USART1_IRQHandler(void) //中斷入口函數 {GPIO_SetBits(GPIOG, GPIO_Pin_14);//確認是否接收到數據RX_status = USART_GetFlagStatus(USART1, USART_FLAG_RXNE);//接收到數據if(RX_status == SET){//將數據回送至超級終端 USART_SendData(USART1, USART_ReceiveData(USART1));//等待數據發送完畢while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);GPIO_ResetBits(GPIOG, GPIO_Pin_14);}}?
?
這個是自己改過的程序。其實也是很簡答的。
轉載于:https://www.cnblogs.com/qsyll0916/p/6442832.html
總結
以上是生活随笔為你收集整理的stm32之USART学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DUALBOOT(双启动) 调试
- 下一篇: oracle中的decode的使用