From 919203c467db31c23e5db4e2c98c862c6610e7fb Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Wed, 16 Jul 2025 15:35:42 +0200 Subject: [PATCH] Systick --- main.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/main.c b/main.c index 831d333..ee1d25c 100644 --- a/main.c +++ b/main.c @@ -1,17 +1,39 @@ +#include +#include +#include #include #include +#include -static void clock_setup(void) { - // Use external 8 MHz HSE and PLL to 72 MHz - rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]); - rcc_periph_clock_enable(RCC_GPIOC); -} +volatile uint64_t ticks; static void gpio_setup(void) { - // gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO13); + rcc_periph_clock_enable(RCC_GPIOC); gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO13); } +void sys_tick_handler(void) { ticks++; } + +static void sys_tick_setup(void) { + ticks = 0; + // rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE16_72MHZ]); + + // systick_set_clocksource(STK_CSR_CLKSOURCE_AHB_DIV8); + systick_set_clocksource(STK_CSR_CLKSOURCE_AHB); + + // systick_set_reload(48000 - 1); + systick_set_frequency(1000, 72000000); + + systick_clear(); + + systick_interrupt_enable(); + systick_counter_enable(); + + return; +} + +static uint64_t sys_ticks_get(void) { return ticks; } + static void delay(volatile uint32_t count) { while (count-- > 0) { __asm__("nop"); @@ -19,13 +41,31 @@ static void delay(volatile uint32_t count) { } int main(void) { - clock_setup(); + rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]); + // rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSI_48MHZ]); gpio_setup(); + sys_tick_setup(); + gpio_clear(GPIOC, GPIO13); + gpio_set(GPIOC, GPIO13); + // gpio_set(GPIOB, GPIO6); /* LED2 off */ + + // ticks = 0; + + uint64_t init = sys_ticks_get(); + while (sys_ticks_get() == init); + + /* We call this handler every 1ms so 1000ms = 1s on/off. */ + uint64_t ref = 0; while (1) { - gpio_toggle(GPIOC, GPIO13); // On Blue Pill: LED is on PC13 - delay(10000000); // Crude delay loop + if (sys_ticks_get() > ref) { + ref += 500; + gpio_toggle(GPIOC, GPIO13); + // while (sys_ticks_get() % 1000 == 0); + } } + while (1); + return 0; }