// Debugging port
// #define DEBUG_SEMIHOSTING
-#define DEBUG_USART USART1
+#define DEBUG_USART USART2
+#define DEBUG_LED_BLUEPILL
// MODBUS library parameters
-#define MODBUS_USART USART2
-#define MODBUS_NVIC_USART_IRQ NVIC_USART2_IRQ
-#define MODBUS_USART_ISR usart2_isr
+#define MODBUS_USART USART3
+#define MODBUS_NVIC_USART_IRQ NVIC_USART3_IRQ
+#define MODBUS_USART_ISR usart3_isr
-#define MODBUS_TXEN_GPIO_PORT GPIOA
+#define MODBUS_TXEN_GPIO_PORT GPIOB
#define MODBUS_TXEN_GPIO_PIN GPIO1
#define MODBUS_TIMER TIM2
#define MODBUS_OUR_ADDRESS 42
#define MODBUS_BAUD_RATE 19200
+
+#define MODBUS_DEBUG
static void clock_setup(void)
{
- rcc_clock_setup_in_hse_8mhz_out_72mhz();
+ rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);
rcc_periph_clock_enable(RCC_GPIOA);
rcc_periph_clock_enable(RCC_GPIOB);
rcc_periph_clock_enable(RCC_GPIOC);
rcc_periph_clock_enable(RCC_USART2);
+ rcc_periph_clock_enable(RCC_USART3);
rcc_periph_clock_enable(RCC_TIM2);
rcc_periph_clock_enable(RCC_TIM4);
rcc_periph_reset_pulse(RST_GPIOB);
rcc_periph_reset_pulse(RST_GPIOC);
rcc_periph_reset_pulse(RST_USART2);
+ rcc_periph_reset_pulse(RST_USART3);
rcc_periph_reset_pulse(RST_TIM2);
rcc_periph_reset_pulse(RST_TIM4);
}
gpio_clear(GPIOC, GPIO13);
// Pins for MODBUS USART
- gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO_USART2_RX);
- gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART2_TX);
- gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO1);
+ gpio_set_mode(GPIOB, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO_USART3_RX);
+ gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART3_TX);
+ gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO1);
}
static volatile u32 ms_ticks;
;
}
-static void usart_setup(void)
+static void debug_setup(void)
{
-#if 0
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART2_TX);
+ gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO_USART2_RX);
- usart_set_baudrate(USART2, 9600);
+ usart_set_baudrate(USART2, 115200);
usart_set_databits(USART2, 8);
usart_set_stopbits(USART2, USART_STOPBITS_1);
usart_set_mode(USART2, USART_MODE_TX_RX);
usart_set_flow_control(USART2, USART_FLOWCONTROL_NONE);
usart_enable(USART2);
-#endif
}
int main(void)
clock_setup();
gpio_setup();
tick_setup();
- usart_setup();
+ debug_setup();
+ debug_printf("Chramst!\n");
modbus_init();
cm_enable_interrupts(); // FIXME: Needed?
-#if 0
- timer_set_prescaler(TIM4, 7); // clock = 72 MHz / 8 = 18 MHz FIXME!
- timer_set_mode(TIM4, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
- timer_disable_preload(TIM4);
- timer_set_period(TIM4, 255); // PWM frequency = 18 MHz / 256 = 70.3125 kHz
- timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_PWM1);
- timer_set_oc_value(TIM4, TIM_OC1, 128);
- timer_set_oc_polarity_high(TIM4, TIM_OC1);
- timer_enable_counter(TIM4);
- timer_enable_oc_output(TIM4, TIM_OC1);
-#endif
-
- gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO6);
- // gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO8);
-
for (;;) {
- gpio_toggle(GPIOC, GPIO13);
+ debug_led_toggle();
delay_ms(50);
- // gpio_toggle(GPIOA, GPIO8);
- //timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_FORCE_LOW);
- //delay_ms(50);
- //timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_FORCE_HIGH);
modbus_loop();
}
{
}
+void modbus_ready_hook(void)
+{
+}
+
+void modbus_frame_start_hook(void)
+{
+}
+
const char * const modbus_id_strings[MODBUS_ID_MAX] = {
[MODBUS_ID_VENDOR_NAME] = "United Computer Wizards",
[MODBUS_ID_PRODUCT_CODE] = "42",