【NUCLEO-F303RE】【HAL】STM32F303RET6学习笔记4--USART1(串口接收发送任意长度,任意格式数据)

一、 实验说明

实验硬件平台:NUCLEO-F303RE开发板
实验软件平台:MDK-5.25
实验内容:实现USART2的发送和接收 中断接收任意长度和任意格式的数据
实验的资源:(USART2_TX PA2) (USART2_RX PA3)

二、实验操作

1.硬件分析

1.NUCLEO-F303RE开发板自带的ST-Link调试器具备成串口调试功能。查看开发板的原理图,我们可以得知STM32F303RET6的PA2和PA3(USART2)和ST-Link的串口相连接。
2.检查跳线电阻SB61,SB62,SB63,SB13,SB14的情况。保证SB61,SB62,SB63处于断开状态。SB13和SB14处于连接状态。

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

2.新建工程

打开STM32CubeMX,创建名为“USART2”的工程。工程创建过程参考下面链接
【NUCLEO-F303RE】【HAL】STM32F303RET6学习笔记2–新建工程

3.时钟配置

时钟配置参考下面的链接
【NUCLEO-F303RE】【HAL】STM32F303RET6学习笔记3–创建工程以及GPIO的控制(按键控制LED灯)

3.USART2配置

1.打开Pinout&Configuration->Categories->Connectivity->USART2,选择Asynchronous。
在这里插入图片描述
2.设置参数,将波特率改成115200,其他的使用默认值
在这里插入图片描述
3.开启USART2中断。
在这里插入图片描述
4.修改管脚的别称(选做)
在这里插入图片描述

4.工程生成

配置已完成,点击“GENERATE CODE” 重新生成工程

5.代码编写

1.在usart.c中编写如下代码

/* USER CODE BEGIN 1 */

uint8_t   buff[1024];
uint16_t  buff_len=0;
uint8_t   buff_Flag=0;
void USART2_IT_Enable(void)
{
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
}

/* USER CODE END 1 */

2.在stm32fxxx_it.c中编写如下代码
不使用官方的中断处理函数
不使用官方的中断处理函数
不使用官方的中断处理函数

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
  uint8_t Res=0;
  /* USER CODE END USART2_IRQn 0 */
     //HAL_UART_IRQHandler(&huart2);   //注释这条语句,不使用HAL库的回调处理
  /* USER CODE BEGIN USART2_IRQn 1 */
    
    //判读是否为接收中断
    if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE)!=RESET))
    {
        HAL_UART_Receive(&huart2,&Res,1,1000);
        buff[buff_len]=Res;
        buff_len++;
    }
    //判读是否为溢出中断
    if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_ORE)!=RESET))
    {
        __HAL_UART_CLEAR_IT(&huart2,UART_CLEAR_OREF);
    }
    //判读是否为接收空闲中断
    if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET))
    {
        __HAL_UART_CLEAR_IT(&huart2,UART_CLEAR_IDLEF);
        buff_Flag=1;
    }
  /* USER CODE END USART2_IRQn 1 */
}

3.在main.c中编写如下代码

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  USART2_IT_Enable();  //使能一些中断
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    if(buff_Flag==1)
    {
      HAL_UART_Transmit(&huart2 ,buff,buff_len,0xffff);
      buff_Flag=0;
      buff_len=0;   
    }
  }
  /* USER CODE END 3 */

三、实验结果

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

四 、实验总结

不使用的官方提供的中断处理函数的原因是:官方提供的中断处理函数逻辑太过复杂,函数处理是占用的资源过大。在使用115200波特的的情况下,发送速度过快时(50ms),极其容易造成程序卡死,而且无法恢复(本人研究了好久,也参考了网上的一些说明,但是一直无法解决,所以参考标准库的写法)。初步怀疑是官方中断服务函数占用的时间过长,导致上次接收中断还没用处理完,下一次中断就被触发了。若是你有好的处理方法,可在评论区交流下。

五、实验代码

实验代码下载

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值