Tobbie 发表于 2021-10-20 17:01

定时器0和定时器3同时使用,出现定时器3无法正常工作

以下定时器配置,基本是例程,问题:两定时器同时启动run程序后,只有定时器1运行,定时器3没反应,将定时器0,run函数注释后两定时器工作,但没法调整pwm
//Timer3 配置
void App_Timer3Cfg(uint16_t u16Period)
{
    uint16_t                  u16ArrValue;
    uint16_t                  u16CntValue;
    stc_tim3_mode0_cfg_t   stcTim3BaseCfg;

    //结构体初始化清零
    DDL_ZERO_STRUCT(stcTim3BaseCfg);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Base Timer外设时钟使能

    stcTim3BaseCfg.enWorkMode = Tim3WorkMode0;            //定时器模式
    stcTim3BaseCfg.enCT       = Tim3Timer;                  //定时器功能,计数时钟为内部PCLK
    stcTim3BaseCfg.enPRS      = Tim3PCLKDiv16;            //PCLK/16
    stcTim3BaseCfg.enCntMode= Tim316bitArrMode;         //自动重载16位计数器/定时器
    stcTim3BaseCfg.bEnTog   = FALSE;
    stcTim3BaseCfg.bEnGate    = FALSE;
    stcTim3BaseCfg.enGateP    = Tim3GatePositive;

    Tim3_Mode0_Init(&stcTim3BaseCfg);                     //TIM3 的模式0功能初始化

    u16ArrValue = 0x10000 - u16Period ;

    Tim3_M0_ARRSet(u16ArrValue);                            //设置重载值(ARR = 0x10000 - 周期)

    u16CntValue = 0x10000 - u16Period;

    Tim3_M0_Cnt16Set(u16CntValue);                        //设置计数初值

    Tim3_ClearIntFlag(Tim3UevIrq);                        //清中断标志
    Tim3_Mode0_EnableIrq();                                 //使能TIM3中断(模式0时只有一个中断)
    EnableNvic(TIM3_IRQn, IrqLevel0, TRUE);               //TIM3 开中断
               
               
}
void Tim3_IRQHandler(void)
{
    //Timer3 模式0 计时溢出中断
    if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))
    {                          
      Get_Timer();//程序任务运行时间获取
      Tim3_ClearIntFlag(Tim3UevIrq);//Timer3模式0 中断标志清除
   }
}

