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

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 发布者 138 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 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
    • 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

                    • 云途论坛规则/Yuntu Forum Rules

                      发帖前请查看

                    • YCT离线License申请流程

                      帮助没办法联网的电脑使用YCT

                    • YT CONFIG TOOL调查问卷

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

                    • demo
                      12
                      can
                      9
                      lin stack
                      6
                      yt-link
                      5
                      vscode
                      3
                      adc模块
                      2
                      i2c
                      2
                      uuid
                      2
                      Online Users
                      • 登录

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