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

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1M系列
  4. MD2 etmr0配置成输出比较异常问题

MD2 etmr0配置成输出比较异常问题

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

    MD2 etmr0一共配置了6个通道的输出比较,初始化时给一个时间去触发中断,进入中断后安排一段时间后再进入中断,如此循环,测试发现一共6个通道,有2个通道CH0,CH1正常,有4个通道CH4,CH5,CH6,CH7会停止进中断,同样的代码移植到ME0里没有问题!```
    code_text

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

      初始化:
      eTMR_DRV_Deinit(eTMR_INST_oc);
      eTMR_DRV_Init(eTMR_INST_oc, &eTMR_Config, &etmrState_oc);
      eTMR_DRV_InitOutputCompare(eTMR_INST_oc, &eTMR_OutputCmpParamConfig);
      INT_SYS_InstallHandler(eTMR0_Ch0_Ch1_IRQn, eTMR0_Ch0_Ch1_IRQHandler_OutputCompare, NULL);
      INT_SYS_InstallHandler(eTMR0_Ch4_Ch5_IRQn, eTMR0_Ch4_Ch5_IRQHandler_OutputCompare, NULL);
      INT_SYS_InstallHandler(eTMR0_Ch6_Ch7_IRQn, eTMR0_Ch6_Ch7_IRQHandler_OutputCompare, NULL);

      /* set priority */
      INT_SYS_SetPriority(eTMR0_Ch0_Ch1_IRQn,2);
      INT_SYS_SetPriority(eTMR0_Ch4_Ch5_IRQn,2);
      INT_SYS_SetPriority(eTMR0_Ch6_Ch7_IRQn,2);
      
      /* Enable IRQ in NVIC level */
      INT_SYS_EnableIRQ(eTMR0_Ch0_Ch1_IRQn);
      INT_SYS_EnableIRQ(eTMR0_Ch4_Ch5_IRQn);
      INT_SYS_EnableIRQ(eTMR0_Ch6_Ch7_IRQn);
      
      eTMR0->INTE |= eTMR_INTE_CH0IE_MASK;
      eTMR0->INTE |= eTMR_INTE_CH1IE_MASK;
      eTMR0->INTE |= eTMR_INTE_CH4IE_MASK;
      eTMR0->INTE |= eTMR_INTE_CH5IE_MASK;
      eTMR0->INTE |= eTMR_INTE_CH6IE_MASK;
      eTMR0->INTE |= eTMR_INTE_CH7IE_MASK;
      eTMR_DRV_Enable(eTMR_INST_oc);
      

      中断:
      uint32_t statusFlags = 0U;
      statusFlags = g_etmrBase[eTMR0_INST_PWM]->STS; //read channel status flags.
      if( (statusFlags&eTMR_STS_CH6F_MASK) == eTMR_STS_CH6F_MASK ) //channel2
      {
      g_etmrBase[eTMR0_INST_PWM]->STS = eTMR_STS_CH6F_MASK;

      	//g_etmrBase[eTMR0_INST_PWM]->SYNC |= eTMR_SYNC_LDOK_MASK|eTMR_SYNC_SWTRIG_MASK;
          //点火2
          OC_IGN2_OnInterrupt(g_etmrBase[eTMR0_INST_PWM]->CNT);
      }
      if( (statusFlags&eTMR_STS_CH7F_MASK) == eTMR_STS_CH7F_MASK )
      {
      	g_etmrBase[eTMR0_INST_PWM]->STS = eTMR_STS_CH7F_MASK;
      
      	//g_etmrBase[eTMR0_INST_PWM]->SYNC |= eTMR_SYNC_LDOK_MASK|eTMR_SYNC_SWTRIG_MASK;
      	//点火1
          OC_IGN_OnInterrupt(g_etmrBase[eTMR0_INST_PWM]->CNT);
      }
      

      void OC_IGN_OnInterrupt(uint32_t c_val)//ch7
      {
      switch(MCU_PWMSignal_7_PD10_st)
      {
      case 0:
      break;
      case 1:
      dri_FUN_oc_ch7_Trig(500,1);
      MCU_PWMSignal_7_PD10_st = 2;
      break;
      case 2:
      dri_FUN_oc_ch7_Trig(500,0);
      MCU_PWMSignal_7_PD10_st = 1;
      break;
      default:
      break;
      }
      }
      触发:
      void dri_FUN_oc_ch0_Trig(uint32_t time, uint32_t ST)
      {
      #if (M_OC_Mode == M_OC_out_PWM_Mode)
      uint32_t val0_set_v;
      eTMR_Type * const etmrBase = g_etmrBase[eTMR_INST_oc];
      eTMR_DRV_ClearLdok(eTMR_INST_oc);
      val0_set_v = etmrBase->CNT + time;
      if( val0_set_v >= (etmrBase->MOD+1) )
      {
      val0_set_v = val0_set_v - (etmrBase->MOD+1); //correct new val0
      }
      eTMR_DRV_UpdateOutputCompareChannel(eTMR_INST_oc,M_MCU_ocSignal_0_ch,val0_set_v,val0_set_v,ST,ST,1);

      #endif
      }

      1 条回复 最后回复
      0

    • 云途开发生态介绍

      快速上手云途开发生态

    • 云途论坛规则/Yuntu Forum Rules

      发帖前请查看

    • YT CONFIG TOOL调查问卷

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

    • can
      28
      demo
      23
      uds
      14
      lin stack
      13
      md14
      6
      yt-link
      6
      fbl
      5
      adc模块
      4
      Online Users
      • 登录

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