]> mj.ucw.cz Git - home-hw.git/blob - test-modbus/test.c
Rainbow case: TODO
[home-hw.git] / test-modbus / test.c
1 #include "util.h"
2 #include "modbus.h"
3
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>
11
12 static void clock_setup(void)
13 {
14         rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);
15
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);
23
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);
31 }
32
33 static void gpio_setup(void)
34 {
35         // PC13 = BluePill LED
36         gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
37         gpio_clear(GPIOC, GPIO13);
38
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);
43 }
44
45 static volatile u32 ms_ticks;
46
47 void sys_tick_handler(void)
48 {
49         ms_ticks++;
50 }
51
52 static void tick_setup(void)
53 {
54         systick_set_frequency(1000, 72000000);
55         systick_counter_enable();
56         systick_interrupt_enable();
57 }
58
59 static void delay_ms(uint ms)
60 {
61         u32 start_ticks = ms_ticks;
62         while (ms_ticks - start_ticks < ms)
63                 ;
64 }
65
66 static void debug_setup(void)
67 {
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);
70
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);
77
78         usart_enable(USART2);
79 }
80
81 int main(void)
82 {
83         clock_setup();
84         gpio_setup();
85         tick_setup();
86         debug_setup();
87         debug_printf("Chramst!\n");
88
89         modbus_init();
90         cm_enable_interrupts();         // FIXME: Needed?
91
92         for (;;) {
93                 debug_led_toggle();
94                 delay_ms(50);
95                 modbus_loop();
96         }
97
98         return 0;
99 }
100
101 /*** Modbus callbacks ***/
102
103 bool modbus_check_discrete_input(u16 addr UNUSED)
104 {
105         return false;
106 }
107
108 bool modbus_get_discrete_input(u16 addr UNUSED)
109 {
110         return false;
111 }
112
113 bool modbus_check_coil(u16 addr UNUSED)
114 {
115         return false;
116 }
117
118 bool modbus_get_coil(u16 addr UNUSED)
119 {
120         return false;
121 }
122
123 void modbus_set_coil(u16 addr UNUSED, bool value UNUSED)
124 {
125 }
126
127 bool modbus_check_input_register(u16 addr UNUSED)
128 {
129         return false;
130 }
131
132 u16 modbus_get_input_register(u16 addr UNUSED)
133 {
134         return 0;
135 }
136
137 bool modbus_check_holding_register(u16 addr UNUSED)
138 {
139         return (addr < 16);
140 }
141
142 u16 modbus_get_holding_register(u16 addr UNUSED)
143 {
144         return 0xbeef;
145 }
146
147 void modbus_set_holding_register(u16 addr UNUSED, u16 value UNUSED)
148 {
149 }
150
151 void modbus_ready_hook(void)
152 {
153 }
154
155 void modbus_frame_start_hook(void)
156 {
157 }
158
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,
166 };