跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1H系列
  4. HA Rtc_Wakeup_Demo例程 增加一路串口使用DMA,收发数据后,无法进入休眠(deepsleep)

HA Rtc_Wakeup_Demo例程 增加一路串口使用DMA,收发数据后,无法进入休眠(deepsleep)

已定时 已固定 已锁定 已移动 已解决 YTM32B1H系列
10 帖子 2 发布者 3.0k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • gaoShengG 离线
    gaoShengG 离线
    gaoSheng
    写于 最后由 gaoSheng 编辑
    #1

    在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

    e95b7e3a-ed9e-4d34-a84e-fba955f6ae58-1744094742050.png
    如果不给UART2发送数据,能正常进入低功耗
    54a82028-c9db-4706-b8d9-c2f60be487d5-image.png

    如果uart2不使用DMA同样也能正常进入低功耗
    55011c05-8a37-476d-b71b-956bc6785a5c-image.png
    下图是UART2不使用DMA的测试情况,能正常进入低功耗
    03a63c4a-37ca-4d56-a46e-613f1f9a3815-image.png

    尝试了在进入低功耗前逆初始化DMA和串口,或者是stop也同样会重启
    f2e36ef1-22cd-42b4-a674-62f9aa03c062-image.png
    下面是我的工程
    Rtc_Wakeup_Demo_20250408 (2).zip

    1 条回复 最后回复
    0
    • gaoShengG 离线
      gaoShengG 离线
      gaoSheng
      在 回复了 Diga 最后由 编辑
      #7

      Diga 感谢,我那个RTC的工程在setmode前手动置位sleep确实可以成功进入低功耗。
      但是我后面Power_Pin_Wakeup_From_Powerdown_Mode_Demo例程改的一个使用pin GPIO PTE3(SW2)来唤醒deepsleep的工程还是会重启
      2fc4223a-d2bd-44a6-93de-63f43e5cdcb7-image.png
      Power_Pin_Wakeup_From_deepsleep_Demo (2).zip

      1 条回复 最后回复
      0
      • DigaD 离线
        DigaD 离线
        Diga
        写于 最后由 编辑
        #2

        引脚选择有问题,开发板的PTD17 连接的是以太网的 MDC 引脚,是以太网的时钟脚,默认是下拉的,你换个引脚,或者换组引脚就好了,比如 PTA29,PTA30

        gaoShengG 1 条回复 最后回复
        0
        • gaoShengG 离线
          gaoShengG 离线
          gaoSheng
          在 回复了 Diga 最后由 编辑
          #3

          Diga cb57b8cc-cd58-4cb5-bbb8-3d90b1bbb01a-image.png 365def66-2625-44db-bb5c-aaa6fd9c528c-image.png
          切换到PTA29和PTA30还是会复现,是工程配置的问题吗
          Rtc_Wakeup_Demo_20250409.zip

          1 条回复 最后回复
          0
          • gaoShengG 离线
            gaoShengG 离线
            gaoSheng
            写于 最后由 gaoSheng 编辑
            #4

            我在Power_Pin_Wakeup_From_Powerdown_Mode_Demo例程基础上面改了一个更简化的工程(主要是为了排除上个工程RTC的影响),改成了使用GPIO来唤醒deepsleep。同样能复现问题

            在进入deepsleep前,如果uart2(PTA29 PTA30)没有收发过数据,就能正常低功耗并由GPIO PTE3(SW2)唤醒,反之则会重启RSSR 的LPACK被置位
            8de8e624-639c-4fa9-b1d1-8f75122a12bd-image.png

            f8d1962b-5ccc-431a-8aa5-ad855abbb7fb-image.png
            下面是我的工程
            855424cb-2b9f-45c8-a94e-b5635e4cba2f-Power_Pin_Wakeup_From_deepsleep_Demo.zip

            int 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 */
            }
            
            1 条回复 最后回复
            0
            • DigaD 离线
              DigaD 离线
              Diga
              写于 最后由 编辑
              #5

              正在看,我试了一下,之前那个工程,在进低功耗前 start RTC,退出低功耗后 stop RTC 是可以正常的,正在看问题点

              1 条回复 最后回复
              0
              • DigaD 离线
                DigaD 离线
                Diga
                写于 最后由 编辑
                #6

                问题大概找到了,LINFlexD UART 在 DMA 下接收到数据后,状态机不会自恢复,会导致MCU 无法响应低功耗请求,导致 LPACK 复位。
                解决办法是在进入低功耗前,置位 sleep,退出低功耗后,清除 sleep。
                目前没有相关 API,后续会做修复

                image.png

                gaoShengG 2 条回复 最后回复
                1
                • gaoShengG 离线
                  gaoShengG 离线
                  gaoSheng
                  在 回复了 Diga 最后由 编辑
                  #7

                  Diga 感谢,我那个RTC的工程在setmode前手动置位sleep确实可以成功进入低功耗。
                  但是我后面Power_Pin_Wakeup_From_Powerdown_Mode_Demo例程改的一个使用pin GPIO PTE3(SW2)来唤醒deepsleep的工程还是会重启
                  2fc4223a-d2bd-44a6-93de-63f43e5cdcb7-image.png
                  Power_Pin_Wakeup_From_deepsleep_Demo (2).zip

                  1 条回复 最后回复
                  0
                  • gaoShengG 离线
                    gaoShengG 离线
                    gaoSheng
                    在 回复了 Diga 最后由 gaoSheng 编辑
                    #8

                    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
                    
                    1 条回复 最后回复
                    0
                    • DigaD 离线
                      DigaD 离线
                      Diga
                      写于 最后由 编辑
                      #9

                      你的待接收数据是 1024 个,但接收了 8 个数据就进低功耗了,此时 LINFlexD UART 还处于等待 DMA 接收,是无法进入低功耗的,你必须把当前接收 abort 掉

                      gaoShengG 1 条回复 最后回复
                      1
                      • gaoShengG 离线
                        gaoShengG 离线
                        gaoSheng
                        在 回复了 Diga 最后由 编辑
                        #10

                        Diga 感谢😊 ,abort后测试确实OK了。

                        1 条回复 最后回复
                        0
                        • ,FrankieF Frankie 将这个主题转为问答主题
                        • ,FrankieF Frankie 将这个主题标记为已解决

                      • 云途开发生态介绍

                        快速上手云途开发生态

                      • 云途论坛规则/Yuntu Forum Rules

                        发帖前请查看

                      • YT CONFIG TOOL调查问卷

                        帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                      • can
                        25
                        demo
                        22
                        lin stack
                        13
                        uds
                        13
                        md14
                        6
                        yt-link
                        6
                        fbl
                        5
                        adc模块
                        4
                        Online Users
                        Gavin2G
                        Gavin2
                        ljmL
                        ljm
                        ganyongchaoG
                        ganyongchao
                        QihaQ
                        Qiha
                        • 登录

                        • 登录或注册以进行搜索。
                        • 第一个帖子
                          最后一个帖子
                        0
                        • 版块
                        • 最新
                        • 标签
                        • 热门