From dc68b6b31e6587e48be6a9e5c45ae378060651e8 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Fri, 18 Apr 2025 21:56:39 +0200 Subject: [PATCH] Waiting room: Proper display timing --- waiting/README | 1 + waiting/firmware/main.c | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/waiting/README b/waiting/README index 5295125..9c47db3 100644 --- a/waiting/README +++ b/waiting/README @@ -2,6 +2,7 @@ Assignment of peripherals and pins ================================== USART1 debugging +TIM1 microsecond timing TIM4 Neopixel control DMA1 Neopixel control I2C2 display 1602: HD44780U controller via PCF8574 expander, needs pull-up to 5V diff --git a/waiting/firmware/main.c b/waiting/firmware/main.c index ac9b979..d1f7681 100644 --- a/waiting/firmware/main.c +++ b/waiting/firmware/main.c @@ -33,6 +33,7 @@ static void clock_init(void) rcc_periph_clock_enable(RCC_GPIOB); rcc_periph_clock_enable(RCC_GPIOC); rcc_periph_clock_enable(RCC_USART1); + rcc_periph_clock_enable(RCC_TIM1); // rcc_periph_clock_enable(RCC_TIM4); // rcc_periph_clock_enable(RCC_DMA1); rcc_periph_clock_enable(RCC_I2C2); @@ -41,6 +42,7 @@ static void clock_init(void) rcc_periph_reset_pulse(RST_GPIOB); rcc_periph_reset_pulse(RST_GPIOC); rcc_periph_reset_pulse(RST_USART1); + rcc_periph_reset_pulse(RST_TIM1); // rcc_periph_reset_pulse(RST_TIM4); rcc_periph_reset_pulse(RST_I2C2); } @@ -98,6 +100,26 @@ static void delay_ms(uint ms) ; } +/*** Microsecond delays via TIM1 ***/ + +static void delay_init(void) +{ + timer_set_prescaler(TIM1, CPU_CLOCK_MHZ - 1); // 1 MHz + timer_set_mode(TIM1, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP); + timer_update_on_overflow(TIM1); + timer_disable_preload(TIM1); + timer_one_shot_mode(TIM1); +} + +static void delay_us(uint us) +{ + timer_set_period(TIM1, us - 1); + timer_generate_event(TIM1, TIM_EGR_UG); + timer_enable_counter(TIM1); + while (TIM_CR1(TIM1) & TIM_CR1_CEN) + ; +} + /*** Display ***/ /* @@ -174,9 +196,9 @@ static void display_write_nibble(byte value) // Sends a nibble of data with a combination of control signals display_pcf_write(value); display_pcf_write(value | LCD_BIT_E); - delay_ms(1); // FIXME + delay_us(50); display_pcf_write(value); - delay_ms(1); // FIXME + delay_us(50); } static void display_command(byte cmd) @@ -542,6 +564,7 @@ int main(void) gpio_init(); usart_init(); tick_init(); + delay_init(); display_init(); // neopixel_init(); usb_init(); -- 2.39.5