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

Reply via email to