#include "at32f403a_407.h" #include "tim_delay.h" #include "mux.h" static bool tx_enable = false; // void mb_helper_tim_init(uint32_t baudrate) { float foo; foo = 1.0/((float)baudrate / 11.0); foo *= 2000.0; // время в мс (длительность в два символа) crm_clocks_freq_type crm_clocks_freq_struct = {0}; crm_clocks_freq_get(&crm_clocks_freq_struct); nvic_irq_disable(TMR6_GLOBAL_IRQn); crm_periph_clock_enable(CRM_TMR6_PERIPH_CLOCK, TRUE); tmr_base_init(TMR6, (uint32_t)(foo * 1000) - 1, (crm_clocks_freq_struct.ahb_freq / 1000000) - 1); tmr_cnt_dir_set(TMR6, TMR_COUNT_UP); NVIC_ClearPendingIRQ(TMR6_GLOBAL_IRQn); nvic_irq_enable(TMR6_GLOBAL_IRQn, 5, 0); } // void mb_helper_tim_enable(void) { tmr_flag_clear(TMR6, TMR_OVF_FLAG); tmr_interrupt_enable(TMR6, TMR_OVF_INT, TRUE); tmr_counter_value_set(TMR6, 0); tmr_counter_enable(TMR6, TRUE); } // void mb_helper_tim_disable(void) { tmr_flag_clear(TMR6, TMR_OVF_FLAG); tmr_interrupt_enable(TMR6, TMR_OVF_INT, FALSE); tmr_counter_value_set(TMR6, 0); tmr_counter_enable(TMR6, FALSE); } // void mb_helper_set_tx_state(bool state) { tx_enable = state; } // void TMR6_GLOBAL_IRQHandler(void) { if(tmr_flag_get(TMR6, TMR_OVF_FLAG) != RESET) { tmr_flag_clear(TMR6, TMR_OVF_FLAG); if (tx_enable) { usart_interrupt_enable(USART3, USART_TDBE_INT, TRUE); leds[TX_R].state = LED_ON; } else { gpio_bits_reset(GPIOD, GPIO_PINS_10); leds[TX_R].state = LED_OFF; } mb_helper_tim_disable(); } }