打印
[STM32F0]

hal 库生成 USART2 库文件不能收发数据

[复制链接]
147|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
芯片:STM32F051K8TX
外部晶振:16Mhz
使用串口:USART2,中断发送接收

使用STM32Cube 生成 STM32F051K8TX芯片的 工程文件,发送串口数据,串口调试工具无法接收到数据

使用特权

评论回复
沙发
renyaq| | 2022-5-14 19:30 | 只看该作者

还有什么现象?能再详细描述下吗?

使用特权

评论回复
板凳
huangchui|  楼主 | 2022-5-14 19:32 | 只看该作者
使用在线调试, 总是在这个地方就返回 (huart->gState == HAL_UART_STATE_READY),一直找不到原因

使用特权

评论回复
地板
huangchui|  楼主 | 2022-5-14 19:35 | 只看该作者
使用一个LED做指示,可以正常工作, 生成的工程,只改了main.C文件,其它文件没有改。

使用特权

评论回复
5
huangchui|  楼主 | 2022-5-14 19:37 | 只看该作者

使用特权

评论回复
6
huangchui|  楼主 | 2022-5-14 19:40 | 只看该作者

使用特权

评论回复
7
huangchui|  楼主 | 2022-5-14 19:43 | 只看该作者

使用特权

评论回复
8
huangchui|  楼主 | 2022-5-14 19:47 | 只看该作者
以下是 main()函数:
/* USER CODE BEGIN Header */

/**

  ******************************************************************************

  * @file           : main.c

  * @brief          : Main program body

  ******************************************************************************

  * @attention

  *

  * <h2><center>© Copyright (c) 2020 STMicroelectronics.

  * All rights reserved.</center></h2>

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

  ******************************************************************************

  */

/* USER CODE END Header */



/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "usart.h"

#include "gpio.h"



/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include "stdio.h"

/* USER CODE END Includes */



/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

#ifdef __GNUC_

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif



//重映射printf的功能

PUTCHAR_PROTOTYPE

{

  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);



  return ch;

}

/* USER CODE END PTD */



/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

/* USER CODE END PD */



/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */



/* USER CODE END PM */



/* Private variables ---------------------------------------------------------*/



/* USER CODE BEGIN PV */



/* USER CODE END PV */



/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

/* USER CODE BEGIN PFP */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);



/* USER CODE END PFP */



/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */



uint8_t ch = 'k';

uint8_t kRxBuffer[20];

uint8_t kTxBuffer[5]={'w','a','n','g','\n'};



/* USER CODE END 0 */



/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

  /* USER CODE BEGIN 1 */





  /* USER CODE END 1 */



  /* MCU Configuration--------------------------------------------------------*/



  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();



  /* USER CODE BEGIN Init */



  /* USER CODE END Init */



  /* Configure the system clock */

  SystemClock_Config();



  /* USER CODE BEGIN SysInit */



  /* USER CODE END SysInit */



  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART2_UART_Init();

  /* USER CODE BEGIN 2 */

        

        HAL_UART_Receive_IT(&huart2,(uint8_t *)kRxBuffer, 10);



  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);

  /* USER CODE END 2 */



  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

                printf("\n\r welcome to www.waveshere.com !!!\n\r");



                HAL_Delay(500);

                //HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);

               

                HAL_UART_Transmit(&huart2,(uint8_t *)&ch, 1, 0xffff);

                HAL_UART_Transmit_IT(&huart2, (uint8_t *)kTxBuffer, 5);

               

    /* USER CODE END WHILE */



    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}



/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};



  /** Initializes the CPU, AHB and APB busses clocks

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL3;

  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

  /** Initializes the CPU, AHB and APB busses clocks

  */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;



  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

  {

    Error_Handler();

  }

}



/* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

        UNUSED(huart);

        HAL_UART_Transmit(&huart2,(uint8_t *)kRxBuffer, 10, 0xffff);

        

        HAL_UART_Receive_IT(&huart2,(uint8_t *)kRxBuffer, 10);

}



void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

{

        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);

        

}



/* USER CODE END 4 */



/**

  * @brief  This function is executed in case of error occurrence.

  * @retval None

  */

void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */



  /* USER CODE END Error_Handler_Debug */

}



#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */



/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

使用特权

