参考海创电子STM32视频。
一、串口相关理论知识
1.USART与UART
UART (universal asynchronous receiver and transmitter):通用异步收发器
UART:一般只能用于异步串行通讯。
USART(universal synchronous asynchronous receiver and transmitter):通用同步和异步收发器
USART:既可以用于同步串行通讯,也能用于异步串行通讯。
2.通信方式
串口通信
传输原理:数据按位顺序传输。
优点:占用引脚资源少,传送距离长,抗干扰能力强。
缺点:速度相对较慢。
因此串口通信的应用较为广泛。
并行通信
原理:数据各个位同时传输。
优点:速度快。
缺点:占用引脚资源多,传送距离短。
3.传送模式
串口通信有三种传送模式:单工模式、半双工模式、全双工模式
- 单工模式是指在通信双方中,一方只负责发送,另一方只负责接收。例如广播,喇叭只负责接受信号进行广播,不能发信号给设备另一端。
- 半双工模式是指在通信双方中,一方在发送数据的过程中不能接受另一方传过来的数据,另一方在接受数据的过程中不能发送数据。例如常用的对讲机,在一方讲的过程中另一方只能听,只能等一方讲完了才能让另一方讲。
- 全工模式是指在通信双方中,双方可以同时传送数据,比如人手一个的手机,可以边听边讲。
4.同步与异步
同步:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
二、串口通信功能的实现
1.编写流程
- 串口时钟、GPIO时钟使能 RCC_APB2PeriphClockCmd();
- GPIO端口模式设置 GPIO_Init();
- 串口参数初始化 USART_Init();
- 开启中断并且初始化NVIC NVIC_Init();USART_ITConfig();
- 使能串口 USART_Cmd();
- 编写中断处理函数 USARTX_IRQHandler();
串口数据收发:
void USART_SendData();
uint16_t USART_ReceiveData();
串口传输状态:
FlagStatus USART_GetFlagStatus(USART_TypeDef*USARTx, uint16_t USART_FLAG);
void USART_ClearFlag(USART_TypeDef*USARTx,uint16_t USART_FLAG);
ITStatus USART_GetITStatus(USART_TypeDef*USARTx, uint16_t USART IT);
void USART_ClearITPendingBit(USART_TypeDef*USARTx, uint16_t USART_IT);
三、串口简单通信实验
usart1.h
#ifndef __MY_USART1_H
#define __MY_USART1_H
#include "stm32f10x.h"
#define USART1_GPIO_PIN_TX GPIO_Pin_9
#define USART1_GPIO_PIN_RX GPIO_Pin_10
void My_usart1(void);
#endif
usart1.c
/******************
1、串口时钟、GPIO时钟使能
2、GPIO端口模式设置
3、串口参数初始化
4、开启中断并且初始化NVIC
5、使能串口
6、编写中断处理函数
******************/
#include "sys.h"//包含需要的头文件
void My_usart1(void)
{
//定义结构体变量
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART1_InitStruct;
//1、串口时钟、GPIOA时钟使能
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
//2、GPIO端口模式设置
GPIO_InitStruct.GPIO_Pin = USART1_GPIO_PIN_TX;//PA9
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//推挽复用输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = USART1_GPIO_PIN_TX;//PA10
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
//GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//3、串口参数初始化
USART1_InitStruct.USART_BaudRate = 9600;
USART1_InitStruct.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
USART1_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
USART1_InitStruct.USART_Parity = USART_Parity_No;
USART1_InitStruct.USART_StopBits = USART_StopBits_1;
USART1_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART1_InitStruct);
//4、开启中断并且初始化NVIC
//5、使能串口
USART_Cmd(USART1,ENABLE);
//6、编写中断处理函数
}
main.c
#include "stm32f10x.h" // Device header
#include "my_usart1.h"
int main(void)
{
My_usart1();
USART_SendData(USART1,'H');
while (1)
{
}
}