stm32 - 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);
}
解决方案
推荐阅读
- javascript - FullCalendar get events from database
- html - bootstrap-select 在点击后不显示下拉菜单
- reactjs - 如何在不同的服务器上托管不同的路由?
- c++ - C++ - 如何通过引用传递对象以访问其方法?
- google-cloud-platform - 在 GCP 人脸检测中,我们应该假设哪个轴是测量侧倾角的轴?
- php - 如何确定 infusionsoft 联系人是否具有特定的标签 ID
- c++ - What is the best way to read a structure from a binary file containing IP header fragments?
- javascript - 使用 jest 运行测试时如何修复“测试套件无法运行”
- typescript - 如何在joint.d.ts、jointjs中扩展命名空间
- docker - gunicorn:错误:在 Docker 中运行烧瓶应用程序时无法识别的参数