stm32基础001(串口)
文章目录
- 通信的基本概念
- 串行通信和并行通信
- 单工,半双工和全双工
- 串口的硬件连接
- stm32的串口
- 原理图
- CPU的芯片手册
- stm32串口的库函数实现
- 通过串口实现printf函数
- 使用中断实现串口的接收
通信的基本概念
串行通信和并行通信
串行通信一个方向只有一个数据通道,一次传输一位数据,适用于传输距离较长,速度要求不是很高场合。
并行通信一个方向有多个数据通道,一次传输多位数据,适用于传输距离较短,速度要求很高的场合。
单工,半双工和全双工
单工:数据只能沿着一个方向传输
半双工:数据可以双向传输,但是不能影响同时进行
全双工:数据可以同时双向传输
通信速率:单位时间内传输的比特数,叫做波特率(bps)
通信协议(串口)
通信协议就是通信方事先约定好的数据格式
串口的硬件连接
UART—————通用异步收发器
USART————–通用同步/异步收发器
stm32的串口
原理图
USB调试串口最终连接到了CPU的PA9,PA10,这两个引脚有串口的复用功能。
CPU的芯片手册
stm32串口的库函数实现
在项目中添加库函数源码
- 开启GPIO和USART1时钟
- 将PA9、PA10配置成串口复用
GPPIO_PinAFConfig(...);
- 初始化串口
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
参数:
USARTx - 哪个串口USART_InitStruct - 串口初始化结构
typedef struct{uint32_t USART_BaudRate; //波特率 uint16_t USART_WordLength; //数据位长度 uint16_t USART_StopBits; //停止位长度 uint16_t USART_Parity; //校验方式uint16_t USART_Mode; //发送/接收模式 uint16_t USART_HardwareFlowControl; //硬件流控制} USART_InitTypeDef;
- 使能串口
USART_Cmd(....);
- 串口数据的发送和接收
发送(轮询)
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
//传入哪个串口发什么数据
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
参数:USARTx - 哪个串口USART_FLAG - 哪个标志 发送完成标志 - USART_FLAG_TXE
返回SET表示有该标志
通过串口实现printf函数
stm32的项目中可以直接使用C标准库函数,其中printf函数没有完全实现。预留了一个后门fputc,可以通过fputc往串口打印来实现printf函数。
fputc函数格式:
int fputc(int ch,FILE* f)
{while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!= SET);USART_SendData(USART1,ch);return ch;
}
注意:
-
stm32芯片上运行程序,如果主机运行了调试器,程序就会使用主机的输入输出设备,这种模式叫半主机模式,printf如果通过串口打印,必须关闭半主机模式
-
#pragma import(__use_no_semihosting)
//重定义 int fputc(int ch,FILE* f) {while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!= SET);USART_SendData(USART1,ch);return ch; }
使用中断实现串口的接收
由于串口合适发数据由自己决定,不存在无效等待的问题,无需使用中断,但是串口何时接收数据不由自己决定,如果还使用轮询会存在大量无效等待,此时要是使用中断提高效率。
串口中断和定时器中断类似,需要配置中断源开关和NVIC
NVIC_Init(...);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);