stm32_常见串口、串口通信分类、UART编程套路以及注意事项

一、常见串口

• 常见的串口有UART口(Universal Asynchronous Receiver Transmitter:通用异步收发器, 一对一,以位为单位发送)和COM( cluster communication port :串行通讯端口), 嵌入式里面说的串口,一般是指UART口。计算机上的串口常指RS232电平标准的COM口。
• UART口和COM口是指的物理接口形式(硬件),而TTL、RS-232、RS-485是指的电平标准(电信号)。
在这里插入图片描述

二、串口通信分类

按照数据传送方向分为:

• 单工:
数据传输只支持数据在一个方向上传输
• 半双工:
允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,
它实际上是一种切换方向的单工通信;
• 全双工:
允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,
它要求发送设备和接收设备都有独立的接收和发送能力。

按通信方式分为:

同步通信:带时钟同步信号传输。-SPI,IIC通信接口
异步通信:不带时钟同步信号。-UART(通用异步收发器),单总线

常见串行通信接口
在这里插入图片描述

三、UART编程套路

• (一)、配置GPIO口及UART1口 (APB2, PA9, PA10管脚)

  1. 使能Tx、Rx管脚对应的GPIO组时钟,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);
  2. 2.使能Tx、Rx管脚对应的UART时钟, RCC_APB2PeriphClockCmd(RCC_APB2Periph_ UARTx, ENABLE);
  3. 定义一个GPIO初始化结构体型的变量和一个UART初始化结构体变量
    GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure;
  4. 对GPIO初始化结构体变量的各成员赋值,设置GPIO为TX推挽复用输出模式,RX为浮空输入模式
    GPIO_InitStructure.GPIO_Pin =; GPIO_InitStructure.GPIO_Mode =; GPIO_InitStructure.GPIO_Speed =;
  5. 对UART初始化结构体变量各成员赋值,
    USART_InitStructure.USART_BaudRate =;
    USART_InitStructure.USART_WordLength =; USART_InitStructure.USART_StopBits= USART_InitStructure.USART_Parity =;USART_InitStructure.USART_Mode =;
  6. 调用初始化函数,初始化GPIO,GPIO_Init(GPIO_Pin_n, &GPIO_InitStructure);
  7. 调用初始化函数,初始化UART,USART_Init(USARTx, &USART_InitStructure);
  8. 配置串口中断优先级,使能串口中断,NVIC_Configuration(); USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
  9. 使能串口,USART_Cmd(DEBUG_USARTx, ENABLE);
    • (二)、在stm32f10x_it.c中编写UART中断程序: USART1_IRQHandler
    • (三)、在主函数中,完成其他功能编程。

四、注意事项

  1. 使用UART需要将GPIO口配置为复用模式。
  2. 使用UART需要同时打开GPIO口的时钟和UART的时钟。
  3. 如果使用UART中断,需要配置中断分组和中断优先级,并使能中断。
  4. 记住使用UART前,还需要使能UART串口通信。
  5. PC机可使用串口助手或自行编写程序(c++/python等)向串口发送和接收数据。
  6. 与PC机串口通信时,需要将PC的USB口接到开发板的UART1(战舰板USB_232口),不要与JTAG/SWD口搞混。并可能需要安装usb转串口驱动
  7. 单片机可以在程序中通过C标准库中的printf()函数向串口发送数据,但必须重定向到串口(因为C标准printf()函数是定向到屏幕,而不是串口)。格式:
///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f) {
/* 发送一个字节数据到串口 */
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return (ch);

猜你喜欢

转载自blog.csdn.net/Kattlin_gsc/article/details/106890381