stm32基础001(串口)

文章目录

通信的基本概念

串行通信和并行通信

串行通信一个方向只有一个数据通道,一次传输一位数据,适用于传输距离较长,速度要求不是很高场合。

并行通信一个方向有多个数据通道,一次传输多位数据,适用于传输距离较短,速度要求很高的场合。

单工,半双工和全双工

单工:数据只能沿着一个方向传输

半双工:数据可以双向传输,但是不能影响同时进行

全双工:数据可以同时双向传输

通信速率:单位时间内传输的比特数,叫做波特率(bps)

通信协议(串口)

通信协议就是通信方事先约定好的数据格式

串口的硬件连接

UART---------------通用异步收发器

USART--------------通用同步/异步收发器

stm32的串口

原理图



USB调试串口最终连接到了CPU的PA9,PA10,这两个引脚有串口的复用功能。

CPU的芯片手册
stm32串口的库函数实现

在项目中添加库函数源码

  • 开启GPIO和USART1时钟
  • 将PA9、PA10配置成串口复用
c 复制代码
GPPIO_PinAFConfig(...);
  • 初始化串口
c 复制代码
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;
  • 使能串口
c 复制代码
USART_Cmd(....);
  • 串口数据的发送和接收

发送(轮询)

c 复制代码
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函数格式:

c 复制代码
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)

    c 复制代码
    //重定义
    int fputc(int ch,FILE* f)
    {
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!= SET);
        USART_SendData(USART1,ch);
        return ch;
    }
使用中断实现串口的接收

由于串口合适发数据由自己决定,不存在无效等待的问题,无需使用中断,但是串口何时接收数据不由自己决定,如果还使用轮询会存在大量无效等待,此时要是使用中断提高效率。

串口中断和定时器中断类似,需要配置中断源开关和NVIC

c 复制代码
NVIC_Init(...);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
相关推荐
芯片和软件研究所3 小时前
【tinyGTC】北斗授时授频 GPSDO 驯服钟的PPS和10M时钟测量
单片机·嵌入式硬件·北斗·时间同步·时频技术·授时·信号测量
Escene20214 小时前
Realtek HoneyGUI (1)
单片机·嵌入式硬件·物联网
波特率1152005 小时前
FreeRTOS当中的Mail Queue使用教程(CMSIS_v1)
单片机·操作系统·freertos
三佛科技-134163842127 小时前
FT32F103系列与APM32F103,STM32F103之间的对比,能否替换?
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
李永奉7 小时前
杰理可视化SDK开发-蓝牙的可发现可连接和回连
单片机·嵌入式硬件·物联网·语音识别
【ql君】qlexcel9 小时前
Visual Studio Code开发STM32设置头文件宏定义uint32_t报错
vscode·stm32·vs code·头文件宏定义·uint32_t报错·uint8_t报错·uint16_t报错
振浩微433射频芯片9 小时前
标签界的“千里眼”:VRT5312,150cm超远读写距离,重新定义RFID新可能!
科技·单片机·嵌入式硬件·物联网
染予11 小时前
定时器时钟源介绍
单片机·嵌入式硬件
时空自由民.11 小时前
ESP32编译固件内存信息解读
单片机·性能优化
LCMICRO-1331084774611 小时前
长芯微LPS6288完全P2P替代TPS61288,是一款具有 15A 开关电流的全集成同步升压转换器
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·同步升压转换器