问答

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

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

国产芯片 单片机 技术交流 HC32L190 定时器 TI

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

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

时钟配置:



定时器配置:





回答 +关注 0
4259人浏览 8人回答问题 分享 举报
8 个回答
  • 上来甩代码 基本萌新
  • 例程行不行
  • zhangjiaming123 发表于 2025-3-10 16:40
    你好我修改了时钟然后现在pclk现在是48mhz
    定时器配置:
    static void App_Timer0Cfg(void)

    你跑例程吧,对你这个事情我比较无语。
    看例程是否能正常跑
  • wubangmi 发表于 2025-3-10 12:49
    你的代码我给你跑了一下,能正常跑,可能是我运气好。但是你代码有缺陷,具体见升频部分(图片里的先切到低 ...

    你好我修改了时钟然后现在pclk现在是48mhz
    定时器配置:
    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 = BtPCLKDiv8;         // PCLK/16
        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, u16CntValue); // 设置计数初值

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

    然后我的配置也就变了一些,之后我debug后,ARR的数值不变,但是CNT的数值都是几百几百的增加,我配置的是1ms进入一次溢出中断,但是他一次都是几百几百的加,进入一次溢出中断都要几分钟了,你知道这是为什么吗?还有就算我的时钟不进行配置,用系统默认的4mhz,程序中只配置定时器也是一样的慢
  • 你的代码我给你跑了一下,能正常跑,可能是我运气好。但是你代码有缺陷,具体见升频部分(图片里的先切到低频的部分)。你在你的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();
    }
  • 时钟配置:

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