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);
相关推荐
典则7 小时前
STM32FreeRtos入门(四)——任务状态和调度
stm32·单片机·嵌入式硬件
充哥单片机设计8 小时前
【STM32项目开源】基于STM32的智能天然气火灾监控
stm32·单片机·嵌入式硬件
充哥单片机设计8 小时前
【STM32项目开源】基于STM32的智能仓库火灾检测系统
stm32·单片机·嵌入式硬件
就叫飞六吧9 小时前
普中stm32大Dap烧录流程
stm32
A9better10 小时前
嵌入式开发学习日志38——stm32之看门狗
stm32·嵌入式硬件·学习
小莞尔11 小时前
【51单片机】【protues仿真】基于51单片机智能路灯控制系统
c语言·stm32·单片机·嵌入式硬件·51单片机
辰哥单片机设计20 小时前
TT直流减速电机(STM32)
stm32
A9better20 小时前
嵌入式开发学习日志36——stm32之USART串口通信前述
stm32·单片机·嵌入式硬件·学习
qq_4017004121 小时前
STM32低功耗Tickless模式
stm32·单片机
研猛男1 天前
0、FreeRTOS编码和命名规则
笔记·stm32·freertos