From a35f66f2cd98d6e6eaa0ea179bee245a46b3c0ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sun, 16 Feb 2020 16:38:31 +0100 Subject: [PATCH] Add code for rotary encoder --- .../reflow-controller/rotary-encoder.h | 19 +++++- stm-firmware/main.c | 6 +- stm-firmware/rotary-encoder.c | 58 ++++++++++++++++++- 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/stm-firmware/include/reflow-controller/rotary-encoder.h b/stm-firmware/include/reflow-controller/rotary-encoder.h index 7caa8f3..b436ea1 100644 --- a/stm-firmware/include/reflow-controller/rotary-encoder.h +++ b/stm-firmware/include/reflow-controller/rotary-encoder.h @@ -18,8 +18,25 @@ * If not, see . */ - #ifndef __ROTARY_ENCODER_H__ #define __ROTARY_ENCODER_H__ +#include + +#define ROTARY_ENCODER_TIMER TIM5 +#define ROTARY_ENCODER_TIMER_RCC_MASK RCC_APB1ENR_TIM5EN +#define ROTARY_ENCODER_PIN1 0 +#define ROTARY_ENCODER_PIN2 1 +#define ROTARY_ENCODER_PORT GPIOA +#define ROTARY_ENCODER_PORT_ALTFUNC 2 +#define ROTARY_ENCODER_RCC_MASK RCC_AHB1ENR_GPIOAEN + +void rotary_encoder_setup(void); + +uint32_t rotary_encoder_get_abs_val(void); + +int32_t rotary_encoder_get_chage_val(void); + +void rotary_encoder_stop(void); + #endif /* __ROTARY_ENCODER_H__ */ diff --git a/stm-firmware/main.c b/stm-firmware/main.c index cca9872..dcbbb3c 100644 --- a/stm-firmware/main.c +++ b/stm-firmware/main.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -45,6 +46,8 @@ static void setup_nvic_priorities() static float pt1000_value; static volatile int pt1000_value_status; +static uint32_t rot; + int main() { @@ -61,6 +64,7 @@ int main() digio_setup_default_all(); led_setup(); loudspeaker_setup(); + rotary_encoder_setup(); uart_init_with_dma(); @@ -68,7 +72,7 @@ int main() while(1) { pt1000_value_status = adc_pt1000_get_current_resistance(&pt1000_value); - + rot = rotary_encoder_get_abs_val(); uart_receive_status = uart_receive_data_with_dma(&uart_input, &uart_input_len); if (uart_receive_status >= 1) shell_handle_input(shell_handle, uart_input, uart_input_len); diff --git a/stm-firmware/rotary-encoder.c b/stm-firmware/rotary-encoder.c index b871d66..f6ca3a6 100644 --- a/stm-firmware/rotary-encoder.c +++ b/stm-firmware/rotary-encoder.c @@ -18,5 +18,61 @@ * If not, see . */ +#include +#include +#include -#include \ No newline at end of file +static inline void rotary_encoder_setup_pins(void) +{ + rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(ROTARY_ENCODER_RCC_MASK)); + ROTARY_ENCODER_PORT->MODER &= MODER_DELETE(ROTARY_ENCODER_PIN1) & MODER_DELETE(ROTARY_ENCODER_PIN2); + ROTARY_ENCODER_PORT->MODER |= ALTFUNC(ROTARY_ENCODER_PIN1) | ALTFUNC(ROTARY_ENCODER_PIN2); + SETAF(ROTARY_ENCODER_PORT, ROTARY_ENCODER_PIN1, ROTARY_ENCODER_PORT_ALTFUNC); + SETAF(ROTARY_ENCODER_PORT, ROTARY_ENCODER_PIN2, ROTARY_ENCODER_PORT_ALTFUNC); +} + +void rotary_encoder_setup(void) +{ + rcc_manager_enable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(ROTARY_ENCODER_TIMER_RCC_MASK)); + rotary_encoder_setup_pins(); + + ROTARY_ENCODER_TIMER->ARR = 0xFFFF; + ROTARY_ENCODER_TIMER->CNT = 0; + ROTARY_ENCODER_TIMER->CR2 = 0; + ROTARY_ENCODER_TIMER->SMCR = TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; + ROTARY_ENCODER_TIMER->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; + ROTARY_ENCODER_TIMER->CCER = TIM_CCER_CC1P | TIM_CCER_CC2P; + ROTARY_ENCODER_TIMER->PSC = 0; + ROTARY_ENCODER_TIMER->CR1 = TIM_CR1_CEN; +} + +uint32_t rotary_encoder_get_abs_val(void) +{ + return (uint32_t)ROTARY_ENCODER_TIMER->CNT; +} + +int32_t rotary_encoder_get_chage_val(void) +{ + static uint32_t last_val = 0; + uint32_t val; + int32_t diff; + + val = rotary_encoder_get_abs_val(); + + diff = val - last_val; + + if (diff > 0xEFFF) { + diff = 0xFFFF - diff; + } + + return diff; +} + +void rotary_encoder_stop(void) +{ + ROTARY_ENCODER_TIMER->CR1 = 0; + ROTARY_ENCODER_TIMER->CR2 = 0; + ROTARY_ENCODER_TIMER->ARR = 0; + rcc_manager_disable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(ROTARY_ENCODER_TIMER_RCC_MASK)); + rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(ROTARY_ENCODER_RCC_MASK)); +}