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.917 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.1022 23 KST_USART_Structure.USART_BaudRate = 115200; //設定波特率為11520024 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); //初始化串口131 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; //搶占優先級137 KST_NVIC_Structure.NVIC_IRQChannelSubPriority = 1; //子優先級138 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); //點亮LED150 USART_SendData(USART1, res); //發送資料51 }52 if(res == '2')53 {54 GPIO_ResetBits(GPIOE, GPIO_Pin_5); //點亮LED255 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 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/36194.html
標籤:嵌入式
上一篇:什么命令可以查看顯卡獨顯大小
