]> mj.ucw.cz Git - home-hw.git/blob - test-blink/test.c
Auto: Meditation mode turned off
[home-hw.git] / test-blink / test.c
1 #include "util.h"
2
3 #include <libopencm3/cm3/cortex.h>
4 #include <libopencm3/cm3/nvic.h>
5 #include <libopencm3/cm3/scb.h>
6 #include <libopencm3/cm3/systick.h>
7 #include <libopencm3/stm32/rcc.h>
8 #include <libopencm3/stm32/gpio.h>
9
10 static void clock_setup(void)
11 {
12         rcc_clock_setup_in_hse_8mhz_out_72mhz();
13
14         rcc_periph_clock_enable(RCC_GPIOC);
15
16         rcc_periph_reset_pulse(RST_GPIOC);
17 }
18
19 static void gpio_setup(void)
20 {
21         // PC13 = BluePill LED
22         gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
23         gpio_clear(GPIOC, GPIO13);
24 }
25
26 static volatile u32 ms_ticks;
27
28 void sys_tick_handler(void)
29 {
30         ms_ticks++;
31 }
32
33 static void tick_setup(void)
34 {
35         systick_set_frequency(1000, 72000000);
36         systick_counter_enable();
37         systick_interrupt_enable();
38 }
39
40 static void delay_ms(uint ms)
41 {
42         u32 start_ticks = ms_ticks;
43         while (ms_ticks - start_ticks < ms)
44                 ;
45 }
46
47 int main(void)
48 {
49         clock_setup();
50         gpio_setup();
51         tick_setup();
52         // When using the serial boot loader, we need this:
53         // SCB_VTOR = 0x08000000;
54         cm_enable_interrupts();
55
56         for (;;) {
57                 gpio_toggle(GPIOC, GPIO13);
58                 delay_ms(100);
59                 gpio_toggle(GPIOC, GPIO13);
60                 delay_ms(500);
61         }
62
63         return 0;
64 }