stm32f030RB串口接收数据问题

2019-03-23 17:45发布

开发环境:IAR for ARM 7.80.2
问题描述:1、使用CMSIS库,开了串口1和串口2,除波特率不同,其他都一样。串口2工作正常,串口1接收数据出错。
2.使用HAL库,串口1和串口2都正常。
排除了硬件的故障,所以问题肯定还是出在软件上面。但是比较两者不同,貌似又没有什么不同。调了好几天,实在没头绪。
代码如下:
CMSIS下:
  1. /**
  2.   * [url=home.php?mod=space&uid=159083]@brief[/url]  uart1 init
  3.   * @param  none
  4.   * @retval None
  5.   */
  6. void USART1_Init(void)
  7. {
  8.   NVIC_InitTypeDef NVIC_InitStructure;
  9.   GPIO_InitTypeDef GPIOInitType;
  10.   USART_InitTypeDef USART_InitStructure;
  11.   //RCC_USARTCLKConfig(RCC_USART1CLK_PCLK);
  12.   
  13.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  14.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );       

  15.   USART_InitStructure.USART_BaudRate = 9600;
  16.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  17.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  18.   USART_InitStructure.USART_Parity   = USART_Parity_No;
  19.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  20.   USART_InitStructure.USART_Mode          = USART_Mode_Rx | USART_Mode_Tx;
  21.   USART_Init(USART1, &USART_InitStructure);        

  22.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  23.   USART_Cmd(USART1, ENABLE);
  24.   
  25.   GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
  26.   GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
  27.   GPIOInitType.GPIO_Pin   = GPIO_Pin_9 | GPIO_Pin_10;
  28.   GPIOInitType.GPIO_Speed = GPIO_Speed_50MHz;
  29.   GPIOInitType.GPIO_Mode  = GPIO_Mode_AF;
  30.   GPIOInitType.GPIO_OType = GPIO_OType_PP;
  31.   GPIOInitType.GPIO_PuPd = GPIO_PuPd_UP ;
  32.   GPIO_Init(GPIOA, &GPIOInitType);  
  33.   
  34.   NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  35.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  36.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  37.   NVIC_Init(&NVIC_InitStructure);
  38. }

  39. /**
  40.   * @brief  uart2 init
  41.   * @param  none
  42.   * @retval None
  43.   */
  44. void USART2_Init(void)
  45. {
  46.   NVIC_InitTypeDef NVIC_InitStructure;
  47.   GPIO_InitTypeDef GPIOInitType;
  48.   USART_InitTypeDef USART_InitStructure;
  49.   
  50.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  51.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );       

  52.   USART_InitStructure.USART_BaudRate = 115200;
  53.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  54.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  55.   USART_InitStructure.USART_Parity   = USART_Parity_No;
  56.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  57.   USART_InitStructure.USART_Mode          = USART_Mode_Rx | USART_Mode_Tx;
  58.   USART_Init(USART2, &USART_InitStructure);        

  59.   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  60.   USART_Cmd(USART2, ENABLE);
  61.   
  62.   GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
  63.   GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
  64.   GPIOInitType.GPIO_Pin   = GPIO_Pin_2 | GPIO_Pin_3;
  65.   GPIOInitType.GPIO_Speed = GPIO_Speed_50MHz;
  66.   GPIOInitType.GPIO_Mode  = GPIO_Mode_AF;
  67.   GPIOInitType.GPIO_OType = GPIO_OType_PP;
  68.   GPIOInitType.GPIO_PuPd = GPIO_PuPd_UP ;
  69.   GPIO_Init(GPIOA, &GPIOInitType);
  70.   
  71.   NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
  72.   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;  
  73.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  74.   NVIC_Init(&NVIC_InitStructure);
  75. }

  76. /**
  77.   * @brief  uart1 interrupt
  78.   * @param  None
  79.   * @retval None
  80.   */
  81. void USART1_IRQHandler(void)
  82. {
  83.   U8 dat = 0;
  84.   if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
  85.   {
  86.     USART_ClearITPendingBit(USART1,USART_IT_ORE);      
  87.     dat = USART_ReceiveData(USART1);  
  88.     if(!QueueIsFull(&BoardRxQueue)) //队列不满
  89.     {
  90.       PushInQueue_Q(&BoardRxQueue, dat);   
  91.       TIM6->CNT = 0;  //定时器计数设为0      
  92.       if(g_devWorkStatus.bRecvDataUart1 == 0)//打开定时器。如果定时器产生了中断,则说明一帧数据接收完毕了
  93.         TIM6_Set(1);
  94.     }
  95.     else
  96.       g_devWorkStatus.bRecvDataUart1 = 1;
  97.   }
  98.   if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  99.   {
  100.     dat = USART_ReceiveData(USART1);
  101.     if(!QueueIsFull(&BoardRxQueue)) //队列不满
  102.     {
  103.       PushInQueue_Q(&BoardRxQueue, dat);   
  104.       TIM6->CNT = 0;  //定时器计数设为0      
  105.       if(g_devWorkStatus.bRecvDataUart1 == 0)//打开定时器。如果定时器产生了中断,则说明一帧数据接收完毕了
  106.         TIM6_Set(1);
  107.     }
  108.     else
  109.       g_devWorkStatus.bRecvDataUart1 = 1;
  110.     USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  111.   }
  112. }

  113. /**
  114.   * @brief  uart2 interrupt
  115.   * @param  None
  116.   * @retval None
  117.   */
  118. void USART2_IRQHandler(void)
  119. {
  120.   U8 dat = 0;
  121.   if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
  122.   {
  123.     USART_ClearITPendingBit(USART2,USART_IT_ORE);      
  124.     dat = USART_ReceiveData(USART2);  
  125.     if(!QueueIsFull(&MG2618RxQueue)) //队列不满
  126.     {
  127.       PushInQueue_Q(&MG2618RxQueue, dat);   
  128.       TIM7->CNT = 0;  //定时器计数设为0      
  129.       if(g_devWorkStatus.bRecvDataUart2 == 0)//打开定时器。如果定时器产生了中断,则说明一帧数据接收完毕了
  130.         TIM7_Set(1);
  131.     }
  132.     else
  133.       g_devWorkStatus.bRecvDataUart2 = 1;
  134.   }
  135.   
  136.   if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  137.   {
  138.     dat = USART_ReceiveData(USART2);
  139.     if(!QueueIsFull(&MG2618RxQueue)) //队列不满
  140.     {
  141.       PushInQueue_Q(&MG2618RxQueue, dat);   
  142.       TIM7->CNT = 0;  //定时器计数设为0      
  143.       if(g_devWorkStatus.bRecvDataUart2 == 0)//打开定时器。如果定时器产生了中断,则说明一帧数据接收完毕了
  144.         TIM7_Set(1);
  145.     }
  146.     else
  147.       g_devWorkStatus.bRecvDataUart2 = 1;
  148.     USART_ClearITPendingBit(USART2, USART_IT_RXNE);
  149.   }
  150. }