评论回复
9
huangchui|  楼主 | 2022-5-14 19:49 | 只看该作者
以下是USART.c 文件。
/**

  ******************************************************************************

  * File Name          : USART.c

  * Description        : This file provides code for the configuration

  *                      of the USART instances.

  ******************************************************************************

  * @attention

  *

  * <h2><center>© Copyright (c) 2020 STMicroelectronics.

  * All rights reserved.</center></h2>

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

  ******************************************************************************

  */



/* Includes ------------------------------------------------------------------*/

#include "usart.h"



/* USER CODE BEGIN 0 */



/* USER CODE END 0 */



UART_HandleTypeDef huart2;



/* USART2 init function */



void MX_USART2_UART_Init(void)

{



  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.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

  if (HAL_UART_Init(&huart2) != HAL_OK)

  {

    Error_Handler();

  }



}



void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)

{



  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(uartHandle->Instance==USART2)

  {

  /* USER CODE BEGIN USART2_MspInit 0 */



  /* USER CODE END USART2_MspInit 0 */

    /* USART2 clock enable */

    __HAL_RCC_USART2_CLK_ENABLE();

  

    __HAL_RCC_GPIOA_CLK_ENABLE();

    /**USART2 GPIO Configuration   

    PA2     ------> USART2_TX

    PA3     ------> USART2_RX

    */

    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF1_USART2;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);



    /* USART2 interrupt Init */

    HAL_NVIC_SetPriority(USART2_IRQn, 1, 0);

    HAL_NVIC_EnableIRQ(USART2_IRQn);

  /* USER CODE BEGIN USART2_MspInit 1 */



  /* USER CODE END USART2_MspInit 1 */

  }

}



void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)

{



  if(uartHandle->Instance==USART2)

  {

  /* USER CODE BEGIN USART2_MspDeInit 0 */



  /* USER CODE END USART2_MspDeInit 0 */

    /* Peripheral clock disable */

    __HAL_RCC_USART2_CLK_DISABLE();

  

    /**USART2 GPIO Configuration   

    PA2     ------> USART2_TX

    PA3     ------> USART2_RX

    */

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);



    /* USART2 interrupt Deinit */

    HAL_NVIC_DisableIRQ(USART2_IRQn);

  /* USER CODE BEGIN USART2_MspDeInit 1 */



  /* USER CODE END USART2_MspDeInit 1 */

  }

}



/* USER CODE BEGIN 1 */



/* USER CODE END 1 */



/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

使用特权

评论回复
10
chuxh| | 2022-5-14 19:53 | 只看该作者
你最好把工程打包发来,没人会这么看代码能找到问题。

使用特权

评论回复
11
huangchui|  楼主 | 2022-5-14 19:55 | 只看该作者
你现在初步症状是通过串口助手收不到数据。

使用特权

评论回复
12
jiajs| | 2022-5-14 19:57 | 只看该作者
你可以先将芯片的TX/RX脚短接,自发自收,看看能否再寄存器或缓冲里看到数据。

使用特权

评论回复
13
zhenykun| | 2022-5-14 19:59 | 只看该作者
先保证这一步没问题,然后连接外部串口助手。

使用特权

评论回复
14
huangchui|  楼主 | 2022-5-14 20:01 | 只看该作者
我串口硬件是没有问题的。因为我用寄存器操作方式能把数据发到串口助手显示

使用特权

评论回复
15
dengdc| | 2022-5-14 20:03 | 只看该作者
说明硬件没有问题

使用特权

评论回复
16
huangchui|  楼主 | 2022-5-14 20:08 | 只看该作者
我在用hal库仿真的时候,总是在判断串口空闲那个地方  if(huart->gState == HAL_UART_STATE_READY)     跳出发送函数

使用特权

评论回复
17
dingy| | 2022-5-14 20:11 | 只看该作者
说明串口不知什么原因一直忙

使用特权

评论回复
18
supernan| | 2022-5-14 20:14 | 只看该作者
你看看开启了哪些中断

使用特权

评论回复
19
yszong| | 2022-5-14 20:18 | 只看该作者
是否进入了某个没完没了的中断了让你的代码没法正常运行。

使用特权

评论回复
20
huangchui|  楼主 | 2022-5-14 20:21 | 只看该作者

好的,我明天去单位试一下,多谢各位大侠了哈        

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

918

主题

12323

帖子

4

粉丝