STM32L431在STOP2模式下能否将串口的RX配置成EX
ti唤醒呢?为什么我的唤醒不了呢?并且空闲中断也不能用,手册中说在硬件上已经将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空闲中断的,但是空闲中断使用后收不到数据,现在不使用的时候第一包数据永远都是错误的,有没有大佬能帮忙看一下,谢谢大家