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 }