OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7292|回复: 6

HAL库双串口接收数据一段时间进入HardFault_Handler

[复制链接]

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-8-13
在线时间
20 小时
发表于 2022-9-1 14:06:01 | 显示全部楼层 |阅读模式
5金钱
使用的cubeMX设置的串口1,3。在接收数据一段时间后会进入HardFault_Handler中断,查看上一级错误是串口中断读SR寄存器的函数。并且SR寄存器开始C0和F8反复就是ORE和IDLE一直反复置位。
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */

  4. uint16_t ADC_Value1,i;

  5.   /* USER CODE END 1 */

  6.   /* MCU Configuration--------------------------------------------------------*/

  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  8.   HAL_Init();

  9.   /* USER CODE BEGIN Init */

  10.   /* USER CODE END Init */

  11.   /* Configure the system clock */
  12.   SystemClock_Config();

  13.   /* USER CODE BEGIN SysInit */

  14.   /* USER CODE END SysInit */

  15.   /* Initialize all configured peripherals */
  16.   MX_GPIO_Init();
  17. //  MX_DMA_Init();
  18. //  MX_ADC_Init();
  19.         OLED_Init();
  20.         OLED_Display_Info();       
  21.         HAL_Delay(1000);//êí·Å′®¿úbuffer
  22.   MX_USART1_UART_Init();
  23.   MX_USART3_UART_Init();
  24. //  /* USER CODE BEGIN 2 */
  25.   HAL_UART_Receive_IT(&huart1, (uint8_t *)&VOC_aRxBuffer, 1);
  26.         HAL_UART_Receive_IT(&huart3, (uint8_t *)&C6H6_aRxBuffer, 1);
  27. //        __HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
  28. //        __HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR);
  29.   /* USER CODE END 2 */
  30. //HAL_ADC_Start_DMA(&hadc,(uint32_t *)&AD_Buf,2);//??ADC?DMA,?????????

  31.   /* Infinite loop */
  32.   /* USER CODE BEGIN WHILE */
  33.   while (1)
  34.   {
  35.     /* USER CODE END WHILE */
  36.   
  37.     /* USER CODE BEGIN 3 */
  38.   }
  39.   /* USER CODE END 3 */
  40. }



  41. /* USER CODE BEGIN 4 */
  42. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  43. {
  44.   /* Prevent unused argument(s) compilation warning */
  45.   UNUSED(huart);
  46.   /* NOTE: This function Should not be modified, when the callback is needed,
  47.            the HAL_UART_TxCpltCallback could be implemented in the user file
  48.    */
  49. //$033563511000000491000000001008390105

  50.                  if(huart==&huart1)
  51.         {
  52.          VOC_RxBuffer[UART1_RX_CONT++] = VOC_aRxBuffer;                   //½óêÕêy¾Y×a′æ       
  53.                 if((1<UART1_RX_CONT)&&(UART1_RX_CONT<=8))
  54.                 Checksum1=Checksum1+VOC_RxBuffer[UART1_RX_CONT-1];
  55.                 if(UART1_RX_CONT==9)
  56.                 {                               
  57.                         Checksum1=~Checksum1+1;
  58.                         if(VOC_RxBuffer[UART1_RX_CONT-1]==Checksum1)
  59.                         {
  60.                                 Value_VOC=        VOC_RxBuffer[4]*256+VOC_RxBuffer[5];
  61.                                 OLED_Display_Date(38,0,(uint32_t)Value_VOC);
  62.                                 OLED_Display_Date(38,40,AD_Buf[0]);
  63.                                 memset(VOC_RxBuffer,0,sizeof(VOC_RxBuffer));
  64.                                 UART1_RX_CONT = 0;
  65.                                 Checksum1=0;
  66.                         }
  67.                        
  68.                 }
  69.                
  70.                 HAL_UART_Receive_IT(&huart1, (uint8_t *)&VOC_aRxBuffer, 1);   //&#212;ù&#191;a&#198;&#244;&#189;óê&#213;&#214;D&#182;&#207;
  71.         }
  72.        
  73.                 else if(huart==&huart3)
  74.          {
  75.                  C6H6_RxBuffer[UART3_RX_CONT++] = C6H6_aRxBuffer;                                                                   //&#189;óê&#213;êy&#190;Y×a′&#230;       
  76.      
  77.                 if((1<UART3_RX_CONT)&&(UART3_RX_CONT<=9))
  78.                 Checksum3=Checksum3+C6H6_RxBuffer[UART3_RX_CONT-1];
  79.                 if(UART3_RX_CONT==10)
  80.                 {                               
  81.                         Checksum3=Checksum3-1;
  82.                         if(C6H6_RxBuffer[UART3_RX_CONT-1]==Checksum3)
  83.                         {
  84.                                 Value_C6H6=        C6H6_RxBuffer[4]*256+C6H6_RxBuffer[5];
  85.                                 OLED_Display_Date(38,20,(uint32_t)Value_C6H6);
  86.                                 memset(VOC_RxBuffer,0,sizeof(VOC_RxBuffer));
  87.                                 UART3_RX_CONT = 0;
  88.                                 Checksum3=0;
  89.                         }
  90.                                                
  91.           }
  92.                  HAL_UART_Receive_IT(&huart3, (uint8_t *)&C6H6_aRxBuffer, 1);   //&#212;ù&#191;a&#198;&#244;&#189;óê&#213;&#214;D&#182;&#207;
  93.                
  94.          }
  95.                                  
  96.                                         
  97. }  

  98. /* ????????,????overrun?? */
  99. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
  100. {
  101.     uint8_t i = 0;

  102.     if(huart == &huart1)
  103.         {
  104.                 __HAL_UNLOCK(huart);
  105.                 __HAL_UART_CLEAR_OREFLAG(huart);
  106.                 HAL_UART_Receive_IT(&huart1,&VOC_aRxBuffer,1);
  107.                
  108. }
  109.            else if(huart == &huart3)
  110.         {
  111.                 __HAL_UNLOCK(huart);
  112.                 __HAL_UART_CLEAR_OREFLAG(huart);
  113.                 HAL_UART_Receive_IT(&huart3,&C6H6_aRxBuffer,1);
  114.                
  115. }
  116. }


  117. #include "usart.h"

  118. /* USER CODE BEGIN 0 */

  119. /* USER CODE END 0 */

  120. UART_HandleTypeDef huart1;
  121. UART_HandleTypeDef huart2;
  122. UART_HandleTypeDef huart3;

  123. /* USART1 init function */

  124. void MX_USART1_UART_Init(void)
  125. {

  126.   /* USER CODE BEGIN USART1_Init 0 */

  127.   /* USER CODE END USART1_Init 0 */

  128.   /* USER CODE BEGIN USART1_Init 1 */

  129.   /* USER CODE END USART1_Init 1 */
  130.   huart1.Instance = USART1;
  131.   huart1.Init.BaudRate = 9600;
  132.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  133.   huart1.Init.StopBits = UART_STOPBITS_1;
  134.   huart1.Init.Parity = UART_PARITY_NONE;
  135.   huart1.Init.Mode = UART_MODE_TX_RX;
  136.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  137.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  138.   if (HAL_UART_Init(&huart1) != HAL_OK)
  139.   {
  140.     Error_Handler();
  141.   }
  142.   /* USER CODE BEGIN USART1_Init 2 */

  143.   /* USER CODE END USART1_Init 2 */

  144. }
  145. /* USART2 init function */

  146. void MX_USART2_UART_Init(void)
  147. {

  148.   /* USER CODE BEGIN USART2_Init 0 */

  149.   /* USER CODE END USART2_Init 0 */

  150.   /* USER CODE BEGIN USART2_Init 1 */

  151.   /* USER CODE END USART2_Init 1 */
  152.   huart2.Instance = USART2;
  153.   huart2.Init.BaudRate = 9600;
  154.   huart2.Init.WordLength = UART_WORDLENGTH_8B;
  155.   huart2.Init.StopBits = UART_STOPBITS_1;
  156.   huart2.Init.Parity = UART_PARITY_NONE;
  157.   huart2.Init.Mode = UART_MODE_TX_RX;
  158.   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  159.   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  160.   if (HAL_UART_Init(&huart2) != HAL_OK)
  161.   {
  162.     Error_Handler();
  163.   }
  164.   /* USER CODE BEGIN USART2_Init 2 */

  165.   /* USER CODE END USART2_Init 2 */

  166. }
  167. /* USART3 init function */

  168. void MX_USART3_UART_Init(void)
  169. {

  170.   /* USER CODE BEGIN USART3_Init 0 */

  171.   /* USER CODE END USART3_Init 0 */

  172.   /* USER CODE BEGIN USART3_Init 1 */

  173.   /* USER CODE END USART3_Init 1 */
  174.   huart3.Instance = USART3;
  175.   huart3.Init.BaudRate = 9600;
  176.   huart3.Init.WordLength = UART_WORDLENGTH_8B;
  177.   huart3.Init.StopBits = UART_STOPBITS_1;
  178.   huart3.Init.Parity = UART_PARITY_NONE;
  179.   huart3.Init.Mode = UART_MODE_TX_RX;
  180.   huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  181.   huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  182.   if (HAL_UART_Init(&huart3) != HAL_OK)
  183.   {
  184.     Error_Handler();
  185.   }
  186.   /* USER CODE BEGIN USART3_Init 2 */

  187.   /* USER CODE END USART3_Init 2 */

  188. }

  189. void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
  190. {

  191.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  192.   if(uartHandle->Instance==USART1)
  193.   {
  194.   /* USER CODE BEGIN USART1_MspInit 0 */

  195.   /* USER CODE END USART1_MspInit 0 */
  196.     /* USART1 clock enable */
  197.     __HAL_RCC_USART1_CLK_ENABLE();

  198.     __HAL_RCC_GPIOA_CLK_ENABLE();
  199.     /**USART1 GPIO Configuration
  200.     PA9     ------> USART1_TX
  201.     PA10     ------> USART1_RX
  202.     */
  203.     GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
  204.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  205.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  206.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  207.     GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
  208.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  209.     /* USART1 interrupt Init */
  210.     HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
  211.     HAL_NVIC_EnableIRQ(USART1_IRQn);
  212.   /* USER CODE BEGIN USART1_MspInit 1 */

  213.   /* USER CODE END USART1_MspInit 1 */
  214.   }
  215.   else if(uartHandle->Instance==USART2)
  216.   {
  217.   /* USER CODE BEGIN USART2_MspInit 0 */

  218.   /* USER CODE END USART2_MspInit 0 */
  219.     /* USART2 clock enable */
  220.     __HAL_RCC_USART2_CLK_ENABLE();

  221.     __HAL_RCC_GPIOA_CLK_ENABLE();
  222.     /**USART2 GPIO Configuration
  223.     PA2     ------> USART2_TX
  224.     PA3     ------> USART2_RX
  225.     */
  226.     GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
  227.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  228.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  229.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  230.     GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
  231.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  232.     /* USART2 interrupt Init */
  233.     HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
  234.     HAL_NVIC_EnableIRQ(USART2_IRQn);
  235.   /* USER CODE BEGIN USART2_MspInit 1 */

  236.   /* USER CODE END USART2_MspInit 1 */
  237.   }
  238.   else if(uartHandle->Instance==USART3)
  239.   {
  240.   /* USER CODE BEGIN USART3_MspInit 0 */

  241.   /* USER CODE END USART3_MspInit 0 */
  242.     /* USART3 clock enable */
  243.     __HAL_RCC_USART3_CLK_ENABLE();

  244.     __HAL_RCC_GPIOB_CLK_ENABLE();
  245.     /**USART3 GPIO Configuration
  246.     PB10     ------> USART3_TX
  247.     PB11     ------> USART3_RX
  248.     */
  249.     GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
  250.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  251.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  252.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  253.     GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
  254.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  255.     /* USART3 interrupt Init */
  256.     HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
  257.     HAL_NVIC_EnableIRQ(USART3_IRQn);
  258.   /* USER CODE BEGIN USART3_MspInit 1 */

  259.   /* USER CODE END USART3_MspInit 1 */
  260.   }
  261. }

  262. void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
  263. {

  264.   if(uartHandle->Instance==USART1)
  265.   {
  266.   /* USER CODE BEGIN USART1_MspDeInit 0 */

  267.   /* USER CODE END USART1_MspDeInit 0 */
  268.     /* Peripheral clock disable */
  269.     __HAL_RCC_USART1_CLK_DISABLE();

  270.     /**USART1 GPIO Configuration
  271.     PA9     ------> USART1_TX
  272.     PA10     ------> USART1_RX
  273.     */
  274.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);

  275.     /* USART1 interrupt Deinit */
  276.     HAL_NVIC_DisableIRQ(USART1_IRQn);
  277.   /* USER CODE BEGIN USART1_MspDeInit 1 */

  278.   /* USER CODE END USART1_MspDeInit 1 */
  279.   }
  280.   else if(uartHandle->Instance==USART2)
  281.   {
  282.   /* USER CODE BEGIN USART2_MspDeInit 0 */

  283.   /* USER CODE END USART2_MspDeInit 0 */
  284.     /* Peripheral clock disable */
  285.     __HAL_RCC_USART2_CLK_DISABLE();

  286.     /**USART2 GPIO Configuration
  287.     PA2     ------> USART2_TX
  288.     PA3     ------> USART2_RX
  289.     */
  290.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);

  291.     /* USART2 interrupt Deinit */
  292.     HAL_NVIC_DisableIRQ(USART2_IRQn);
  293.   /* USER CODE BEGIN USART2_MspDeInit 1 */

  294.   /* USER CODE END USART2_MspDeInit 1 */
  295.   }
  296.   else if(uartHandle->Instance==USART3)
  297.   {
  298.   /* USER CODE BEGIN USART3_MspDeInit 0 */

  299.   /* USER CODE END USART3_MspDeInit 0 */
  300.     /* Peripheral clock disable */
  301.     __HAL_RCC_USART3_CLK_DISABLE();

  302.     /**USART3 GPIO Configuration
  303.     PB10     ------> USART3_TX
  304.     PB11     ------> USART3_RX
  305.     */
  306.     HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11);

  307.     /* USART3 interrupt Deinit */
  308.     HAL_NVIC_DisableIRQ(USART3_IRQn);
  309.   /* USER CODE BEGIN USART3_MspDeInit 1 */

  310.   /* USER CODE END USART3_MspDeInit 1 */
  311.   }
  312. }

  313. /* USER CODE BEGIN 1 */

  314. /* USER CODE END 1 */
