CH32V208G的systick功能 延遲時間不準(zhǔn)確

我看官方例程并沒有systick的例程,所以我模仿了582F自己寫了一個,但是延遲不太對,1000個中斷本來對應(yīng)的是1s,結(jié)果只有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; //清除中斷標(biāo)志

}



#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就不能再調(diào)用,使用會出問題


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频