/***************************************************************************
*   函 数 名: App_Timer0Cfg
*   功能说明: 定时器0初始化
*   形    参:
*   返 回 值:
*   说    明:
***************************************************************************/
void App_Timer0Cfg(uint16_t u16Period, uint16_t u16CHxACompare, uint16_t u16CHxBCompare)
{
    uint16_t                   u16CntValue;
    uint8_t                  u8ValidPeriod;
    stc_bt_mode23_cfg_t      stcBtBaseCfg;
    stc_bt_m23_compare_cfg_t   stcBtPortCmpCfg;

    //结构体初始化清零
//    DDL_ZERO_STRUCT(stcBtBaseCfg);
//    DDL_ZERO_STRUCT(stcBtPortCmpCfg);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, TRUE);   //Base Timer外设时钟

    stcBtBaseCfg.enWorkMode    = BtWorkMode3;            //三角波模式
    stcBtBaseCfg.enCT          = BtTimer;                  //定时器功能,计数时钟为内部PCLK
    stcBtBaseCfg.enPRS         = BtPCLKDiv1;               //PCLK
    //stcBtBaseCfg.enCntDir    = BtCntUp;                  //向上计数,在三角波模式中只读
    stcBtBaseCfg.enPWMTypeSel= BtIndependentPWM;         //独立输出PWM   //BtComplementaryPWM;
    stcBtBaseCfg.enPWM2sSel    = BtSinglePointCmp;         //单点比较功能
    stcBtBaseCfg.bOneShot      = FALSE;                  //循环计数
    stcBtBaseCfg.bURSSel       = FALSE;                  //上下溢更新

    Bt_Mode23_Init(TIM0, &stcBtBaseCfg);                   //TIM0 模式23功能初始化

    Bt_M23_ARRSet(TIM0, u16Period, TRUE);                  //设置重载值,并使能缓存

    Bt_M23_CCR_Set(TIM0, BtCCR0A, u16CHxACompare);         //设置比较值A

    Bt_M23_CCR_Set(TIM0, BtCCR0B, u16CHxBCompare);         //设置比较值B

    stcBtPortCmpCfg.enCH0ACmpCtrl   = BtPWMMode2;          //OCREFA输出控制OCMA:PWM模式2
    stcBtPortCmpCfg.enCH0APolarity= BtPortPositive;      //正常输出
    stcBtPortCmpCfg.bCh0ACmpBufEn   = TRUE;                //A通道缓存控制
    stcBtPortCmpCfg.enCh0ACmpIntSel = BtCmpIntNone;      //A通道比较控制:无

    stcBtPortCmpCfg.enCH0BCmpCtrl   = BtPWMMode2;          //OCREFB输出控制OCMB:PWM模式2
    stcBtPortCmpCfg.enCH0BPolarity= BtPortPositive;      //正常输出
    stcBtPortCmpCfg.bCH0BCmpBufEn   = TRUE;                //B通道缓存控
    stcBtPortCmpCfg.enCH0BCmpIntSel = BtCmpIntNone;      //B通道比较控制:无

    Bt_M23_PortOutput_Cfg(TIM0, &stcBtPortCmpCfg);         //比较输出端口控制

    u8ValidPeriod = 1;                                     //事件更新周期设置,0表示三角波波每半周期更新一次,每+1代表延迟半个周期
    Bt_M23_SetValidPeriod(TIM0,u8ValidPeriod);             //间隔周期设置

    u16CntValue = 0;
    Bt_M23_Cnt16Set(TIM0, u16CntValue);                  //设置计数初值

    Bt_ClearAllIntFlag(TIM0);                              //清中断标志
    Bt_Mode23_EnableIrq(TIM0,BtUevIrq);                  //使能TIM0 UEV更新中断
    EnableNvic(TIM0_IRQn, IrqLevel3, TRUE);                //TIM0中断使能
                                       
}




martinhu 发表于 2021-10-21 13:46

这两个函数注释之后,Timer0为社么还能运行???


Tobbie 发表于 2021-10-21 15:15

martinhu 发表于 2021-10-21 13:46
这两个函数注释之后,Timer0为社么还能运行???

我也想知道,现象就是我的电机还在转,示波器测出io有pwm输出

Tobbie 发表于 2021-10-21 16:40

Tobbie 发表于 2021-10-21 15:15
我也想知道,现象就是我的电机还在转,示波器测出io有pwm输出

搞错了,没有pwm输出,IO拉高而已

martinhu 发表于 2021-10-22 09:23

编译过不了

Tobbie 发表于 2021-10-22 10:07

martinhu 发表于 2021-10-22 09:23
编译过不了

你加这段代码进去看下,这边运行没报错的
typedef unsigned         int u8;
typedef unsigned         int u16;
typedef unsigned         int u32;


martinhu 发表于 2021-10-22 10:26


放开楼主注释的Timer0启动的104,105行,Timer0和Timer3都能运行啊,
timer3中断正常,timer0也能输出PWM



Tobbie 发表于 2021-10-23 13:52

martinhu 发表于 2021-10-22 10:26
放开楼主注释的Timer0启动的104,105行,Timer0和Timer3都能运行啊,
timer3中断正常,timer0也能输出PWM
...

感谢

Tobbie 发表于 2021-10-23 15:53

已找到问题,这里开了更新中断,没有清除对应标志位,导致一直卡在定时器0的中断函数

页: [1]
查看完整版本: 定时器0和定时器3同时使用,出现定时器3无法正常工作