首页 > 解决方案 > STM32F4 通过 UART 从停止模式唤醒

问题描述

我正在使用STM32F407VG MCU(STM32F4 探索板),我希望我的 MCU在收到来自UART的消息时从STOP模式唤醒。我不得不手动调整一些东西,因为 STM32CubeMX 在配置 UART 功能时无法将 UART Rx 引脚设置为 GPIO 中断引脚。我正在使用带有 UART 的DMA 。读取 UART 的函数是HAL_UART_Receive_DMA()

UART 接收到 msg 时从 STOP 模式唤醒有效,但问题是读取的大量字节已损坏。我认为只有第一个字节应该被破坏,而不是其他字节。如果我发送另一个消息,它被完全接收并且一切正常,问题仅在于发送并用于唤醒 MCU 的第一个消息。知道问题可能是什么吗?

我以某种方式对其进行了测试,无论我通过 UART 向 MCU 发送什么,它都会在唤醒后将其发送回来。这是结果(绿色 - 我发送的内容,白色 - MCU 收到的内容):

在此处输入图像描述

似乎以某种方式由 MCU 接收的数据取决于空格字符的位置(除非空格字符是第一个)。

这是我的代码的一些部分:

void MX_USART3_UART_Init(void)
{

  huart3.Instance = USART3;
  huart3.Init.BaudRate = 9600;
  huart3.Init.WordLength = UART_WORDLENGTH_8B;
  huart3.Init.StopBits = UART_STOPBITS_1;
  huart3.Init.Parity = UART_PARITY_NONE;
  huart3.Init.Mode = UART_MODE_TX_RX;
  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart3) != HAL_OK)
  {
    Error_Handler();
  }

}

//-----------------------------------

// Setting the UART rx pin to trigger an interrupt on falling edge
EXTI_ConfigTypeDef hExtiConfig;
hExtiConfig.Line = EXTI_LINE_9; // PD9
hExtiConfig.Mode = EXTI_MODE_INTERRUPT;
hExtiConfig.Trigger = EXTI_TRIGGER_FALLING;
hExtiConfig.GPIOSel = EXTI_GPIOD;   // PD9
HAL_EXTI_SetConfigLine(&g_hExtiHandle, &hExtiConfig);
HAL_EXTI_RegisterCallback(&g_hExtiHandle, HAL_EXTI_COMMON_CB_ID, my_func);

HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 4);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);


// Enter STOP mode
HAL_PWREx_EnableFlashPowerDown();
HAL_SuspendTick();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

//-----------------------------------

void EXTI9_5_IRQHandler(void)
{
  HAL_ResumeTick();
  SystemClock_Config();
  MX_USART3_UART_Init();

  HAL_PWREx_DisableFlashPowerDown();

  HAL_EXTI_IRQHandler(&g_hExtiHandle);
}

//-----------------------------------

// Callback function after the wake-up
void my_func(void)
{
    HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_SET);
    HAL_EXTI_ClearPending(&g_hExtiHandle, EXTI_TRIGGER_FALLING);
    HAL_EXTI_ClearConfigLine(&g_hExtiHandle);   
}

标签: stm32sleepuartstm32f4wakeup

解决方案


推荐阅读