CH32V208G的systick功能 延迟时间不准确

我看官方例程并没有systick的例程,所以我模仿了582F自己写了一个,但是延迟不太对,1000个中断本来对应的是1s,结果只有0.9s


void Interrupt_VTF_Init(void)

{

    NVIC_EnableIRQ(SysTicK_IRQn);

    SetVTFIRQ((u32)SysTick_Handler,SysTicK_IRQn,0,ENABLE);

}


uint32_t SysTick_Config(uint64_t ticks)

{

    if((ticks - 1) > SysTick_LOAD_RELOAD_Msk)

        return (1); /* Reload value impossible */


    SysTick->CMP = ticks - 1; /* set reload register */

    SysTick->CTLR = SysTick_CTLR_INIT |

                    SysTick_CTLR_STRE |

                    SysTick_CTLR_STCLK |

                    SysTick_CTLR_STIE |

                    SysTick_CTLR_STE; /* Enable SysTick IRQ and SysTick Timer */

    return (0);                       /* Function successful */

}


main()

{

    WCHBLE_Init();

    HAL_Init();

    RF_RoleInit();

    RF_Init();

    IMU_Init();


    SysTick_Config(130000);

    Interrupt_VTF_Init();

    pretime = systick;


    PRINT("Enter Main Loop\r\n");

    Main_Circulation();

}

}


void SysTick_Handler(void)

{

    systick++;


    if(systick > 1000)

    {

        systick = 0;

        if(ledstate111 == 0)

        {

            ledstate111 = 1;

            GPIO_ResetBits(GPIOC, GPIO_Pin_7);

        }

        else

        {

            GPIO_SetBits(GPIOC, GPIO_Pin_7);

            ledstate111 = 0;

        }


    }

    SysTick->SR = 0; //清除中断标志

}



#include "debug.h"

volatile uint64_t systick;

uint16_t ledstate111;


__attribute__((interrupt("WCH-Interrupt-fast")))

void SysTick_Handler( void ) {

    SysTick->SR &= ~(1); //clear


    systick++;


        if(systick > 1000)

        {

            systick = 0;

            if(ledstate111 == 0)

            {

                ledstate111 = 1;

                GPIO_ResetBits(GPIOC, GPIO_Pin_7);

            }

            else

            {

                GPIO_SetBits(GPIOC, GPIO_Pin_7);

                ledstate111 = 0;

            }


        }

}


void ch32v_systick_init(void) {

    #define SysTick_LOAD_RELOAD_Msk    (0xFFFFFFFFFFFFFFFF)

    #define SysTick_CTLR_INIT          (1 << 5)

    #define SysTick_CTLR_MODE          (1 << 4)

    #define SysTick_CTLR_STRE          (1 << 3)

    #define SysTick_CTLR_STCLK         (1 << 2)

    #define SysTick_CTLR_STIE          (1 << 1)

    #define SysTick_CTLR_STE           (1 << 0)


    SysTick->CMP = 72000 - 1;           /* set reload register */


    SetVTFIRQ((uint32_t)SysTick_Handler, SysTicK_IRQn, 0, ENABLE);

    NVIC_EnableIRQ(SysTicK_IRQn);


    SysTick->CTLR = SysTick_CTLR_INIT |

                    SysTick_CTLR_STRE |

                    SysTick_CTLR_STCLK |

                    SysTick_CTLR_STIE |

                    SysTick_CTLR_STE; /* Enable SysTick IRQ and SysTick Timer */

    //HCLK DIV 8

    //SysTick->CTLR &= ~(SysTick_CTLR_STCLK);

}




int main(void)

{

    GPIO_InitTypeDef  GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);


    /* LED init */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(GPIOC, &GPIO_InitStructure);


    GPIO_ResetBits(GPIOC, GPIO_Pin_7);


    //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    Delay_Init();

    USART_Printf_Init(115200);






    PRINT("SystemClk:%d\r\n",SystemCoreClock);

    PRINT("we are in user app\n");

    ch32v_systick_init();

    while(1) {

        


    }

}


这个代码能用, 问题解决了


问题找到了,开启了systick, delay_US就不能再调用,使用会出问题


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