Files
ch32v203-eth-node/src/systick.c
2024-10-14 02:13:05 +06:00

38 lines
1.1 KiB
C

#include "systick.h"
#include "ch32v003fun.h"
#include "debug.h"
// ms counter
volatile uint32_t systick_millis = 0;
void init_systick(void) {
SysTick->CTLR = 0;
SysTick->CMP = SYSTICK_ONE_MILLISECOND - 1;
SysTick->CNT = 0;
systick_millis = 0;
// Enable the SysTick IRQ
NVIC_SetPriority(SysTicK_IRQn, 0xf0);
NVIC_EnableIRQ(SysTicK_IRQn);
/* Enable SysTick counter, IRQ, HCLK/1 */
SysTick->CTLR = SYSTICK_CTLR_STE | SYSTICK_CTLR_STIE | SYSTICK_CTLR_STCLK;
}
/*
* SysTick ISR - must be lightweight to prevent the CPU from bogging down.
* Increments Compare Register and systick_millis when triggered (every 1ms)
* NOTE: the `__attribute__((interrupt))` attribute is very important
*/
void SysTick_Handler(void) __attribute__((interrupt));
void SysTick_Handler(void) {
// Increment the Compare Register for the next trigger
// If more than this number of ticks elapse before the trigger is reset,
// you may miss your next interrupt trigger
// (Make sure the IQR is lightweight and CMP value is reasonable)
SysTick->CMP += SYSTICK_ONE_MILLISECOND;
// clear irq
SysTick->SR = 0;
systick_millis++;
}