stm32——串口(USART)

张开发
2026/5/8 16:27:57 15 分钟阅读

分享文章

stm32——串口(USART)
stm32通信接口综述一下名称引脚方向时钟电平设备USARTTX/RX全双工异步TTL电平点对点I2CSDA/SCL半双工同步TTL电平多设备SPISCLK/MOSI/MISO/CS全双工同步TTL电平多设备CANCAN_H/CAN_L半双工异步差分电平多设备USBD/D-半双工异步差分电平点对点简单解释一下全双工与半双工的区别在于通信的方向性。全双工通信允许同时进行数据的发送和接收而半双工通信则只能在同一时间内进行数据的发送或接收不能同时进行。同步与异步的区别在于通信的时钟信号。同步通信需要一个共享的时钟信号来协调数据的传输而异步通信则不需要共享时钟需要通信双方约定采样频率还需要添加一些采样位置对齐的帧。TTL电平是相对于GND的电平差所以TTL其实还需要GND而差分电平是两个信号线的差.串口通信结构设备2设备1电源地发送数据接收数据vccGNDTXRXvccGNDTXRX1. USART通用同步异步收发传输器USART是一种常用的串行通信接口支持同步和异步两种通信模式。相较于U A R T多了时钟输出。UART通用异步收发传输器是USART的一种异步通信模式常用于串口通信。它通过TX发送和RX接收引脚进行数据传输支持全双工通信。USART基本结构接收控制器发送控制器PCLK2/1波特率发生器发送数据寄存器TDR发送位移寄存器接收数据寄存器RDR接收位移寄存器GPIO1TXRXGPIO2linux 查看串口lsusb#查看USB设备dmesg|grepch341#查看内核日志中与tty相关的信息[63809.198053]usb2-1: ch341-uart converter now attached to ttyUSB0# 查看其映射在ttyusb0上ls/dev/tty*权限问题无法访问串口ls -l /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 0 3月 20 18:51 /dev/ttyUSB0这里查看ttyUSB0属于dialout组 所以要将user加入dialout组才可以使用串口调试简单来个例子先上代码简单初始化一下voidUART_Init(void){// UART 初始化代码__HAL_RCC_USART1_CLK_ENABLE();// 使能 USART1 时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 使能 GPIOA 时钟//初始化GPIO引脚GPIO_InitTypeDef GPIO_Init{0};GPIO_Init.ModeGPIO_MODE_AF_PP;// 复用推挽输出GPIO_Init.PinGPIO_PIN_9;GPIO_Init.PullGPIO_NOPULL;GPIO_Init.SpeedGPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA,GPIO_Init);// 初始化 GPIOA9usart.InstanceUSART1;// 选择 USART1usart.Init.BaudRate115200;// 设置波特率usart.Init.WordLengthUSART_WORDLENGTH_8B;// 8位数据位usart.Init.StopBitsUSART_STOPBITS_1;// 1位停止位usart.Init.ParityUSART_PARITY_NONE;// 无奇偶校验usart.Init.ModeUSART_MODE_TX;// 使能发送和接收usart.Init.CLKPolarityUSART_POLARITY_LOW;// 时钟极性低usart.Init.CLKPhaseUSART_PHASE_1EDGE;// 时钟相位第一边沿usart.Init.CLKLastBitUSART_LASTBIT_DISABLE;// 不输出最后一位时钟HAL_USART_Init(usart);// 初始化 USART1}voidSend_Byte(uint8_tbyte){HAL_USART_Transmit(usart,byte,1,HAL_MAX_DELAY);// 发送一个字节while(HAL_USART_GetState(usart)!HAL_USART_STATE_READY);// 等待发送完成}主函数简单一个发送测试一下intmain(void){HAL_Init();OLED_Init();MX_GPIO_Init();UART_Init();Send_Byte(0x41);while(1){}}封装一个发送数组函数voidSend_Array(uint8_t*array,uint16_tsize){uint16_ti;for(i0;isize;i){Send_Byte(array[i]);// 逐字节发送数组}}uint8_tstr[]Hello, UART!;这里可能有疑问为什么uint可以使用字符串。字符串其实就是一个字符数组字符在C语言中是以ASCII码的形式存储的所以可以使用uint8_t类型来表示字符串中的每个字符。Send_Array(str,sizeof(str)-1);// 发送字符串减去1是为了不发送末尾的\0

更多文章