OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 133|回复: 0

STM32L431在STOP2模式下能否将串口的RX配置成EXTI唤醒呢?为什么我的唤醒不了呢?并且空闲中断也不能用

[复制链接]

14

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2022-11-5
在线时间
28 小时
发表于 2024-10-31 16:06:13 | 显示全部楼层 |阅读模式
本帖最后由 zhouyalong 于 2024-10-31 16:07 编辑

STM32L431在STOP2模式下能否将串口的RX配置成EXTI唤醒呢?为什么我的唤醒不了呢?并且空闲中断也不能用,手册中说在硬件上已经将EXTI与RX引脚连到一块了,但是呢STOP2模式不能将串口唤醒,所以它的那种方式好像不能使用,只能用最原始的将RX配置成EXTI的方式了,但是也还是唤醒不了
进入STOP2模式,
  1. void EnterStop2ModeRTC(void) // 自定义的Enter函数
  2. {
  3.   __HAL_RCC_PWR_CLK_ENABLE();
  4.   __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  5.   __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);
  6.   __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG();
  7.   __HAL_RTC_TIMESTAMP_CLEAR_FLAG(&hrtc, RTC_FLAG_TSF);
  8.   __HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG();
  9.   while (__HAL_UART_GET_FLAG(&huart3, USART_ISR_BUSY) == SET)
  10.     ;
  11.   while (__HAL_UART_GET_FLAG(&huart3, USART_ISR_REACK) == RESET)
  12.     ;
  13.   setUca3RxToExti();//配置串口3的RX为EXTI
  14.   HAL_SuspendTick();
  15.   //HAL_DBGMCU_EnableDBGStopMode();
  16.   __HAL_RCC_PWR_CLK_ENABLE();
  17.   HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); // 进入STOP2模式
  18. }
复制代码
退出STOP2
  1. void ExitStop2ModeRTC(void)
  2. {
  3.   SystemClock_Config();
  4.   HAL_ResumeTick();
  5.   SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk;
  6. }
复制代码
主函数
  1. while (1)
  2.   {
  3.     while (getExitLPM3())
  4.     {
  5.       saveData();
  6.       lcdActionPro(); // lcd进程
  7.       keyActPro();
  8.       // if (uart[_COM3].active)
  9.       // {
  10.       // }
  11.       }
  12.     }
  13.     EnterStop2ModeRTC();
  14.   }
复制代码
在函数getExitLPM3()中,判断了一个标志位是否被置位,如果置位了就进入里面的while
EXTI回调函数:
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.   if ((GPIO_Pin == GPIO_PIN_5))
  4.   {
  5.     ExitStop2ModeRTC();
  6.     HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
  7.     setUca3RxToRx();
  8.     // uart[_COM3].active = true;
  9.   }
  10. }
复制代码
在EXTI的回调函数中退出了STOP2模式并重新将串口RX引脚配置为接收引脚
  1. void setUca3RxToExti(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct;
  4.   GPIO_InitStruct.Pin = GPIO_PIN_5;
  5.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  6.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  7.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  8.   HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
  9.   HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
  10.   uart[_COM3].active = false;
  11. }

  12. void setUca3RxToRx(void)
  13. {
  14.   GPIO_InitTypeDef GPIO_InitStruct;
  15.   GPIO_InitStruct.Pin = GPIO_PIN_5;
  16.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  17.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  18.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  19.   GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
  20.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  21.   // // HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
  22.   // // HAL_NVIC_EnableIRQ(USART3_IRQn);
  23.   __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);
  24.   // __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE | UART_IT_IDLE);
  25. }
复制代码
串口中断
  1. void USER_USART3_IRQHandler(void)
  2. {
  3.   uint8_t data = 0;
  4.   if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) != RESET)
  5.   {
  6.     data = (uint8_t)huart3.Instance->RDR;
  7.     wrEleQueue(&uart[_COM3].Rx, data);
  8.     // uart[_COM3].active = true;
  9.     // bleAppConfig.rxAct = 1;
  10.     // bleAppConfig.tmrResp = bleAppConfig.tmrRxHold = HAL_LPTIM_ReadCounter(&hlptim1);
  11.     // __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_RXNE);
  12.   }
  13.   // if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))
  14.   // {
  15.   //   // uart[_COM3].flag = 1;
  16.   //   uart[_COM3].active = false;
  17.   //   __HAL_UART_CLEAR_IDLEFLAG(&huart3);
  18.   // }
  19. }
复制代码

中间好像逻辑有点问题,但是我想不明白了哈哈,就是那个标志位被置位true后就会一直在内层的while中循环,出不来了,就进不去STOP2了,但是不知道在哪将它给置为false,本来想使用IDLE空闲中断的,但是空闲中断使用后收不到数据,现在不使用的时候第一包数据永远都是错误的,有没有大佬能帮忙看一下,谢谢大家
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 07:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表