你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于 stm32F05 hal 库生成 USART2 库文件不能收发数据问题请教

[复制链接]
long609521-9517 提问时间:2020-5-13 09:16 /
芯片:STM32F051K8TX
外部晶振:16Mhz
使用串口:USART2,中断发送接收


使用STM32Cube 生成 STM32F051K8TX芯片的 工程文件,发送串口数据,串口调试工具无法接收到数据。使用在线调试, 总是在这个地方就返回 (huart->gState == HAL_UART_STATE_READY),一直找不到原因,请帮忙查看什么原因,谢谢。
使用一个LED做指示,可以正常工作, 生成的工程,只改了main.C文件,其它文件没有改。





以下为 main.C 文件  
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * [url=home.php?mod=space&uid=288409]@file[/url]           : main.c
  5.   * [url=home.php?mod=space&uid=247401]@brief[/url]          : Main program body
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>© Copyright (c) 2020 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under BSD 3-Clause license,
  13.   * the "License"; You may not use this file except in compliance with the
  14.   * License. You may obtain a copy of the License at:
  15.   *                        opensource.org/licenses/BSD-3-Clause
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* USER CODE END Header */

  20. /* Includes ------------------------------------------------------------------*/
  21. #include "main.h"
  22. #include "usart.h"
  23. #include "gpio.h"

  24. /* Private includes ----------------------------------------------------------*/
  25. /* USER CODE BEGIN Includes */
  26. #include "stdio.h"
  27. /* USER CODE END Includes */

  28. /* Private typedef -----------------------------------------------------------*/
  29. /* USER CODE BEGIN PTD */
  30. #ifdef __GNUC_
  31. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  32. #else
  33. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  34. #endif

  35. //重映射printf的功能
  36. PUTCHAR_PROTOTYPE
  37. {
  38.   HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);

  39.   return ch;
  40. }
  41. /* USER CODE END PTD */

  42. /* Private define ------------------------------------------------------------*/
  43. /* USER CODE BEGIN PD */
  44. /* USER CODE END PD */

  45. /* Private macro -------------------------------------------------------------*/
  46. /* USER CODE BEGIN PM */

  47. /* USER CODE END PM */

  48. /* Private variables ---------------------------------------------------------*/

  49. /* USER CODE BEGIN PV */

  50. /* USER CODE END PV */

  51. /* Private function prototypes -----------------------------------------------*/
  52. void SystemClock_Config(void);
  53. /* USER CODE BEGIN PFP */
  54. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
  55. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);

  56. /* USER CODE END PFP */

  57. /* Private user code ---------------------------------------------------------*/
  58. /* USER CODE BEGIN 0 */

  59. uint8_t ch = 'k';
  60. uint8_t kRxBuffer[20];
  61. uint8_t kTxBuffer[5]={'w','a','n','g','\n'};

  62. /* USER CODE END 0 */

  63. /**
  64.   * @brief  The application entry point.
  65.   * @retval int
  66.   */
  67. int main(void)
  68. {
  69.   /* USER CODE BEGIN 1 */


  70.   /* USER CODE END 1 */

  71.   /* MCU Configuration--------------------------------------------------------*/

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

  74.   /* USER CODE BEGIN Init */

  75.   /* USER CODE END Init */

  76.   /* Configure the system clock */
  77.   SystemClock_Config();

  78.   /* USER CODE BEGIN SysInit */

  79.   /* USER CODE END SysInit */

  80.   /* Initialize all configured peripherals */
  81.   MX_GPIO_Init();
  82.   MX_USART2_UART_Init();
  83.   /* USER CODE BEGIN 2 */
  84.       
  85.         HAL_UART_Receive_IT(&huart2,(uint8_t *)kRxBuffer, 10);

  86.   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
  87.   /* USER CODE END 2 */

  88.   /* Infinite loop */
  89.   /* USER CODE BEGIN WHILE */
  90.   while (1)
  91.   {
  92.                 printf("\n\r welcome to www.waveshere.com !!!\n\r");

  93.                 HAL_Delay(500);
  94.                 //HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
  95.                
  96.                 HAL_UART_Transmit(&huart2,(uint8_t *)&ch, 1, 0xffff);
  97.                 HAL_UART_Transmit_IT(&huart2, (uint8_t *)kTxBuffer, 5);
  98.                
  99.     /* USER CODE END WHILE */

  100.     /* USER CODE BEGIN 3 */
  101.   }
  102.   /* USER CODE END 3 */
  103. }

  104. /**
  105.   * @brief System Clock Configuration
  106.   * @retval None
  107.   */
  108. void SystemClock_Config(void)
  109. {
  110.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  111.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  112.   /** Initializes the CPU, AHB and APB busses clocks
  113.   */
  114.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  115.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  116.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  117.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  118.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL3;
  119.   RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  120.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  121.   {
  122.     Error_Handler();
  123.   }
  124.   /** Initializes the CPU, AHB and APB busses clocks
  125.   */
  126.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  127.                               |RCC_CLOCKTYPE_PCLK1;
  128.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  129.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  130.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  131.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  132.   {
  133.     Error_Handler();
  134.   }
  135. }

  136. /* USER CODE BEGIN 4 */
  137. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  138. {
  139.         UNUSED(huart);
  140.         HAL_UART_Transmit(&huart2,(uint8_t *)kRxBuffer, 10, 0xffff);
  141.       
  142.         HAL_UART_Receive_IT(&huart2,(uint8_t *)kRxBuffer, 10);
  143. }

  144. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  145. {
  146.         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
  147.       
  148. }

  149. /* USER CODE END 4 */

  150. /**
  151.   * @brief  This function is executed in case of error occurrence.
  152.   * @retval None
  153.   */
  154. void Error_Handler(void)
  155. {
  156.   /* USER CODE BEGIN Error_Handler_Debug */
  157.   /* User can add his own implementation to report the HAL error return state */

  158.   /* USER CODE END Error_Handler_Debug */
  159. }

  160. #ifdef  USE_FULL_ASSERT
  161. /**
  162.   * @brief  Reports the name of the source file and the source line number
  163.   *         where the assert_param error has occurred.
  164.   * @param  file: pointer to the source file name
  165.   * @param  line: assert_param error line source number
  166.   * @retval None
  167.   */
  168. void assert_failed(uint8_t *file, uint32_t line)
  169. {
  170.   /* USER CODE BEGIN 6 */
  171.   /* User can add his own implementation to report the file name and line number,
  172.      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  173.   /* USER CODE END 6 */
  174. }
  175. #endif /* USE_FULL_ASSERT */

  176. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码


