Hi all, I'm trying to get an encoder like this: http://www.aliexpress.com/item/New-High-Quality-Incremental-optical-rotary-encoder-400-600-360-pulses-Rev-AB-2-phase-DC5/2048956011.html
working on a Maple mini, which uses a stm32f103rc. I connected the phases of the encoder to PB6 and PB7. I wrote a program which reads the changes by hand, this program works, which means for me the encoder is not broken and the ports are also ok. What I want to do is using the internal encoder interface which also uses, as far as I understand, PB6 and PB7 as input. And I just fail to get it working. My code is: #include <stdarg.h> #include <stdio.h> #include <libopencm3/stm32/timer.h> #include <libopencm3/stm32/usart.h> #include <libopencm3/cm3/nvic.h> #include <libopencm3/cm3/scb.h> #include <libopencm3/stm32/rcc.h> #include <libopencm3/stm32/gpio.h> void p(char *fmt, ... ); void p(char *fmt, ... ){ static uint8_t c='\0'; char tmp[256]; va_list args; va_start (args, fmt ); vsnprintf(tmp, 256, fmt, args); va_end (args); int i=0; while (tmp[i] != '\0' ) { c = tmp[i]; usart_send_blocking(USART2, c); i++; } } static void clock_setup(void) { rcc_clock_setup_in_hse_8mhz_out_72mhz(); /* Enable GPIOA clock. */ rcc_periph_clock_enable(RCC_GPIOA); /* Enable clocks for GPIO port A (for LED GPIO_USART2_TX) and USART2. */ rcc_periph_clock_enable(RCC_USART2); } static void usart_setup(void) { /* Setup GPIO pin GPIO_USART2_RE_TX on GPIO port A for transmit. */ gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART2_TX); /* Setup GPIO pin GPIO_USART2_RE_RX on GPIO port A for receive. */ gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO_USART2_RX); /* Setup UART parameters. */ usart_set_baudrate(USART2, 38400); usart_set_databits(USART2, 8); usart_set_stopbits(USART2, USART_STOPBITS_1); usart_set_parity(USART2, USART_PARITY_NONE); usart_set_flow_control(USART2, USART_FLOWCONTROL_NONE); usart_set_mode(USART2, USART_MODE_TX_RX); /* Enable USART2 Receive interrupt. */ USART_CR1(USART2) |= USART_CR1_RXNEIE; /* Finally enable the USART. */ usart_enable(USART2); } static void encoder_setup(void) { // Use PB6 + PB7 for encoder input (5v) gpio_set_mode (GPIOB, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO6); gpio_set_mode (GPIOB, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO7); timer_reset(TIM4); rcc_periph_clock_enable(RCC_TIM4); timer_set_period(TIM4, 0xFFFF); timer_slave_set_mode(TIM4, TIM_SMCR_SMS_EM3); // encoder timer_ic_set_input(TIM4, TIM_IC1, TIM_IC_IN_TI1); timer_ic_set_input(TIM4, TIM_IC2, TIM_IC_IN_TI2); timer_enable_counter(TIM4); } int main(void) { int j = 0, c = 0; int i; uint16_t pos; SCB_VTOR = (uint32_t) 0x08005000; clock_setup(); usart_setup(); p("usart setup done... \r\n"); encoder_setup(); p("encoder setup done... \r\n"); while (1) { pos = timer_get_counter(TIM4); p(" pos: %ld \r\n", pos); usart_send_blocking(USART2, c + '0'); /* USART2: Send byte. */ c = (c == 9) ? 0 : c + 1; /* Increment c. */ if ((j++ % 80) == 0) { /* Newline after line full. */ usart_send_blocking(USART2, '\r'); usart_send_blocking(USART2, '\n'); } for (i = 0; i < 8000000; i++) /* Wait a bit. */ __asm__("nop"); } return 0; } Any hits? Solutions? Thanks Thorsten ------------------------------------------------------------------------------ _______________________________________________ libopencm3-devel mailing list libopencm3-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libopencm3-devel