
新买了一块Nucleo F303k8,调试串口: MDK 5.18 使用HAL库开发。下载了STM32CubeF3,里面有F303K8的串口例程。 根据串口的例程,自己写了一个,使用中断方式处理串口。 问题描述: (1)字符串发送正常,用串口助手都能收到,会进入中断函数USARTx_IRQHandler; (2)通过串口助手发送的字符没有任何反应,程序不进入中断函数USARTx_IRQHandler,也不会进入回调函数HAL_UART_RxCpltCallback (3)怀疑过串口芯片的问题,但是用我自己焊的线路板和买的串口线路板都是一样的情况。 搞了两天了,求高手指点! 谢谢! 具体代码如下: main.c 文件 /* Includes ------------------------------------------------------------------*/ #include "main.h" /** @addtogroup STM32F3xx_HAL_Examples * @{ */ /** @addtogroup UART_TwoBoards_ComIT * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define TRANSMITTER_BOARD /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* UART handler declaration */ UART_HandleTypeDef UartHandle; __IO ITStatus UartReady = RESET; /* Buffer used for transmission */ uint8_t aTxBuffer[] = " ****UART_TwoBoards_ComIT****"; /* Buffer used for reception */ //uint8_t aRxBuffer[RXBUFFERSIZE]=""; uint8_t TxBuffer[100];//????? uint8_t aRxBuffer[1]; uint8_t RxBuffer[100]; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void Error_Handler(void); static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength); int main(void) { HAL_Init(); /* Configure the system clock to 64 MHz */ SystemClock_Config(); /* Configure LED3 */ BSP_LED_Init(LED3); UartHandle.Instance = USARTx;//库文件中又宏定义的,USARTx=USART1 UartHandle.Init.BaudRate = 9600; UartHandle.Init.WordLength = UART_WORDLENGTH_8B; UartHandle.Init.StopBits = UART_STOPBITS_1; UartHandle.Init.Parity = UART_PARITY_NONE; UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; UartHandle.Init.Mode = UART_MODE_TX_RX; UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if(HAL_UART_DeInit(&UartHandle) != HAL_OK) { Error_Handler(); } if(HAL_UART_Init(&UartHandle) != HAL_OK) { Error_Handler(); } BSP_LED_Off(LED3); if(HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE)!= HAL_OK) { Error_Handler(); } while (UartReady != SET) { } UartReady = RESET; if(HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)Error_Handler(); while (1) { } } /** * @brief System Clock Configuration * The system Clock is configured as follow : * System Clock source = PLL (HSI) * SYSCLK(Hz) = 64000000 * HCLK(Hz) = 64000000 * AHB Prescaler = 1 * APB1 Prescaler = 2 * APB2 Prescaler = 1 * PLLMUL = RCC_PLL_MUL16 (16) * Flash Latency(WS) = 2 * @param None * @retval None */ void SystemClock_Config(void) { RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; /* HSI Oscillator already ON after system reset, activate PLL with HSI as source */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_NONE; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16; if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK) { /* Initialization Error */ while(1); } /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2)!= HAL_OK) { /* Initialization Error */ while(1); } } /** * @brief Tx Transfer completed callback * @param UartHandle: UART handle. * @note This example shows a simple way to report end of IT Tx transfer, and * you can add your own implementation. * @retval None */ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle) { /* Set transmission flag: transfer complete */ BSP_LED_On(LED3); //测试进入了发送回调函数 UartReady = SET; } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { BSP_LED_Off(LED3); //测试进入了接收回调函数 RxBuffer[0]='u'; //测试,只要进入此回调函数,就发送“uvx” RxBuffer[1]='v'; RxBuffer[2]='x'; RxBuffer[4]=0; HAL_UART_Transmit(UartHandle,RxBuffer,3,1); UartReady = SET; } void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle) { Error_Handler(); } static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength) { while (BufferLength--) { if ((*pBuffer1) != *pBuffer2) { return BufferLength; } pBuffer1++; pBuffer2++; } return 0; } static void Error_Handler(void) { /* Turn LED3 on */ BSP_LED_On(LED3); while(1) { /* Error if LED3 is slowly blinking (1 sec. period) */ BSP_LED_Toggle(LED3); HAL_Delay(1000); } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif void USARTx_IRQHandler(void) //中断函数 { HAL_UART_IRQHandler(&UartHandle); } |
自己顶!![]() |