打印

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

[复制链接]
4278|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我在HC32L190FCUA上运行TIMER0定时中断,进不了中断,为什么?
注:使用驱动库中的DEMO, keil 中有 --keep=*Handler。
然后主函数while循环中能正常运行,然后初始化时我把
stcBtBaseCfg.enGateP = BtGatePositive;是无效的,必须要在debug中手动开启gatep=1才会开启计数?然后UIE我也需要手动勾选,然后呢勾选完这两个之后他可以进入中断函数Tim0_IRQHandler(),但是进入不了溢出中断里面,这又是为啥呀???下面是我的配置

时钟配置:



定时器配置:





使用特权

评论回复
沙发
zhangjiaming123|  楼主 | 2025-3-10 11:16 | 只看该作者

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

时钟配置:

使用特权

评论回复
板凳
zhangjiaming123|  楼主 | 2025-3-10 11:17 | 只看该作者

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

时钟配置:


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();
}

使用特权

评论回复
地板
zhangjiaming123|  楼主 | 2025-3-10 11:18 | 只看该作者

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

定时器配置:

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++;
    }
}



使用特权

评论回复
5
wubangmi| | 2025-3-10 12:49 | 只看该作者
你的代码我给你跑了一下,能正常跑,可能是我运气好。但是你代码有缺陷,具体见升频部分(图片里的先切到低频的部分)。你在你的MCU跑不起来,可能就是这个问题导致的,不按照手册上的规范进行升频的话,有0.2~0.5%的概率代码是跑不起来的,
也许你就是这个小概率。在不熟悉的情况下尽可能的去跑例程。


1.jpg (1.07 MB )

1.jpg

2.jpg (532.04 KB )

2.jpg

使用特权

评论回复
6
zhangjiaming123|  楼主 | 2025-3-10 16:40 | 只看该作者
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,程序中只配置定时器也是一样的慢

使用特权

评论回复
7
wubangmi| | 2025-3-10 17:41 | 只看该作者
zhangjiaming123 发表于 2025-3-10 16:40
你好我修改了时钟然后现在pclk现在是48mhz
定时器配置:
static void App_Timer0Cfg(void)

你跑例程吧,对你这个事情我比较无语。
看例程是否能正常跑

使用特权

评论回复
8
xionghaoyun| | 2025-3-11 14:00 | 只看该作者
例程行不行

使用特权

评论回复
9
xionghaoyun| | 2025-3-11 14:00 | 只看该作者
上来甩代码 基本萌新

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