本帖最后由 zhouyalong 于 2024-10-31 16:07 编辑
STM32L431在STOP2模式下能否将串口的RX配置成EXTI唤醒呢?为什么我的唤醒不了呢?并且空闲中断也不能用,手册中说在硬件上已经将EXTI与RX引脚连到一块了,但是呢STOP2模式不能将串口唤醒,所以它的那种方式好像不能使用,只能用最原始的将RX配置成EXTI的方式了,但是也还是唤醒不了 进入STOP2模式, - void EnterStop2ModeRTC(void) // 自定义的Enter函数
- {
- __HAL_RCC_PWR_CLK_ENABLE();
- __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
- __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);
- __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG();
- __HAL_RTC_TIMESTAMP_CLEAR_FLAG(&hrtc, RTC_FLAG_TSF);
- __HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG();
- while (__HAL_UART_GET_FLAG(&huart3, USART_ISR_BUSY) == SET)
- ;
- while (__HAL_UART_GET_FLAG(&huart3, USART_ISR_REACK) == RESET)
- ;
- setUca3RxToExti();//配置串口3的RX为EXTI
- HAL_SuspendTick();
- //HAL_DBGMCU_EnableDBGStopMode();
- __HAL_RCC_PWR_CLK_ENABLE();
- HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); // 进入STOP2模式
- }
复制代码退出STOP2 - void ExitStop2ModeRTC(void)
- {
- SystemClock_Config();
- HAL_ResumeTick();
- SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk;
- }
复制代码主函数 - while (1)
- {
- while (getExitLPM3())
- {
- saveData();
- lcdActionPro(); // lcd进程
- keyActPro();
- // if (uart[_COM3].active)
- // {
- // }
- }
- }
- EnterStop2ModeRTC();
- }
复制代码在函数getExitLPM3()中,判断了一个标志位是否被置位,如果置位了就进入里面的while EXTI回调函数: - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- if ((GPIO_Pin == GPIO_PIN_5))
- {
- ExitStop2ModeRTC();
- HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
- setUca3RxToRx();
- // uart[_COM3].active = true;
- }
- }
复制代码在EXTI的回调函数中退出了STOP2模式并重新将串口RX引脚配置为接收引脚 - void setUca3RxToExti(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- GPIO_InitStruct.Pin = GPIO_PIN_5;
- GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
- uart[_COM3].active = false;
- }
- void setUca3RxToRx(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- GPIO_InitStruct.Pin = GPIO_PIN_5;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- // // HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
- // // HAL_NVIC_EnableIRQ(USART3_IRQn);
- __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);
- // __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE | UART_IT_IDLE);
- }
复制代码串口中断 - void USER_USART3_IRQHandler(void)
- {
- uint8_t data = 0;
- if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) != RESET)
- {
- data = (uint8_t)huart3.Instance->RDR;
- wrEleQueue(&uart[_COM3].Rx, data);
- // uart[_COM3].active = true;
- // bleAppConfig.rxAct = 1;
- // bleAppConfig.tmrResp = bleAppConfig.tmrRxHold = HAL_LPTIM_ReadCounter(&hlptim1);
- // __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_RXNE);
- }
- // if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))
- // {
- // // uart[_COM3].flag = 1;
- // uart[_COM3].active = false;
- // __HAL_UART_CLEAR_IDLEFLAG(&huart3);
- // }
- }
复制代码
中间好像逻辑有点问题,但是我想不明白了哈哈,就是那个标志位被置位true后就会一直在内层的while中循环,出不来了,就进不去STOP2了,但是不知道在哪将它给置为false,本来想使用IDLE空闲中断的,但是空闲中断使用后收不到数据,现在不使用的时候第一包数据永远都是错误的,有没有大佬能帮忙看一下,谢谢大家 |