STM32的USART串口通讯~使用HAL库(查询方式)


一、USART介绍

USART/UART通信是STM32的一个非常重要的外设,是一种通用串行数据总线,可实现全双工通信。
UART:通用异步收发器,
USART:通用同步/异步收发器,
可以看出USART比UART多了一个同步模式。

异步通信
异步通信是按字符传输的。每传输一个字符就用起始位来进来收、发双方的同步。不会因收发双方的时钟频率的小的偏差导致错误。
这种传输方式利用每一帧的起、止信号来建立发送与接收之间的同步。特点是:每帧内部各位均采用固定的时间间隔,而帧与帧之间的间隔时随即的。接收机完全靠每一帧的起始位和停止位来识别字符时正在进行传输还是传输结束。
同步通信
进行数据传输时,发送和接收双方要保持完全的同步,因此,要求接收和发送设备必须使用同一时钟。
优点是可以实现高速度、大容量的数据传送;缺点是要求发生时钟和接收时钟保持严格同步,同时硬件复杂。

本文使用异步通信

二、STM32CubeMX及Keil的使用

2.1 STM32CubeMX配置环境

我们还是选择使用STM32F103C8芯片

  • 选择USART1

在这里插入图片描述

  • Mode选择异步通信(Asynchronous)
  • 波特率为115200,1位停止位,无校验位

在这里插入图片描述
在这里插入图片描述

  • 创建项目

在这里插入图片描述

  • 生成独立的.c和.h文件

在这里插入图片描述

  • 右上角GENERATE CODE创建工程文件

2.2 Keil MDK 生成.Hex文件

  • main函数中添加函数
    在这里插入图片描述

我们要使用的是查询方式来进行串口通讯,我们需要使用HAL库中HAL_UART_Transmit()函数

在这里插入图片描述
main函数中定义

	uint8_t hello[20]="hello world\n";

while语句中添加

	HAL_UART_Transmit(&huart1,hello,20,100000);

之后编译、构建,生成.hex文件

2.3 烧录

在这里插入图片描述

  • 注意烧录时芯片BOOTO置于1

三、实现

  • 打开串口调试助手,这里我使用的是XCOM

在这里插入图片描述

  • 调试时芯片BOOTO要置0,也需要按RESET键
  • 结果如下
    在这里插入图片描述

四、总结

HAL的函数很方便,HAL_UART_Transmit()函数,掌握查询方式输出。


参考文章:

【1】【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解
【2】STM32CubeMX-USART/UART通信

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用STM32的标准外设库(StdPeriph)进行串口通信的示例代码: ```c #include "stm32f10x.h" #define USART1_TX_PIN GPIO_Pin_9 #define USART1_RX_PIN GPIO_Pin_10 void USART1_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能USART1和GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置USART1的引脚 GPIO_InitStructure.GPIO_Pin = USART1_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = USART1_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1 USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); // 配置USART1中断 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 使能USART1接收中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能USART1 USART_Cmd(USART1, ENABLE); } void USART1_SendChar(char ch) { // 等待发送缓冲区为空 while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) ; // 发送一个字节数据 USART_SendData(USART1, ch); } char USART1_ReceiveChar(void) { // 等待接收缓冲区非空 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) ; // 读取接收到的数据 return USART_ReceiveData(USART1); } int main(void) { USART1_Init(115200); while (1) { // 接收到的数据原样发送回去 char ch = USART1_ReceiveChar(); USART1_SendChar(ch); } } void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { // 在此处理接收中断 } } ``` 这段代码使用USART1进行串口通信,初始化函数USART1_Init配置了波特率、引脚和中断。USART1_SendChar和USART1_ReceiveChar函数分别用于发送和接收一个字节的数据。在主函数中,接收到的数据会原样发送回去。你可以根据需要进行修改。请注意,此代码使用的是STM32F10x系列微控制器,如果你使用的是不同的型号,请根据具体型号修改对应的寄存器和引脚定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值