以下是 USART.C文件

  1. /**
  2.   ******************************************************************************
  3.   * File Name          : USART.c
  4.   * Description        : This file provides code for the configuration
  5.   *                      of the USART instances.
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>© Copyright (c) 2020 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under BSD 3-Clause license,
  13.   * the "License"; You may not use this file except in compliance with the
  14.   * License. You may obtain a copy of the License at:
  15.   *                        opensource.org/licenses/BSD-3-Clause
  16.   *
  17.   ******************************************************************************
  18.   */

  19. /* Includes ------------------------------------------------------------------*/
  20. #include "usart.h"

  21. /* USER CODE BEGIN 0 */

  22. /* USER CODE END 0 */

  23. UART_HandleTypeDef huart2;

  24. /* USART2 init function */

  25. void MX_USART2_UART_Init(void)
  26. {

  27.   huart2.Instance = USART2;
  28.   huart2.Init.BaudRate = 115200;
  29.   huart2.Init.WordLength = UART_WORDLENGTH_8B;
  30.   huart2.Init.StopBits = UART_STOPBITS_1;
  31.   huart2.Init.Parity = UART_PARITY_NONE;
  32.   huart2.Init.Mode = UART_MODE_TX_RX;
  33.   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  34.   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  35.   huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  36.   huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  37.   if (HAL_UART_Init(&huart2) != HAL_OK)
  38.   {
  39.     Error_Handler();
  40.   }

  41. }

  42. void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
  43. {

  44.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  45.   if(uartHandle->Instance==USART2)
  46.   {
  47.   /* USER CODE BEGIN USART2_MspInit 0 */

  48.   /* USER CODE END USART2_MspInit 0 */
  49.     /* USART2 clock enable */
  50.     __HAL_RCC_USART2_CLK_ENABLE();
  51.   
  52.     __HAL_RCC_GPIOA_CLK_ENABLE();
  53.     /**USART2 GPIO Configuration   
  54.     PA2     ------> USART2_TX
  55.     PA3     ------> USART2_RX
  56.     */
  57.     GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
  58.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  59.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  60.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  61.     GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
  62.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  63.     /* USART2 interrupt Init */
  64.     HAL_NVIC_SetPriority(USART2_IRQn, 1, 0);
  65.     HAL_NVIC_EnableIRQ(USART2_IRQn);
  66.   /* USER CODE BEGIN USART2_MspInit 1 */

  67.   /* USER CODE END USART2_MspInit 1 */
  68.   }
  69. }

  70. void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
  71. {

  72.   if(uartHandle->Instance==USART2)
  73.   {
  74.   /* USER CODE BEGIN USART2_MspDeInit 0 */

  75.   /* USER CODE END USART2_MspDeInit 0 */
  76.     /* Peripheral clock disable */
  77.     __HAL_RCC_USART2_CLK_DISABLE();
  78.   
  79.     /**USART2 GPIO Configuration   
  80.     PA2     ------> USART2_TX
  81.     PA3     ------> USART2_RX
  82.     */
  83.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);

  84.     /* USART2 interrupt Deinit */
  85.     HAL_NVIC_DisableIRQ(USART2_IRQn);
  86.   /* USER CODE BEGIN USART2_MspDeInit 1 */

  87.   /* USER CODE END USART2_MspDeInit 1 */
  88.   }
  89. }

  90. /* USER CODE BEGIN 1 */

  91. /* USER CODE END 1 */

  92. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码


TEST-USART2 0512.zip

下载

5.38 MB, 下载次数: 3, 下载积分: ST金币 -1

收藏 评论7 发布时间:2020-5-13 09:16

举报

7个回答
BG4RFF 回答时间:2020-5-13 15:02:17
先简单点,不要接收,只发送,循环发送,也不要中断,一步一步的来

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

long609521-9517 回答时间:2020-5-13 16:56:27
BG4RFF 发表于 2020-5-13 15:02
先简单点,不要接收,只发送,循环发送,也不要中断,一步一步的来

感谢回复。

我使用了printf 函数向串口工具发送数据,也一直是在 if(huart->gState == HAL_UART_STATE_READY)    这行代码跳出循环。感觉串口一直在忙,被占用。但是直接生成的代码都是配置好的呀。
BG4RFF 回答时间:2020-5-19 11:39:54
接收回调函数里面占用的时间忒长,这样好像不太好
BG4RFF 回答时间:2020-5-19 11:41:10
接收,中断,放到环形缓存,主函数循环检测是否有新数据
lebment 回答时间:2020-5-20 10:44:40
没什么好建议的,这种bug只能自己调。
butterflyspring 回答时间:2020-5-25 10:58:30
同意楼上观点,单步调试,对照手册或者参考例程就能找出原因。
另外一般不会用到 HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) 这个函数。
Ankky 回答时间:2020-5-26 09:26:39
看了一下各位的评论,基本都跑题了。。。应该是鄙视HAL库的旋律才对。。。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版