一、串口通信接口基本知识
1、处理器与外部设备通信的两种方式:
传输原理:数据各个位同时传输
优点:速度快
缺点:占用引脚资源多
传输原理:数据按位顺序传输。
优点:占用引脚资源少
缺点:速度相对较慢
2、串行通信 三种传达方式
单工:数据传输只支持数据在一个方向上传输
半双工: 允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信
全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力 3、串行通信的通信方式
- 同步通信:带时钟同步信号传输。
—— SPI,IIC 通信接口 - 异步通信:不带时钟同步信号。
—— UART(通用异步收发器),单总线
常用的串口通信接口:
- UART:通用异步收发器
- USART:通用同步异步收发器
大容量 STM32F10x 系列芯片,包含3个 USART 和2个 UART。 4、异步通信方式特点: 5、串口通信过程
二、串口寄存器库函数配置
1、STM32 串口常用寄存器和库函数
- 常用的串口相关寄存器
USART_SR 状态寄存器 USART_DR 数据寄存器 USART_BRR 波特率寄存器 - 串口操作相关库函数
void USART_Init();
void USART_Cmd();
void USART_ITConfig();
void USART_SendData();
uint16_t USART_ReceiveData();
FlagStatus USART_GetFlagStatus();
void USART_ClearFlag();
ITStatus USART_GetITStatus();
void USART_ClearITPendingBit();
2、串口一般配置步骤
串口时钟使能,GPIO时钟使能: RCC_APB2PeriphClockCmd();
串口复位: USART_DeInit(); 这一步不是必须的
GPIO 端口模式设置: GPIO_Init(); 模式设置为GPIO_Mode_AF_PP
串口参数初始化: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_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
main.c
#include "stm32f10x.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "delay.h"
void My_USART(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler()
{
u8 res;
if(USART_GetITStatus(USART1, USART_IT_RXNE))
{
res = USART_ReceiveData(USART1);
USART_SendData(USART1, res);
}
}
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
My_USART();
while(1);
}
串口通信的基本步骤:
1、使能相应的时钟
RCC_APB2PeriphClockCmd
2、初始化 IO 口
GPIO_Init
3、初始化串口
USART_Init
4、串口使能
USART_Cmd
5、开启接收中断
USART_ITConfig
6、设置相应的中断,中断优先级设置
NVIC_Init
写中断服务函数:文件名在启动文件中 (USART1_IRQHandler)
USART1_IRQHandler
|