HA Rtc_Wakeup_Demo例程 增加一路串口使用DMA,收发数据后,无法进入休眠(deepsleep)
-
在HA01EVB Rev.B demo板测试 使用的是外部32K的低速晶振(需要手动改一个电阻位置https://forum.ytmicro.com/topic/624/ha-gpt_rtc_wakeup_demo%E4%BE%8B%E7%A8%8B-rtc%E6%99%B6%E6%8C%AF%E4%B8%8D%E8%B5%B7%E6%8C%AF)
如果在Rtc_Wakeup_Demo例程上增加一路uart2(PTE12 、PTD17),使用DMA,在进入低功耗前收发数据,到导致MCU重启,查看RSSR为LPACK
如果不给UART2发送数据,能正常进入低功耗
如果uart2不使用DMA同样也能正常进入低功耗
下图是UART2不使用DMA的测试情况,能正常进入低功耗
尝试了在进入低功耗前逆初始化DMA和串口,或者是stop也同样会重启
下面是我的工程
Rtc_Wakeup_Demo_20250408 (2).zip -
我在Power_Pin_Wakeup_From_Powerdown_Mode_Demo例程基础上面改了一个更简化的工程(主要是为了排除上个工程RTC的影响),改成了使用GPIO来唤醒deepsleep。同样能复现问题
在进入deepsleep前,如果uart2(PTA29 PTA30)没有收发过数据,就能正常低功耗并由GPIO PTE3(SW2)唤醒,反之则会重启RSSR 的LPACK被置位
下面是我的工程
855424cb-2b9f-45c8-a94e-b5635e4cba2f-Power_Pin_Wakeup_From_deepsleep_Demo.zipint main(void) { /* USER CODE BEGIN 1 */ status_t status = STATUS_SUCCESS; /* USER CODE END 1 */ Board_Init(); /* USER CODE BEGIN 2 */ // WKU_DRV_SetPinIsolation(false); PRINTF("Power Pin Wakeup from deepsleep Mode!\r\n"); rssr = RCU->RSSR; PRINTF("RSSR: 0x%08x\r\n",rssr); if ((RCU_RSSR_LPACK_MASK ) & RCU->RSSR) { PRINTF("RCU_RSSR_LPACK_MASK.\r\n"); RCU->RSSR = RCU_RSSR_LPACK_MASK ; } INT_SYS_EnableIRQ(GPIOE_IRQn); OSIF_TimeDelay(5000); #if 1 // 注意: # 这里if 1 #endif包围的代码, 用于等待UART2数据. // 外部给UART2发送数据, MCU一旦接收到数据, 就会在调用POWER_SYS_SetMode后重启 LINFlexD_UART_DRV_ReceiveData(2, &buff, sizeof(buff)); uint32_t remain_bytes = sizeof(buff); // while (LINFlexD_UART_DRV_GetReceiveStatus(2, NULL) != STATUS_SUCCESS) PRINTF("waiting 8 bytes from UART2...\r\n"); while (1) { LINFlexD_UART_DRV_GetReceiveStatus(2, &remain_bytes); if (remain_bytes < sizeof(buff) - 8) { LINFlexD_UART_DRV_SendDataBlocking(2,&buff,8,0xFF); break; } } // LINFlexD_UART_DRV_SendData(2, buff, 8); #endif PRINTF("Start to enter deepsleep mode.\n"); // LINFlexD_UART_DRV_AbortSendingData(2); // LINFlexD_UART_DRV_AbortReceivingData(2); // LINFlexD_UART_DRV_Deinit(2); // Enter into deepsleep mode OSIF_TimeDelay(1000); RCU->RSSR = 0xFFFFFFFF; POWER_SYS_SetMode(DEEPSLEEP_MODE, POWER_MANAGER_POLICY_AGREEMENT); PRINTF("Wakeup from deepsleep "); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if (status != STATUS_SUCCESS) { break; } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } return status; /* USER CODE END 3 */ }
-
Diga 大哥,下面那个Power_Pin_Wakeup_From_deepsleep_Demo工程应该是测试方法的问题,我改成之前的能正常进入低功耗
LINFlexD_UART_DRV_ReceiveDataBlocking(2,&buff, 1,0x8FF); LINFlexD_UART_DRV_SendDataBlocking(2,&buff,1,0xFF);
但是我还是有点好奇下面这个测试方法是哪有问题,因为我用这个测试方法在RTC的Rtc_Wakeup_Demo_20250409工程里面测试也是置位sleep位后也能正常进低功耗
// 2. 开启UART接收, 直到接收到8个字节 LINFlexD_UART_DRV_ReceiveData(2, buff, sizeof(buff)); #if 1 // 注意: # 这里if 1 #endif包围的代码, 用于等待UART2数据. // 外部给UART2发送数据, MCU一旦接收到数据, 就会在调用POWER_SYS_SetMode后重启 uint32_t remain_bytes = sizeof(buff); // while (LINFlexD_UART_DRV_GetReceiveStatus(2, NULL) != STATUS_SUCCESS) PRINTF("waiting 8 bytes from UART2...\r\n"); while (1) { LINFlexD_UART_DRV_GetReceiveStatus(2, &remain_bytes); // 只收8个字节就跳出循环 if (remain_bytes < sizeof(buff) - 8) { break; } } // LINFlexD_UART_DRV_SendData(2, buff, 8); #endif
发帖前请查看
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...