打印

求助,gd32的systick_handler进不去,感谢大佬帮忙看看

[复制链接]
1885|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zuyilu|  楼主 | 2022-5-25 15:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
AN, TI, ic, ck
下面这个系统时钟配置,都是官方给的例程,直接复制的。我现在想用us函数,然后用了方式2,结果无法进入SysTick_Handler。感谢大家帮忙
void systick_config(void)
{
        #if 方式1,可以进入SysTick_Handler
        /* setup systick timer for 1000Hz interrupts */
    if(SysTick_Config(SystemCoreClock / 1000U)){
        /* capture error */
        while(1){
        }
    }
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
        #endif
       
        #if 方式2,无法进入SysTick_Handler,但是我需要用us延时函数
    /* systick clock source is from HCLK/8 */
    systick_clksource_set(SYSTICK_CLKSOURCE_HCLK_DIV8);
    count_1us = (float)SystemCoreClock/8000000;
    count_1ms = (float)count_1us * 1000;
        #endif
}


使用特权

评论回复
沙发
zuyilu|  楼主 | 2022-5-25 15:20 | 只看该作者
方式1的完整代码
void systick_config(void)
{
    /* setup systick timer for 1000Hz interrupts */
    if(SysTick_Config(SystemCoreClock / 1000U)){
        /* capture error */
        while(1){
        }
    }
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
}
void delay_1ms(uint32_t count)
{
    delay = count;

    while(0U != delay){
    }
}
void delay_decrement(void)
{
    if(0U != delay){
        delay--;
    }
}

使用特权

评论回复
板凳
zuyilu|  楼主 | 2022-5-25 15:23 | 只看该作者
方式2的完整代码
void systick_config(void)
{
    /* systick clock source is from HCLK/8 */
    systick_clksource_set(SYSTICK_CLKSOURCE_HCLK_DIV8);
    count_1us = (float)SystemCoreClock/8000000;
    count_1ms = (float)count_1us * 1000;
}
void delay_1us(uint32_t count)
{
    uint32_t ctl;
   
    /* reload the count value */
    SysTick->LOAD = (uint32_t)(count * count_1us);
    /* clear the current count value */
    SysTick->VAL = 0x0000U;
    /* enable the systick timer */
    SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
    /* wait for the COUNTFLAG flag set */
    do{
        ctl = SysTick->CTRL;
    }while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));
    /* disable the systick timer */
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
    /* clear the current count value */
    SysTick->VAL = 0x0000U;
}
void delay_1ms(uint32_t count)
{
    uint32_t ctl;
   
    /* reload the count value */
    SysTick->LOAD = (uint32_t)(count * count_1ms);
    /* clear the current count value */
    SysTick->VAL = 0x0000U;
    /* enable the systick timer */
    SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
    /* wait for the COUNTFLAG flag set */
    do{
        ctl = SysTick->CTRL;
    }while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));
    /* disable the systick timer */
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
    /* clear the current count value */
    SysTick->VAL = 0x0000U;
}

使用特权

评论回复
地板
lifeforrent| | 2022-5-25 15:39 | 只看该作者
官方例程中,方式1是使用中断实现延时,而且尽量保证10us以上产生一次中断;所以延时时间数量级一般是10us;方式2的延时是不用中断的,延时时间一般是1us数量级;如果你要用方式2采用中断实现延时,必须考虑进出中断的时间

使用特权

评论回复
5
zuyilu|  楼主 | 2022-5-25 16:19 | 只看该作者
lifeforrent 发表于 2022-5-25 15:39
官方例程中,方式1是使用中断实现延时,而且尽量保证10us以上产生一次中断;所以延时时间数量级一般是10us ...

厉害厉害,专业啊,那我就用中断方式吧。我把所有微秒延时都改毫秒了,竟然可以运行。感谢感谢

使用特权

评论回复
6
sonicll| | 2022-5-26 09:04 | 只看该作者
方式2的原理是给systick设置你想要的计数值,然后轮询等待计数值减到0,这个过程不需要中断。方式2有一个限制,因为systick的计数寄存器是24位的,所以你自己要确保count*count_1us不能超过24bit,这样就会导致最大延时值有限制。而方式1是不存在最大延时值限制的

使用特权

评论回复
7
zuyilu|  楼主 | 2022-5-26 16:14 | 只看该作者
sonicll 发表于 2022-5-26 09:04
方式2的原理是给systick设置你想要的计数值,然后轮询等待计数值减到0,这个过程不需要中断。方式2有一个限 ...

原来是这样,怪不得,那我明白了,非常感谢啊[强][强]

使用特权

评论回复
8
zhangpeizhong| | 2022-6-11 17:32 | 只看该作者
我在嘉立创做板子,SMT,采用了GD32F103C8T6,调试通不过。发现这批次GD32F103C8T6有问题。具体是systick的功能不良。导致delay函数无法正常工作。调试过程,其它正常,一旦涉及systick,就不正常。我另外购买了有GD32F103C8T6芯片的开发板进行对比验证,开发板跑《1.GPIO输出实验》正常;同样在这次SMT板,跑到delay(涉及systick)就不行了,程序死在systick相关环节delay函数中。
   开发板与SMT板核心电路基本一样,下载、调试功能均正常。就是这次SMT板涉及systick相关环节就出问题。而开发板则正常。更换其它官方测试程序,也是一样效果。判断这批次GD32F103C8T6有问题。现在还在与嘉立创协调中。
      楼主是否与我这个情况是否相同原因。
     

     
      

1.GPIO输出实验(测试程序).zip

319.55 KB

使用特权

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

本版积分规则

3

主题

10

帖子

0

粉丝