4 #include <libopencm3/cm3/cortex.h>
5 #include <libopencm3/cm3/nvic.h>
6 #include <libopencm3/cm3/systick.h>
7 #include <libopencm3/stm32/rcc.h>
8 #include <libopencm3/stm32/gpio.h>
9 #include <libopencm3/stm32/usart.h>
10 #include <libopencm3/stm32/timer.h>
12 static void clock_setup(void)
14 rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);
16 rcc_periph_clock_enable(RCC_GPIOA);
17 rcc_periph_clock_enable(RCC_GPIOB);
18 rcc_periph_clock_enable(RCC_GPIOC);
19 rcc_periph_clock_enable(RCC_USART2);
20 rcc_periph_clock_enable(RCC_USART3);
21 rcc_periph_clock_enable(RCC_TIM2);
22 rcc_periph_clock_enable(RCC_TIM4);
24 rcc_periph_reset_pulse(RST_GPIOA);
25 rcc_periph_reset_pulse(RST_GPIOB);
26 rcc_periph_reset_pulse(RST_GPIOC);
27 rcc_periph_reset_pulse(RST_USART2);
28 rcc_periph_reset_pulse(RST_USART3);
29 rcc_periph_reset_pulse(RST_TIM2);
30 rcc_periph_reset_pulse(RST_TIM4);
33 static void gpio_setup(void)
35 // PC13 = BluePill LED
36 gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
37 gpio_clear(GPIOC, GPIO13);
39 // Pins for MODBUS USART
40 gpio_set_mode(GPIOB, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO_USART3_RX);
41 gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART3_TX);
42 gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO1);
45 static volatile u32 ms_ticks;
47 void sys_tick_handler(void)
52 static void tick_setup(void)
54 systick_set_frequency(1000, 72000000);
55 systick_counter_enable();
56 systick_interrupt_enable();
59 static void delay_ms(uint ms)
61 u32 start_ticks = ms_ticks;
62 while (ms_ticks - start_ticks < ms)
66 static void debug_setup(void)
68 gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART2_TX);
69 gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO_USART2_RX);
71 usart_set_baudrate(USART2, 115200);
72 usart_set_databits(USART2, 8);
73 usart_set_stopbits(USART2, USART_STOPBITS_1);
74 usart_set_mode(USART2, USART_MODE_TX_RX);
75 usart_set_parity(USART2, USART_PARITY_NONE);
76 usart_set_flow_control(USART2, USART_FLOWCONTROL_NONE);
87 debug_printf("Chramst!\n");
90 cm_enable_interrupts(); // FIXME: Needed?
101 /*** Modbus callbacks ***/
103 bool modbus_check_discrete_input(u16 addr UNUSED)
108 bool modbus_get_discrete_input(u16 addr UNUSED)
113 bool modbus_check_coil(u16 addr UNUSED)
118 bool modbus_get_coil(u16 addr UNUSED)
123 void modbus_set_coil(u16 addr UNUSED, bool value UNUSED)
127 bool modbus_check_input_register(u16 addr UNUSED)
132 u16 modbus_get_input_register(u16 addr UNUSED)
137 bool modbus_check_holding_register(u16 addr UNUSED)
142 u16 modbus_get_holding_register(u16 addr UNUSED)
147 void modbus_set_holding_register(u16 addr UNUSED, u16 value UNUSED)
151 void modbus_ready_hook(void)
155 void modbus_frame_start_hook(void)
159 const char * const modbus_id_strings[MODBUS_ID_MAX] = {
160 [MODBUS_ID_VENDOR_NAME] = "United Computer Wizards",
161 [MODBUS_ID_PRODUCT_CODE] = "42",
162 [MODBUS_ID_MAJOR_MINOR_REVISION] = "1.0",
163 [MODBUS_ID_VENDOR_URL] = "http://www.ucw.cz/",
164 [MODBUS_ID_PRODUCT_NAME] = "Magic Gadget",
165 [MODBUS_ID_USER_APP_NAME] = NULL,