硬汉嵌入式论坛

 找回密码
 立即注册
查看: 918|回复: 4
收起左侧

[技术讨论] 串口RX引脚外部唤醒

[复制链接]

24

主题

50

回帖

122

积分

初级会员

积分
122
发表于 2024-10-28 10:59:05 | 显示全部楼层 |阅读模式
使用STM32L4的芯片,在进入stop2模式之前先将RX引脚设置为EXTI模式,然后当接收到数据的时候退出stop2模式再将RX引脚设置为串口接收模式

基本思路是:
1、进入stop2,配置PC5为EXTI外部触发

2、主循环中进入stop2模式
3、使用串口调试助手发送数据,当接收到数据的时候,EXTI外部中断触发,退出STOP2模式,重新配置串口
但是好像串口不起作用。
串口接收中断:
[C] 纯文本查看 复制代码
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);
  }
  if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))
  {
    uart[_COM3].flag = 1;
    __HAL_UART_CLEAR_IDLEFLAG(&huart3);
  }
}

进入和退出STOP2模式:
[C] 纯文本查看 复制代码
void EnterStop2ModeRTC(void) // 自定义的Enter函数
{
  // printf("START STOP2 RTC\r\n");
  __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();
  // HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 4, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); // 休眠4s
  // SystemPeripheralClockDisable();
  // setUca3RxToExti(); // 配置串口3的RX为EXTI触发
  setUca3RxToExti();
  HAL_SuspendTick();

  HAL_DBGMCU_EnableDBGStopMode();
  __HAL_RCC_PWR_CLK_ENABLE();                  // 打开电源控制时钟
  HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); // 进入STOP2模式
}

void ExitStop2ModeRTC(void)
{
  SystemClock_Config(); // 配置系统时钟
  HAL_ResumeTick();
  // SystemPeripheralClockEnable();
  setUca3RxToRx();
  SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; // 退出中断时不再自动进入低功耗模式

  // printf("STOP2 END RTC\r\n");
}

配置接收引脚状态:
[C] 纯文本查看 复制代码
void setUca3RxToExti(void)
{
  HAL_UART_MspDeInit(&huart3);
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  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);
}

void setUca3RxToRx(void)
{
  // __HAL_RCC_USART3_CLK_ENABLE();
  // __HAL_RCC_GPIOC_CLK_ENABLE();
  // GPIO_InitTypeDef GPIO_InitStruct = {0};
  // 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_MspInit(&huart3);
  MX_USART3_UART_Init();
  __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE | UART_IT_IDLE);
}

EXTI中断函数:
[C] 纯文本查看 复制代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if ((GPIO_Pin == GPIO_PIN_5))
  {
    if ((HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5) == GPIO_PIN_RESET))
    {
      ExitStop2ModeRTC();
    }
  }
}

主函数:
[C] 纯文本查看 复制代码
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_LPTIM1_Init();
  MX_USART3_UART_Init();
  MX_RTC_Init();
  MX_SPI1_Init();
  _VDP_ON; // 外设电源打开
  HAL_Delay(100);
  _SD_POW_ON; // SD卡打开
  MX_SDMMC1_SD_Init();
  memory_init();
  lcd_init(true);
  setLcd();
  lcd_full();
  bleQueueInit();
__HAL_RTC_WAKEUPTIMER_ENABLE_IT(&hrtc, RTC_IT_WUT);
  HAL_LPTIM_TimeOut_Start_IT(&hlptim1, 10, 10);

  while (1)
  {
//    while (getExitLPM3())
//    {
//      saveData();
//      lcdActionPro(); // lcd进程
//      keyActPro();
//    }
    EnterStop2ModeRTC();
  }
}

回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-10-28 11:03:37 | 显示全部楼层
直接用lpurat唤醒就行了
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-10-28 11:22:35 | 显示全部楼层
zhangqt 发表于 2024-10-28 11:03
直接用lpurat唤醒就行了

不行啊,一共4个串口USART1-3和LPUART都用到了,都需要进入低功耗
回复

使用道具 举报

24

主题

365

回帖

437

积分

高级会员

积分
437
发表于 2024-10-28 14:17:47 | 显示全部楼层
退出stop模式后,需不需要把接收引脚的EXIT中断给关掉呢,没看到你操作啊。
这种东西只能一点点试。
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-10-29 08:18:25 | 显示全部楼层
tovinz 发表于 2024-10-28 14:17
退出stop模式后,需不需要把接收引脚的EXIT中断给关掉呢,没看到你操作啊。
这种东西只能一点点试。

试了,也不行
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:30 , Processed in 0.040581 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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