STM32串口通信(F1系列包含3個USART和2個UART) 一、單片機與PC機串列通信研究目的和意義: 單片機自誕生以來以其性能穩定,價格低廉、功能強大、在智能儀器、工業裝備以及日用電子消費產品中得到了廣泛的應用。在單片機的輸入輸出控制中,除直接接上小鍵盤和LCD顯示屏等方法外,一般都通過串口和 ...
STM32串口通信(F1系列包含3個USART和2個UART)
一、單片機與PC機串列通信研究目的和意義:
單片機自誕生以來以其性能穩定,價格低廉、功能強大、在智能儀器、工業裝備以及日用電子消費產品中得到了廣泛的應用。在單片機的輸入輸出控制中,除直接接上小鍵盤和LCD顯示屏等方法外,一般都通過串口和上位機PC進行通信。這樣不僅能夠實現遠程式控制制,而且能夠利用PC機強大的數據處理功能以及友好的控制界面。在一般的利用PC機對單片機進行控制的場合,都是採用操作系統作為上位機的平臺,其優點是界面友好,編程和操作都比較容易。因此PC機與單片機串列通信具有重要的現實及工業意義。
UART : Universal Asynchronous Receiver/Transmitter 通用非同步收發器
USART : Universal Synchronous Asynchronous Receiver/Transmitter 通用同步/非同步收發器
串列通信
按數據傳送方向:
a、單工:數據傳輸只支持數據在一個方向上傳輸
b、半雙工:允許數據在兩個方向上傳輸,但是,在某一時刻,只允許數據在一個方向上傳輸,它實際上是一種切換方向的單工通信
c、全雙工:允許數據同時在兩個方向上傳輸,因此全雙工通信是兩個單工通信方式的結合,他要求發送設備和接收設備都由獨立的接收和發送能力。
按串列通信的通信方式:
a、同步通信:帶時鐘同步信號傳輸 SPI,IIC通信介面
b、非同步通信:不帶時鐘同步信號傳輸 UART(同步非同步收發器),單匯流排
USART:1、2、3 UART:4、5
二、串口通信過程
三、STM32F10x程式設計
本程式的功能是通過串口給STM32發送‘1‘,點亮LED1,發送’2‘,點亮LED2。接收數據同時單片機將接收到的數據發回給電腦
子函數
1 #include "my_usart.h" 2 #include "stm32f10x.h" 3 4 void My_USART1_Init(void) 5 { 6 GPIO_InitTypeDef KST_GPIO_Structure; 7 USART_InitTypeDef KST_USART_Structure; 8 NVIC_InitTypeDef KST_NVIC_Structure; 9 10 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA時鐘 11 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART1時鐘 12 13 KST_GPIO_Structure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推輓輸出 14 KST_GPIO_Structure.GPIO_Pin = GPIO_Pin_9; 15 KST_GPIO_Structure.GPIO_Speed = GPIO_Speed_10MHz; 16 GPIO_Init(GPIOA, &KST_GPIO_Structure); //初始化GPIOA.9 17 18 KST_GPIO_Structure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入 19 KST_GPIO_Structure.GPIO_Pin = GPIO_Pin_10; 20 KST_GPIO_Structure.GPIO_Speed = GPIO_Speed_10MHz; 21 GPIO_Init(GPIOA, &KST_GPIO_Structure); //初始化GPIOA.10 22 23 KST_USART_Structure.USART_BaudRate = 115200; //設置波特率為115200 24 KST_USART_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬體數據流控制 25 KST_USART_Structure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; //收發模式 26 KST_USART_Structure.USART_Parity = USART_Parity_No; //無奇偶校驗位 27 KST_USART_Structure.USART_StopBits = USART_StopBits_1; //一個停止位 28 KST_USART_Structure.USART_WordLength = USART_WordLength_8b; //字長為8位數據模式 29 30 USART_Init(USART1, &KST_USART_Structure); //初始化串口1 31 USART_Cmd(USART1, ENABLE); //使能串口 32 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //開啟中斷 33 34 KST_NVIC_Structure.NVIC_IRQChannel = USART1_IRQn; 35 KST_NVIC_Structure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 36 KST_NVIC_Structure.NVIC_IRQChannelPreemptionPriority = 1; //搶占優先順序1 37 KST_NVIC_Structure.NVIC_IRQChannelSubPriority = 1; //子優先順序1 38 NVIC_Init(&KST_NVIC_Structure); //根據指定的參數初始化NVIC寄存器 39 } 40 41 void USART1_IRQHandler(void) //串口1終端服務函數 42 { 43 u8 res; 44 if(USART_GetITStatus(USART1, USART_IT_RXNE)) //接收中斷 45 { 46 res = USART_ReceiveData(USART1); //讀取接收到的數據 47 if(res == '1') 48 { 49 GPIO_ResetBits(GPIOB, GPIO_Pin_5); //點亮LED1 50 USART_SendData(USART1, res); //發送數據 51 } 52 if(res == '2') 53 { 54 GPIO_ResetBits(GPIOE, GPIO_Pin_5); //點亮LED2 55 USART_SendData(USART1, res); //發送數據 56 } 57 58 } 59 }
主函數
1 #include "stm32f10x.h" 2 #include "my_usart.h" 3 #include "led.h" 4 5 int main(void) 6 { 7 LED_Init(); //LED初始化 8 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先順序,2位響應優先順序 9 My_USART1_Init(); //串口初始化 10 while(1); 11 }