STM32-CubeIDE用串口通讯

USART串口通讯

一、轮询模式

1.设置所接引脚为UART异步模式

  • 选择完成CTRL+S保存。

2.编写测试代码(自动发送hello world)

  • 在mian函数里面编写代码
  • 原函数
  • 调用函数,需要数据类型一致,使用函数通过串口发送数组里面的数据
  • 打开串口助手测试
  • 选择对应的端口,波特率需要一致。

3.编写接收数据的代码

  • 通过串口助手测试代码正常使用。

二、中断模式收发

1.打开URAT的中断功能,然后保存自动生成代码

2.使用中断发送数据

3.使用中断接收数据

  • 串口使用中断模式来接收信息,没有等待时间,如果程序写在while循环中,会有这次数据还没有接收完成就去接收下次数据的情况,所以需要将对应程序写在中断函数的回调函数中。
  • 在stm32f1xx_hal_uart.c文件中,有一个回调函数,我们可以重新定义其内容
  1. 将定义的数组改成全局变量

    /* USER CODE BEGIN PV /
    uint8_t receiveData[2];
    /
    USER CODE END PV */

  2. 复制回调函数到main.c文件中,重新定义回调函数

    /* Private user code ---------------------------------------------------------/
    /
    USER CODE BEGIN 0 */
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    HAL_UART_Transmit_IT(&huart1, receiveData, 2);
    GPIO_PinState state = GPIO_PIN_SET;
    if (receiveData[1] == '1') {
    state = GPIO_PIN_RESET;

    复制代码
     	  if (receiveData[0] == 'L') {
     		  HAL_GPIO_WritePin(GPIOB, LED_MCU_Pin, state);
     	  }
       }
    
       if (receiveData[1] == '0') {
     	  state = GPIO_PIN_SET;
    
     	  if (receiveData[0] == 'L') {
     		  HAL_GPIO_WritePin(GPIOB, LED_MCU_Pin, state);
     	  }
       }
    
       HAL_UART_Receive_IT(&huart1, receiveData, 2);				//每次执行完回调函数内容后,要继续为下次接收开启串口接收数据

    }
    /* USER CODE END 0 */

3.串口使用DMA模式接收发送数据

  • 无论用上面哪种方式,询问或者中断,都会占用CPU,所以可以使用DMA来搬运数据,等搬运完成触发中断就可以去处理。减少了对CPU的占用率。
  1. 开启DMA功能。
  2. 将串口中断函数改成DMA函数,修改其后缀即可,其他不变。

  3. 下载调试发现程序正常,正常接收发送数据。

4.串口接收不定长数据

  • 我们可以认为空闲(ldle)中断发生时,就是一帧数据包接收完成了,此时再对数据进行分析处理即可。

    复制代码
    HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));
    /* 接收空闲中断,接收长度是最大长度。而不是接收数据的长度。可以设置为数组的长度。而数组的长度要尽量大。不至于溢出 */
  • HAL_UARTEx_ReceiveToIdle_DMA对应的回调函数不是之前RxCpltCallback回调函数了,而是RxEventCallback这个回调函数了。

    void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
    if (huart == &huart1) { //判断触发的中断是哪个中断
    HAL_UART_Transmit_DMA(huart, receiveData, Size); //将接收的数据发送回去

    复制代码
      	HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));		//重新启动接收函数
      }

    }

  • 下载代码,连接电脑发送数据,单片机可以正常接收到数据并且执行RxEventCallback()函数,而不是执行RxCpltCallback()这个回调函数。

  • 上面虽然实现了功能,但是当接收数据达到接收数组的一半时,也会有产生中断,使得一半之后的数据接收不到,所以需要在接收数据之后将接收过半中断给关闭了

    复制代码
    HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));
    /* 接收空闲中断,接收长度是最大长度。而不是接收数据的长度。可以设置为数组的长度。而数组的长度要尽量大。不至于溢出 */
    __HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
相关推荐
时光の尘26 分钟前
FreeRTOS菜鸟入门(五)·空闲任务与阻塞延时的实现
c语言·stm32·嵌入式硬件·mcu·物联网·freertos
正点原子2 小时前
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——EEPROM、SPI FLASH测试 #AT24C64 #W25Q128
linux·stm32·单片机·嵌入式硬件·stm32mp257
光芒Shine4 小时前
【STM32-代码】
stm32·单片机·嵌入式硬件
冻结的鱼5 小时前
两个 STM32G0 I2C 通信异常的案例分析
stm32·单片机·嵌入式硬件
南梦也要学习6 小时前
STM32江科大----------PID算法
stm32·嵌入式硬件·算法
厉昱辰8 小时前
STM32F103C8T6 单片机入门基础知识及点亮第一个 LED 灯
stm32·单片机·嵌入式硬件
夜月yeyue8 小时前
STM32启动流程详解
linux·c++·stm32·单片机·嵌入式硬件·c#
Geek__199210 小时前
STM32 调试口STM32CUBEMX配置
stm32·单片机·嵌入式硬件
正点原子12 小时前
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——4G模块EC20测试 #MINI PCIE #GPS
功能测试·stm32·单片机·嵌入式硬件·4g模块
Despacito0o12 小时前
FreeRTOS教程 - 任务间通信:使用队列(Queue)
驱动开发·stm32·单片机·嵌入式硬件·51单片机·freertos·嵌入式实时数据库