簡體   English   中英

編碼器接口模式下STM32F103上Timer2的問題

[英]Issues with Timer2 on STM32F103 in encoder interface mode

我在使用STM32F103C8T6上的Timer2作為四路增量編碼器的接口時遇到問題。 我無法使程序進入IRQHandler並切換LED。

我對Timer4進行了幾乎相同的初始化,但工作正常。 所以問題是; 初始化計時器2時我在做什么錯?

一點不吭就走了; 我已經檢查過接線了。

請注意,我需要將PA0重新映射到PA15,將PA1重新映射到PB3。 據《 ST參考手冊》所知,我需要在AFIO寄存器中執行此操作。 另外,我需要禁用JTDI和JTDO才能釋放PA15和PB3。 我這樣做正確嗎?

代碼如下:

    /*------------------------------------------------------------------------------------
                                            MACROS
    ------------------------------------------------------------------------------------*/
    #define GEARRATIO 9.68
    #define ENCODERRESOLUTION 48
    #define COUNTSPERREV GEARRATIO*ENCODERRESOLUTION // 9.68*48 = 465
    /*------------------------------------------------------------------------------------
                                        PREPROCESSOR
    ------------------------------------------------------------------------------------*/
    #include <stm32f103xb.h>
    #include "Timer2.h"
    #include "IO.h"
    /*------------------------------------------------------------------------------
                              Timer2 init (Encoder interface mode)
     *------------------------------------------------------------------------------*/
    void Timer2_init_Encoder(void)
    {   /* Explain function here */
                                    /* GPIO setup */
        RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Enable clock
        RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // Enable clock

        AFIO->MAPR |= (AFIO_MAPR_SWJ_CFG & 0b100); // Disable JTAG-DP and SW_DP to release PA15 and PB3
        AFIO->MAPR |= (AFIO_MAPR_TIM2_REMAP & 0b01); // Remap PA0->PA15, PA1->PB3 (needs to be 5V tol.)

        // PA15 (Timer 2 Input CH1)
        GPIOA->CRH |= (GPIO_CRH_CNF15 & 0b01);  // 01 => Floating input (default)
        GPIOA->CRH &= ~GPIO_CRH_MODE15; // 00 => Input mode (default)

        // PB3 (Timer 2 Input CH2)
        GPIOB->CRL |= (GPIO_CRL_CNF3 & 0b01);   // 01 => Floating input (default)
        GPIOB->CRL &= ~GPIO_CRL_MODE3;  // 00 => Input mode (default)

                                    /* Timer setup */
        // Clock
        RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // enable clock
        TIM2->SMCR |= TIM_SMCR_SMS & 0b011; //011 => Encoder mode 3. Count on both TI1 and TI2 edges (gives 48 CPR)

        // Timebase unit
        TIM2->ARR = COUNTSPERREV - 1;   // CNT counts to this value and restarts
        TIM2->RCR = 0x0000;             // set repetition counter
        TIM2->CNT = 0;              // Set initial counter value (optional)

        // Control Register
        TIM2->CR1 |= TIM_CR1_URS;   // 1 => ONLY overflow/underflow generates interrupt
        TIM2->CR1 |= TIM_CR1_ARPE;  // 1 => ARR is updated at each UEV
        TIM2->CR1 &= ~TIM_CR1_UDIS; // 0 => Update Event (UEV) is generated at each overflow/underflow

        TIM2->CCMR1 |= TIM_CCMR1_CC1S & 0b01;   // 01 => CC1 Channel is configured as input
        TIM2->CCMR1 |= TIM_CCMR1_CC2S & 0b01;   // 01 => CC2 Channel is configured as input
        TIM2->CCMR1 &= ~TIM_CCMR1_IC1F; // 0000 => No Input Capture filter
        TIM2->CCMR1 &= ~TIM_CCMR1_IC2F; // 0000 => No Input Capture filter
        TIM2->CCER &= ~TIM_CCER_CC1P;   // 0 => Rising edge
        TIM2->CCER &= ~TIM_CCER_CC2P;   // 0 => Rising edge

        // Interrupts
        TIM2->DIER |= TIM_DIER_UIE; // DMA/Interrupt Register: Update Interrupt Enabled
        NVIC->ISER[0] |= (1 << (TIM2_IRQn & 0x1F));  // enable interrupt globally

        TIM2->CR1 |= TIM_CR1_CEN;   // enable timer (counter begins one clock-cycle after enabling)
    }
    /*------------------------------------------------------------------------------
                                Timer2 Update Interrupt Handler
     *------------------------------------------------------------------------------*/
    void TIM2_IRQHandler(void)
    {
        if ((TIM2->SR & TIM_SR_UIF) == 1)
        {
            IO_LED_Toggle();
            TIM2->SR &= ~TIM_SR_UIF;    // clear UIF flag
        }
    }

希望你們能提供幫助。

問候,米克爾

我有同樣的問題。 我的SPL實施:

引腳初始化和重新映射

GPIO_InitTypeDef gpio_cfg;
GPIO_StructInit(&gpio_cfg);

/* Каналы 1 и 2 таймера TIM3 - на вход, подтянуть к питанию */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB 
| RCC_APB2Periph_AFIO, ENABLE);

gpio_cfg.GPIO_Mode = GPIO_Mode_IPU;
gpio_cfg.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOA, &gpio_cfg);

gpio_cfg.GPIO_Mode = GPIO_Mode_IPU;
gpio_cfg.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOB, &gpio_cfg);

GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);

要將重新映射的引腳和SWD用於調試:

GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

我終於使用以下方法解決了問題:

AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // JTAG-DP Disabled, SW-DP Enabled

代替:

AFIO->MAPR &= ~AFIO_MAPR_SWJ_CFG_0; // JTAG-DP Disabled, SW-DP Enabled
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;  //                  "
AFIO->MAPR &= ~AFIO_MAPR_SWJ_CFG_2; //                  "

根據p。 在參考手冊(RM0008)中的176中,我正在設置正確的寄存器。 雖然無法找出區別。 也許只允許您設置一位。 但這沒有任何意義,因為我嘗試這樣自行設置CFG_1:

AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM