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 }