问答

汇集网友智慧,解决技术难题

21ic问答首页 - HC32L190FCUA无法进入定时器0溢出中断

国产芯片 单片机 技术交流

HC32L190FCUA无法进入定时器0溢出中断

我在HC32L190FCUA上运行TIMER0定时中断,进不了中断,为什么?
注:使用驱动库中的DEMO, keil 中有 --keep=*Handler。
然后主函数while循环中能正常运行,然后初始化时我把
stcBtBaseCfg.enGateP = BtGatePositive;是无效的,必须要在debug中手动开启gatep=1才会开启计数?然后UIE我也需要手动勾选,然后呢勾选完这两个之后他可以进入中断函数Tim0_IRQHandler(),但是进入不了溢出中断里面,这又是为啥呀???下面是我的配置

时钟配置:



定时器配置:





回答 +关注 0
58人浏览 4人回答问题 分享 举报
4 个回答
  • 你的代码我给你跑了一下,能正常跑,可能是我运气好。但是你代码有缺陷,具体见升频部分(图片里的先切到低频的部分)。你在你的MCU跑不起来,可能就是这个问题导致的,不按照手册上的规范进行升频的话,有0.2~0.5%的概率代码是跑不起来的,
    也许你就是这个小概率。在不熟悉的情况下尽可能的去跑例程。


  • 定时器配置:

    static void App_Timer0Cfg(void)
    {
        uint16_t u16ArrValue = 0x10000 - 6000; // 1ms中断一次(24MHz系统时钟)
        uint16_t u16CntValue = 0x10000 - 6000;
        stc_bt_mode0_cfg_t stcBtBaseCfg;
        DDL_ZERO_STRUCT(stcBtBaseCfg);
        Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, TRUE); // Base Timer外设时钟使能

        stcBtBaseCfg.enWorkMode = BtWorkMode0;   // 定时器模式
        stcBtBaseCfg.enCT = BtTimer;             // 定时器功能,计数时钟为内部PCLK
        stcBtBaseCfg.enPRS = BtPCLKDiv4;         // PCLK/4
        stcBtBaseCfg.enCntMode = Bt16bitArrMode; // 自动重载16位计数器/定时器
        stcBtBaseCfg.enGateP = BtGatePositive;
        stcBtBaseCfg.bEnTog = FALSE;
        stcBtBaseCfg.bEnGate = FALSE;
        Bt_Mode0_Init(TIM0, &stcBtBaseCfg);

        Bt_M0_ARRSet(TIM0, u16ArrValue); // 设置重载值
        Bt_M0_Cnt16Set(TIM0, 0);         // 设置计数初值

        Bt_ClearAllIntFlag(TIM0);               // 清中断标志
        Bt_Mode0_EnableIrq(TIM0);               // 使能TIM0中断
        EnableNvic(TIM0_IRQn, IrqLevel0, TRUE); // TIM0中断使能
        Bt_M0_Run(TIM0);                        // 启动定时器
    }

    volatile uint32_t delaytick = 0;
    void Tim0_IRQHandler(void)
    {
        if (TRUE == Bt_GetIntFlag(TIM0, BtUevIrq))
        {
            Bt_ClearIntFlag(TIM0, BtUevIrq); // 中断标志清零
            delaytick++;
        }
    }



  • 时钟配置:


    uint32_t SystemHclkClock = 0;

    // add clock source.
    void ClockUpdate(void) // Update SystemCoreClock variable
    {
            SystemCoreClock = Sysctrl_GetHClkFreq();
            SystemHclkClock = Sysctrl_GetPClkFreq();
    }

    // 系统时钟配置
    void App_ClkCfg(void)
    {
            stc_sysctrl_clk_cfg_t stcCfg;

            // 因要使用的时钟源HCLK小于等于24M:此处设置FLASH 读等待周期为0 cycle(默认值也为0 cycle)
            Flash_WaitCycle(FlashWaitCycle0);

            // 时钟初始化前,优先设置要使用的时钟源
            Sysctrl_SetRCHTrim(SysctrlRchFreq24MHz);

            // 选择内部RCH作为HCLK时钟源;
            stcCfg.enClkSrc = SysctrlClkRCH;
            // HCLK SYSCLK/1
            stcCfg.enHClkDiv = SysctrlHclkDiv1;
            // PCLK 为HCLK/1
            stcCfg.enPClkDiv = SysctrlPclkDiv1;
            // 系统时钟初始化
            Sysctrl_ClkInit(&stcCfg);
    }

    void BSPInit(void)
    {
            App_ClkCfg();
            ClockUpdate();
    }
  • 时钟配置:

您需要登录后才可以回复 登录 | 注册