3 #include <libopencm3/cm3/cortex.h>
4 #include <libopencm3/cm3/nvic.h>
5 #include <libopencm3/cm3/systick.h>
6 #include <libopencm3/stm32/rcc.h>
7 #include <libopencm3/stm32/gpio.h>
8 #include <libopencm3/stm32/usart.h>
9 #include <libopencm3/stm32/timer.h>
11 static void clock_setup(void)
13 rcc_clock_setup_in_hse_8mhz_out_72mhz();
15 rcc_periph_clock_enable(RCC_GPIOA);
16 rcc_periph_clock_enable(RCC_GPIOB);
17 rcc_periph_clock_enable(RCC_GPIOC);
18 rcc_periph_clock_enable(RCC_USART1);
19 rcc_periph_clock_enable(RCC_TIM4);
21 rcc_periph_reset_pulse(RST_GPIOA);
22 rcc_periph_reset_pulse(RST_GPIOB);
23 rcc_periph_reset_pulse(RST_GPIOC);
24 rcc_periph_reset_pulse(RST_USART1);
25 rcc_periph_reset_pulse(RST_TIM2);
26 rcc_periph_reset_pulse(RST_TIM4);
29 static void gpio_setup(void)
31 // PC13 = BluePill LED
32 gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
33 gpio_clear(GPIOC, GPIO13);
35 // Pins for MODBUS USART
36 gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO_USART1_RX);
37 gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART1_TX);
38 gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO1);
41 static volatile u32 ms_ticks;
43 void sys_tick_handler(void)
48 static void tick_setup(void)
50 systick_set_frequency(1000, 72000000);
51 systick_counter_enable();
52 systick_interrupt_enable();
55 static void delay_ms(uint ms)
57 u32 start_ticks = ms_ticks;
58 while (ms_ticks - start_ticks < ms)
62 static void usart_setup(void)
64 gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART1_TX);
66 usart_set_baudrate(USART1, 9600);
67 usart_set_databits(USART1, 8);
68 usart_set_stopbits(USART1, USART_STOPBITS_1);
69 usart_set_mode(USART1, USART_MODE_TX_RX);
70 usart_set_parity(USART1, USART_PARITY_NONE);
71 usart_set_flow_control(USART1, USART_FLOWCONTROL_NONE);
83 // cm_enable_interrupts();
85 timer_set_prescaler(TIM4, 3); // clock = 72 MHz / 2 = 36 MHz
86 timer_set_mode(TIM4, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
87 timer_disable_preload(TIM4);
88 timer_set_period(TIM4, 255); // PWM frequency = 18 MHz / 256 = 70.3125 kHz FIXME
89 timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_PWM1);
90 timer_set_oc_value(TIM4, TIM_OC1, 24);
103 timer_set_oc_polarity_high(TIM4, TIM_OC1);
104 timer_enable_counter(TIM4);
105 timer_enable_oc_output(TIM4, TIM_OC1);
107 gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO6);
108 // gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO8);
111 gpio_toggle(GPIOC, GPIO13);
113 // gpio_toggle(GPIOA, GPIO8);
114 //timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_FORCE_LOW);
116 //timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_FORCE_HIGH);