Should the mode settings for pb6 and pb7 be set to alternative function rather than input? In what way is it not working?
On 09:32, Tue 11 Aug 2015 Thorsten Eggert <thorsten.egg...@gmail.com> wrote: > 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 >
------------------------------------------------------------------------------
_______________________________________________ libopencm3-devel mailing list libopencm3-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libopencm3-devel