stm32串口通信-HAL库

本文介绍了STM32通过串口与上位机通信的过程,包括串口分类、工作方式、CubeMX配置、HAL库函数使用以及实现特定功能如暂停和恢复发送。实验重点在于异步串行通信和中断、DMA方式的应用。
摘要由CSDN通过智能技术生成

目录

首言

本文主要内容

一、串口通信

1、分类

(1)并行通信

(2)串行通信

(3)同步串行通信

(4)异步串行通信

2、工作方式

(1)轮询方式

(2)中断方式

(3)DMA方式

二、通过CubeMX配置工程

配置RCC

配置USART

 设置时钟

 创建工程

三、代码编写

1.相关函数说明

2.具体编写

 任务一:

 任务二:

三、结果呈现

任务一:

 任务二:

四、总结

 五、参考


首言

本文主要内容

1)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。

2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;

一、串口通信

1、分类

串口通信分为串行通信和并行通信、同步串行通信、异步串行通信

(1)并行通信

适用于多位数据同时传输,这种通信方式传输控制简单,传输速率快,但是在长距离传输下硬件成本高

(2)串行通信

数据逐位传输,传输线少,长距离传输时成本低,但数据的传输控制较复杂。按照实现数据同步的方式,可以分为同步串行和异步串行两种。

(3)同步串行通信

数据传输以数据块(一组字符)为单位,在一个数据块内,字符与字符间无间隔,收发双方依靠独立的时钟线进行信号的同步。

特点:适用于大批量的数据传输。

(4)异步串行通信

数据传输以单个字符为单位,字符和字符之间的间隙任意,字符内部每一位持续的时间相同。收发双方没有专门的时钟信号,而是依靠事先约定的字符格式和通信速率来完成通信。

异步串行通信的字符格式:

 常用字符格式为:1位起始位、8位数据位、无奇偶校验、1位停止位

字符格式决定了字符中数据的传输形式。

异步串行通信的通信速率:表示的是每秒钟传送二进制数码的维数,以bit/s(bps)为单位。

波特率决定了字符中每一位数据的持续时间

2、工作方式

(1)轮询方式

CPU不断检测串口的状态标志来判断数据收发的情况。

特点:程序设计简单,但CPU在检测标志位期间,无法执行其他任务,CPU利用率较低。

(2)中断方式

使能中断后,接收一字节数据或发送一字节后申请中断,在ISR中完成后续处理。

特点:在数据收发期间,CPU可以执行其他任务,CPU利用率较高。

(3)DMA方式

初始化时设置相关参数,启动DMA传输后,数据传输过程不需要CPU的干预。传输完成后,再产生DMA中断,由CPU进行后续处理。

特点:传输效率最高。

对于stm32芯片来说,有2个DMA控制器

二、通过CubeMX配置工程

配置RCC

设置高速外部时钟HSE,然后选择外部时钟源

配置USART

使能串口(此时会自动配置输入输出串口,即PA9和PA10)设置波特率为115200,1位停止位,无校验位。

 使能中断

 设置时钟

 创建工程

三、代码编写

1.相关函数说明

HAL_UART_Transmit();//串口发送数据,使用超时管理机制
HAL_UART_Receive();//串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();//串口中断模式发送
HAL_UART_Receive_IT();//串口中断模式接收
HAL_UART_Transmit_DMA();//串口DMA模式发送
HAL_UART_Transmit_DMA();//串口DMA模式接收
HAL_UART_DMAPause();// 暂停串口DMA
HAL_UART_DMAResume(); //恢复串口DMA
HAL_UART_DMAStop(); //结束串口DMA

HAL库下的定义:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart);

2.具体编写

 任务一:

任务一只需要串口发送“hello windows!”即可,因此本文采用HAL_UART_Transmit();函数即可

对于HAL_UART_Transmit()函数的各个参数说明:

UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1  
*pData      需要发送的数据 
Size    发送的字节数
Timeout   最大发送时间,发送数据超过该时间退出发送  

结构体定义:

UART_HandleTypeDef huart1;

发送字符代码

while (1)
  {
			HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16,0xffff);
			HAL_Delay(500);
  }

 任务二:

在任务一的基础上,在主函数写下下面代码

uint8_t receivedChar;  
    if (HAL_UART_Receive(&huart1, &receivedChar, 1, 0xffff) == HAL_OK) 
			{  
      switch (receivedChar) 
			{  
        case '#':
					HAL_UART_Transmit(&huart1, (uint8_t *)"stop", 16 , 0xffff);
          break;  
        case '*':
          HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);  
          break;  
 
      }  
    }  

三、结果呈现

任务一:

烧录.hex文件:具体烧录步骤见之前的文章

设置串肉软件:

波形观察:

 任务二:

四、总结

此次实验在加入中断的串口通信实现不是很好,不能够持续发送,但是通过此次实验也学习到了很多东西,让嵌入式这个课程更加贴近于现实了。

同时也对于这个实验也收获了许多,比如在传输中要对UART_HandleTypeDef这个结构体进行重命名等。

 五、参考

(1)https://blog.csdn.net/as480133937/article/details/104827639/

(2)https://blog.csdn.net/as480133937/article/details/99073783 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值