复制代码


进入中断

进入中断

进中断前执行的函数

进中断前执行的函数
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-8-13
在线时间
20 小时
 楼主| 发表于 2022-9-1 16:41:49 | 显示全部楼层
有没有大哥看看呀难受啊马飞
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12989
金钱
12989
注册时间
2012-11-26
在线时间
3789 小时
发表于 2022-9-1 17:42:23 | 显示全部楼层
不要用HAL的回调函数  自己写  关闭各种异常错误
学无止境
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2019-6-27
在线时间
15 小时
发表于 2022-9-1 19:55:09 | 显示全部楼层
总感觉你中断里做了太多事了,也不清楚OLED_Display_Date()函数做了什么,以及串口3中断里memset了VOC_RxBuffer而不是C6H6_RxBuffer
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-8-13
在线时间
20 小时
 楼主| 发表于 2022-9-1 21:04:35 | 显示全部楼层
jermy_z 发表于 2022-9-1 17:42
不要用HAL的回调函数  自己写  关闭各种异常错误

不用回调函数直接在串口中断里写吗
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-8-13
在线时间
20 小时
 楼主| 发表于 2022-9-1 21:05:19 | 显示全部楼层
Egoista 发表于 2022-9-1 19:55
总感觉你中断里做了太多事了,也不清楚OLED_Display_Date()函数做了什么,以及串口3中断里memset了VOC_RxBu ...

谢谢提醒
回复

使用道具 举报

62

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
638
金钱
638
注册时间
2013-11-15
在线时间
84 小时
发表于 2022-11-7 17:29:55 | 显示全部楼层
遇到了同样的问题 ,外部中断程序卡死在了HardFault_Handler
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表