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 }
知识兔