CH32V208GBU6 systick 问题及数据类型定义 int32_t int64_t导致结果异常 及函数返回值异常问题

目前代码如下定义


void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));


vs32 counter;


void SYSTICK_Init_Config(u64 ticks)

{



    SysTick->CTLR = 0x00000000;             //控制寄存器复位


    SysTick->SR = 0x00000000;               //状态寄存器复位


    SysTick->CNT = 0x00000000;              //计数器复位,设置初始值为0


    SysTick->CMP = ticks;                   //给重加载寄存器赋值


    NVIC_SetPriority(SysTicK_IRQn, 15);     //设置SysTick中断优先级


    NVIC_EnableIRQ(SysTicK_IRQn);           //使能开启Systick中断


    SysTick->CTLR |= 0x0000000F;            //启动系统计数器STK(HCLK/8时基)



}


void SysTick_Handler(void)

{


    SysTick->SR = 0;

    counter ++;

}

void main(){


 .......省略其他


   SYSTICK_Init_Config((SystemCoreClock)/144000);

}


while(1){

  printf("%d\r\n",counter);

}



1.发现定义为vs32 counter正常输出值  定义vs64 counter输出值就异常了 




//  int64_t arm_2d_helper_get_system_timestamp(void)

u64 get_system_timestamp(void)

{

     u64   ticks = counter;

     //printf("qixin %d %d\r\n",ticks,counter);

    return ticks;

}




// uint32_t arm_2d_helper_get_reference_clock_frequency(void)

uint32_t get_reference_clock_frequency(void)

{

    return SystemCoreClock;

}



变量定义修改为无符号类型,例如都定义为u64类型。

systickdemo可以直接参考使用。


这个有试过 systickdemo修改 目前主频是144mhz  换成int64_t  或者uint64_t  计数值都是异常 只有int32_t  值是正常的  很奇怪


tick的默认传参就是u64类型的。 如果需要进入中断中将打印的信息配置为u64,编译器需要配置:

2773877-20220725141859845-863058166.jpg


只有登录才能回复,可以选择微信账号登录