复制代码
HAL库下的代码:
  1. /* USART1 init function */
  2. static void MX_USART1_UART_Init(void)
  3. {
  4.   
  5.   huart1.Instance = USART1;
  6.   huart1.Init.BaudRate = 9600;
  7.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  8.   huart1.Init.StopBits = UART_STOPBITS_1;
  9.   huart1.Init.Parity = UART_PARITY_NONE;
  10.   huart1.Init.Mode = UART_MODE_TX_RX;
  11.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  12.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  13.   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  14.   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  15.   if (HAL_UART_Init(&huart1) != HAL_OK)
  16.   {
  17.     Error_Handler();
  18.   }
  19.   __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
  20.   //  if(HAL_UART_Receive_IT(&huart1,aRxBuffer,1)!=HAL_OK)
  21.   //  {
  22.   //    Error_Handler();
  23.   //  }
  24.   NVIC_SetPriority(USART1_IRQn, 1);
  25.   HAL_NVIC_EnableIRQ(USART1_IRQn);     
  26. }

  27. /* USART2 init function */
  28. static void MX_USART2_UART_Init(void)
  29. {
  30.   
  31.   huart2.Instance = USART2;
  32.   huart2.Init.BaudRate = 115200;
  33.   huart2.Init.WordLength = UART_WORDLENGTH_8B;
  34.   huart2.Init.StopBits = UART_STOPBITS_1;
  35.   huart2.Init.Parity = UART_PARITY_NONE;
  36.   huart2.Init.Mode = UART_MODE_TX_RX;
  37.   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  38.   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  39.   huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  40.   huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  41.   if (HAL_UART_Init(&huart2) != HAL_OK)
  42.   {
  43.     Error_Handler();
  44.   }
  45.   __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
  46.   //  if(HAL_UART_Receive_IT(&huart2,aRxBuffer,1)!=HAL_OK)
  47.   //  {
  48.   //    Error_Handler();
  49.   //  }
  50.   NVIC_SetPriority(USART2_IRQn, 0);
  51.   HAL_NVIC_EnableIRQ(USART2_IRQn);
  52. }

  53. void HAL_UART_MspInit(UART_HandleTypeDef* huart)
  54. {

  55.   GPIO_InitTypeDef GPIO_InitStruct;
  56.   if(huart->Instance==USART1)
  57.   {
  58.   /* USER CODE BEGIN USART1_MspInit 0 */

  59.   /* USER CODE END USART1_MspInit 0 */
  60.     /* Peripheral clock enable */
  61.     __HAL_RCC_USART1_CLK_ENABLE();
  62.   
  63.     /**USART1 GPIO Configuration   
  64.     PA9     ------> USART1_TX
  65.     PA10     ------> USART1_RX
  66.     */
  67.     GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
  68.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  69.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  70.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  71.     GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
  72.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  73.   /* USER CODE BEGIN USART1_MspInit 1 */

  74.   /* USER CODE END USART1_MspInit 1 */
  75.   }
  76.   else if(huart->Instance==USART2)
  77.   {
  78.   /* USER CODE BEGIN USART2_MspInit 0 */

  79.   /* USER CODE END USART2_MspInit 0 */
  80.     /* Peripheral clock enable */
  81.     __HAL_RCC_USART2_CLK_ENABLE();
  82.   
  83.     /**USART2 GPIO Configuration   
  84.     PA2     ------> USART2_TX
  85.     PA3     ------> USART2_RX
  86.     */
  87.     GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
  88.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  89.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  90.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  91.     GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
  92.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  93.   /* USER CODE BEGIN USART2_MspInit 1 */

  94.   /* USER CODE END USART2_MspInit 1 */
  95.   }

  96. }

  97. void USART1_IRQHandler(void)
  98. {
  99.    if((USART1->ISR & 0x20)==0x20)
  100.    {
  101.      RingBufWriteOne(&mowerRingBuffObj,USART1->RDR);
  102.    }
  103. //   else
  104. //   {
  105. //      
  106. //   }
  107.   //HAL_UART_IRQHandler(&huart1);
  108. }
  109. extern UART_HandleTypeDef huart2;
  110. extern tRingBufObject GprsRingBuffObj;
  111. void USART2_IRQHandler(void)
  112. {
  113.    //uint8_t ret=0;
  114.   if((USART2->ISR & 0x20)==0x20)
  115.   {
  116.    RingBufWriteOne(&GprsRingBuffObj,USART2->RDR);
  117.   }
  118. //  else
  119. //  {
  120. //      
  121. //  }
  122.    //ret=RingBufReadOne(&GprsRingBuffObj);
  123.    //HAL_UART_Transmit(&huart2,&ret,1,20);
  124.   //HAL_UART_IRQHandler(&huart2);
  125. }
复制代码
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。