Смущает использование таймера в качестве счетчика на серии STM32F1 - PullRequest
1 голос
/ 23 января 2020

Я реализую проект с использованием микроконтроллера stm32f103. Обычно я использую Timer2 для подсчета внешнего импульса.

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"  // timer library
#include "misc.h"

/* Built-in LED */
#define LEDPORT (GPIOC)
#define LEDPIN (GPIO_Pin_13)

int main(void){

    /* gpio init struct */
    GPIO_InitTypeDef gpioInit;

    /* enable clock for GPIOA thru ABP2 peripheral communication bus */
    // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC->APB2ENR |= RCC_APB2Periph_GPIOC;
    /* use LED pin */
    gpioInit.GPIO_Pin = LEDPIN;
    /* mode: output */
    gpioInit.GPIO_Mode = GPIO_Mode_Out_PP;
    gpioInit.GPIO_Speed = GPIO_Speed_2MHz;
    /* apply configuration */
    GPIO_Init(LEDPORT, &gpioInit);

    /* clear built-in led */
    GPIO_SetBits(LEDPORT, LEDPIN);

    /* Enable timer clock */
    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC->APB1ENR |= RCC_APB1Periph_TIM2;
    /* Configure channel 2 as input, mapped on the Timer Input 1 (TI1) */
    TIM2->CCMR1 |= TIM_CCMR1_CC2S_1;
    /* Configure channel 2 detecting falling edge polarity */
    TIM2->CCER |= TIM_CCER_CC2P;
    /* Configure TIM2 in External Clock Mode 1 & select TI2 as the input source */
    TIM2->SMCR |= TIM_SMCR_SMS | TIM_SMCR_TS_2 | TIM_SMCR_TS_1;
    /* Enable the counter by writing CEN=1 in the TIMx_CR1 register */
    // TIM_Cmd(TIM2, ENABLE);    
    TIM2->CR1 |= TIM_CR1_CEN;
    /* Enable interrupt trigger. */
    // TIM_ITConfig(TIM2, TIM_IT_Trigger, ENABLE);
    TIM2->DIER |= TIM_DIER_TIE;

    for (;;){

        if (TIM_GetITStatus(TIM2, TIM_IT_Trigger) != RESET){

            TIM_ClearITPendingBit(TIM2, TIM_IT_Trigger);

            LEDPORT->ODR ^= LEDPIN;
        }
    }

    /* never reach */
    return 0;
}

Код работает хорошо. Чего я не понимаю, так это

/* Configure CC2S bits = 10: CC2 channel is configured as input, IC2 is mapped on TI1 */
    TIM2->CCMR1 |= TIM_CCMR1_CC2S_1;

, который предполагает использование входа таймера 1, но я должен настроить вход триггера на вход фильтрованного таймера 2

/* Configure TIM2 in External Clock Mode 1 & select TI2 as the input source (110: Filtered Timer Input 2 (TI2FP2))*/
    TIM2->SMCR |= TIM_SMCR_SMS | TIM_SMCR_TS_2 | TIM_SMCR_TS_1;

Кто-нибудь может уточнить для меня?

1 Ответ

0 голосов
/ 23 января 2020

Код работает хорошо. Что я не понимаю, так это

В ваших комментариях есть несколько сбоев, чтобы уточнить:

, что предполагает использование входа таймера 1, но мне нужно настроить триггер вход на вход фильтрованного таймера 2

TIM2->CCMR1 |= TIM_CCMR1_CC2S_1;

Это настраивает канал 2 для обнаружения нарастающих фронтов на входе TI2 (не TI1) путем записи CC2S = '01 в регистре TIMx_CCMR1.

/ * Настройте TIM2 в режиме внешних часов 1 и выберите TI2 в качестве источника входного сигнала * /

TIM2->SMCR |= TIM_SMCR_SMS | TIM_SMCR_TS_2 | TIM_SMCR_TS_1;

a) Конфигурирует таймер в режиме внешних часов 1 путем записи SMS = 111 в регистр TIMx_SMCR.

b) Выбор TI2 в качестве источника входного сигнала, как указано в начале, путем записи TS = 110 в регистр TIMx_SMCR.

Для получения дополнительной информации, вы найдете пример «Подключение внешних часов TI2» в последней таблице вашего u C.

BTW. Вы написали комментарии? В ваших комментариях есть несколько сбоев.

gpioInit.GPIO_Mode = GPIO_Mode_Out_PP; // Open-drain output mode for built-in LED

не является открытым каналом, его следует прокомментировать как push-pull.

...