【发布时间】:2022-11-23 02:16:01
【问题描述】:
我正在使用STM32Cube_FW_G0_V1.5.0 固件。而且我观察到我总是在函数HAL_WaitOnFlagUntilTimeout 中超时(该函数在下面添加)。
有人建议什么地方会出错以及如何具体解决吗?
部分 main.c 代码:
/* USER CODE BEGIN PV */
uint8_t txdata[30] = "Hallo Peter \n\r";
/* USER CODE END PV */
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_I2C1_Init();
MX_RTC_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
MX_DAC1_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Transmit(&huart1, txdata, sizeof(txdata), 100);
transmit函数中调用的timeout的HAL函数代码:
HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,
uint32_t Tickstart, uint32_t Timeout)
{
/* Wait until flag is set */
while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
{
/* Check for the Timeout */
if (Timeout != HAL_MAX_DELAY)
{
if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
{
/* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error)
interrupts for the interrupt process */
ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE |
USART_CR1_TXEIE_TXFNFIE));
ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
huart->gState = HAL_UART_STATE_READY;
huart->RxState = HAL_UART_STATE_READY;
__HAL_UNLOCK(huart);
return HAL_TIMEOUT;
}
【问题讨论】:
-
对方是否也配置了硬件流控?尝试在您的 UART 上禁用流量控制,看看它是否有所作为。
-
那解决了问题。谢谢你。
-
作为旁注:与此同时,我在 stm32CubeIDE 中遇到了很多关于工作区和项目名称的问题。我总是遇到 HardFault_Error()。在使用 CubeMX 从 .ioc 文件完全重新初始化项目后,给项目一个新名称,删除旧工作区并创建一个新工作区,问题就解决了。
-
很高兴它正在工作。我会添加我的评论作为答案,你可以接受它。
标签: stm32 uart stm32cubeide