STM32F4通过UART从停止模式唤醒

时间:2020-10-26 16:01:54

标签: stm32 sleep uart stm32f4 wakeup

我正在使用 STM32F407VG MCU( STM32F4发现板),并且希望MCU收到 STOP 模式时从 STOP 模式唤醒。 UART 发送的消息。我必须手动进行一些调整,因为在配置为UART功能时,STM32CubeMX无法将UART Rx引脚设置为GPIO中断引脚。我正在将 DMA 与UART一起使用。读取UART的功能是 HAL_UART_Receive_DMA()

当UART接收到消息时,可以从STOP模式唤醒,但是问题是损坏的许多字节。我认为仅第一个字节应该被损坏,而其他字节则不应。如果我发送了另一个味精,则它已被完全接收,并且一切正常,问题仅在于发送的第一个味精并用于唤醒MCU。知道可能是什么问题吗?

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

enter image description here

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);   
}

0 个答案:

没有答案