芯查查logo
  • 数据服务
    1. 新产品
    2. 物料选型
    3. 查替代
    4. 丝印反查
    5. 查品牌
    6. PCN/PDN
    7. 查方案
    8. 查代理
    9. 数据合作
  • SaaS/方案
      SaaS产品
    1. 供应链波动监控
    2. 半导体产业链地图
    3. BOM管理
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
  • 开通会员
基于STM32H533开发板记录 串口中断调试
原创 发布时间:2024/10/29 16:17
版块:
每日打卡
简介:串口中断调试

编译软件:MDK5.38a,调试器使用板载的ST-linkV3(速度要快很多)

一:利用STM32cubeMX配置一下,串口的初始化;

查看一下原理图:

STM32H533RB使用的串口2,引脚使用PA3,PA4引脚

 

ST-linkV3调试器版图:

打开STM32cubeMX软件配置一下串口2的底层驱动部分

 

串口2配置完成后,点击“generate code”,底层驱动就配置好了;

 (stm32cube软件的基本使用,在之前的帖子中已经介绍过这里就不过多的进行介绍)

 

二:代码编码的具体过程

 

首先串口时钟使能,GPIO时钟使能:    __HAL_RCC_USART2_CLK_ENABLE();

                              GPIO端口模式设置:    __HAL_RCC_GPIOA_CLK_ENABLE();

串口参数初始化:   HAL_UART_Init(&huart2)

开启中断并且初始化    HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);                                                                     HAL_NVIC_EnableIRQ(USART2_IRQn);

串口初始化部分:

 

void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
	
	

  /* USER CODE BEGIN USART2_Init 2 */
	  HAL_UART_Receive_IT(&huart2, &rxBuffer[0], 1);  //再开启接收中断	
  /* USER CODE END USART2_Init 2 */

}

 

 使能串口中断函数:

编写串口发送、接收中断函数:

void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)//串口中断回调函数
{

    uint8_t temp =0;     
    if (huart == &huart2)    
    {
        temp = USART2->RDR; 
				HAL_UART_IRQHandler(&huart2); 
 HAL_UART_Receive_IT(&huart2, &rxBuffer[receivedIndex], 1);  //开启接收中断
/*串口发送正常函数*/
				HAL_UART_Transmit(&huart2, (uint8_t *)&temp, 1, 1);
			
/*利用串口发送中断,导致少发送字节,*/			
//				HAL_UART_Transmit_IT(&huart2,&temp,1);
			
//        HAL_UART_Receive_IT(&huart2, &rxBuffer[receivedIndex], 1);  //开启接收中断
    }
}

 

注意需要在串口初始化中编写,串口接收中断函数,否则串口2的中断部分不能正常进入。

 

正常的交互如下所示:

用该函数发送会出现HAL_UART_Transmit_IT(&huart2,&temp,1);

然后我查了一下两个函数的区别:

HAL_UART_Transmit为阻塞式发送函数,意思就是说发送数据时候会一直等待数据发送完成后才会返回。

而HAL_UART_Transmit_IT 是非阻塞式的发送函数,即发送数据时候,不会等待数据发送完成,而是立即返回,数据发送完成后会触发中断函数。

因此,如果使用HAL_UART_Transmit发送数据时候,程序会一直阻塞在该函数处,直到数据发送完成后才会继续执行下一条指令,而如果使用HAL_UART_Transmit_IT发送数据,则程序会立即返回,可以指继续执行下一条质量,数据发送完成后会触发中断函数,在中断函数中进行数据发送完成后的处理。

所以在我们使用的串口发送数据,需要根据当前函数操作进行判断使用哪种发送函数,如果数据量不大的情况下,可以使用HAL_UART_Transmit,如果数据量较大的情况下,可以使用串口接收的空闲中断方式,待接收完成所有的数据包后,在进行数据的发送,或者是使用CPU资源,使用DMA的方式进行发送数据。

 

 

 

 

 

 

 

 

2024/10/29 16:17
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
发布者
聪聪哥哥
最新帖子
LDO串联或并联二极管有什么用?电路保护与特殊应用解析缝纫机伺服0.3秒启停稳如磐石:三招驯服“针位漂移”顽疾伺服电机过载预警:从电流纹波揪出轴承暗伤的猎杀方案芯片丝印反查求助树莓派pico 2测评 - 串口
热门版块
查看更多
问型号
问技术
问行情
电子元器件
专家问答
麦博大学堂
维修技术
汽车电子工程师论坛
工业电子专区
新手入门指南

102

收藏

分享

微信扫码
分享给好友

评论