]> mj.ucw.cz Git - home-hw.git/blob - test-modbus/test.c
ModBus test
[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_in_hse_8mhz_out_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_TIM2);
21         rcc_periph_clock_enable(RCC_TIM4);
22
23         rcc_periph_reset_pulse(RST_GPIOA);
24         rcc_periph_reset_pulse(RST_GPIOB);
25         rcc_periph_reset_pulse(RST_GPIOC);
26         rcc_periph_reset_pulse(RST_USART2);
27         rcc_periph_reset_pulse(RST_TIM2);
28         rcc_periph_reset_pulse(RST_TIM4);
29 }
30
31 static void gpio_setup(void)
32 {
33         // PC13 = BluePill LED
34         gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
35         gpio_clear(GPIOC, GPIO13);
36 }
37
38 static volatile u32 ms_ticks;
39
40 void sys_tick_handler(void)
41 {
42         ms_ticks++;
43 }
44
45 static void tick_setup(void)
46 {
47         systick_set_frequency(1000, 72000000);
48         systick_counter_enable();
49         systick_interrupt_enable();
50 }
51
52 static void delay_ms(uint ms)
53 {
54         u32 start_ticks = ms_ticks;
55         while (ms_ticks - start_ticks < ms)
56                 ;
57 }
58
59 static void usart_setup(void)
60 {
61 #if 0
62         gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART2_TX);
63
64         usart_set_baudrate(USART2, 9600);
65         usart_set_databits(USART2, 8);
66         usart_set_stopbits(USART2, USART_STOPBITS_1);
67         usart_set_mode(USART2, USART_MODE_TX_RX);
68         usart_set_parity(USART2, USART_PARITY_NONE);
69         usart_set_flow_control(USART2, USART_FLOWCONTROL_NONE);
70
71         usart_enable(USART2);
72 #endif
73 }
74
75 int main(void)
76 {
77         clock_setup();
78         gpio_setup();
79         tick_setup();
80         usart_setup();
81
82         modbus_init();
83         cm_enable_interrupts();         // FIXME: Needed?
84
85 #if 0
86         timer_set_prescaler(TIM4, 7);   // clock = 72 MHz / 8 = 18 MHz  FIXME!
87         timer_set_mode(TIM4, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
88         timer_disable_preload(TIM4);
89         timer_set_period(TIM4, 255);    // PWM frequency = 18 MHz / 256 = 70.3125 kHz
90         timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_PWM1);
91         timer_set_oc_value(TIM4, TIM_OC1, 128);
92         timer_set_oc_polarity_high(TIM4, TIM_OC1);
93         timer_enable_counter(TIM4);
94         timer_enable_oc_output(TIM4, TIM_OC1);
95 #endif
96
97         gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO6);
98         // gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO8);
99
100         for (;;) {
101                 //gpio_toggle(GPIOC, GPIO13);
102                 delay_ms(50);
103                 // gpio_toggle(GPIOA, GPIO8);
104                 //timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_FORCE_LOW);
105                 //delay_ms(50);
106                 //timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_FORCE_HIGH);
107                 modbus_loop();
108         }
109
110         return 0;
111 }