Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » TIM1 и TIM4 One Pulse Mode (STM32F103)


TIM1 и TIM4 One Pulse Mode (STM32F103)

Сообщений 1 страница 3 из 3

1

Добрый день!

Появилась у меня необходимость задействовать One Pulse Mode на TIM1. (PA9,PA8)
В общем два дня бился бился и никак не смог реализовать.  Начитался интернетов, RM , AN4013(STM32 cross-series timer overview)
,но в итоге ничего не добился.

Заглянул в StdPeriph , в примеры и сделал все на TIM4.  Работает , как и должно быть. Переписал для TIM1 - не работает. Как не бился, так и не смог запустить. TIM1 ведь более навороченный, может есть какие то нюансы ?

Ну так как здесь не очень любят StdPeriph , то приведу два код(TIM1 и TIM4) на CMSIS и один код(TIM4) на StdPeriph.  Вдруг кому пригодиться.
TIM1 - не работает , почему то...

Код:

void TIM4_Init_One_Pulse_Mode(void)
  {
    uint16_t PrescalerValue = 0;
    uint16_t Pulse=200;

    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;   // тактирование тамера TIM4
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;   // Тактирование порта B

    GPIOB->CRL &= !(GPIO_CRL_CNF6_0 | GPIO_CRL_CNF6_1|GPIO_CRL_CNF7_0 | GPIO_CRL_CNF7_1);
    GPIOB->CRL |= GPIO_CRL_MODE6|GPIO_CRL_CNF6_1;   // альтернативная функция 50мГц
    GPIOB->CRL |= GPIO_CRL_CNF7_0;                //плавающий вход

    PrescalerValue = (uint16_t) (SystemCoreClock / 72000000) - 1;

    TIM4->ARR =355;
    TIM4->PSC =PrescalerValue; 
    TIM4->RCR =0;
    TIM4->CCMR1 |= (TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 ); // PWM Mode2  
    TIM4->CCMR1 |= TIM_CCMR1_CC2S_0;   //TI
    TIM4->CCER  |= TIM_CCER_CC1E|TIM_CCER_CC2E;     // polarity
    TIM4->SMCR  |= (TIM_SMCR_SMS_2  | TIM_SMCR_SMS_1  | TIM_SMCR_TS_1 | TIM_SMCR_TS_2); // trig & slave mode
    TIM4->CCR1 |=  Pulse;           //pulse
    TIM4->CR1   |= TIM_CR1_OPM;     // Select One-pulse mode 
  }
Код:

void TIM1_Init_One_Pulse_Mode(void)
  {
    uint16_t PrescalerValue = 0;
    uint16_t Pulse=200;

    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;   // тактирование тамера TIM1
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;   // Тактирование порта A

    GPIOA->CRH &= !(GPIO_CRH_CNF8_0 | GPIO_CRH_CNF8_1|GPIO_CRH_CNF9_0 | GPIO_CRH_CNF9_1);
    GPIOA->CRH |= GPIO_CRH_MODE8|GPIO_CRH_CNF8_1;   // альтернативная функция 50мГц
    GPIOA->CRH |= GPIO_CRH_CNF9_0;                //плавающий вход

    PrescalerValue = (uint16_t) (SystemCoreClock / 72000000) - 1;

    TIM1->ARR =355;
    TIM1->PSC =PrescalerValue; 
    TIM1->RCR =0;
    TIM1->CCMR1 |= (TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 ); // PWM Mode2  
    TIM1->CCMR1 |= TIM_CCMR1_CC2S_0;   //TI
    TIM1->CCER  |= TIM_CCER_CC1E|TIM_CCER_CC2E;     // polarity
    TIM1->SMCR  |= (TIM_SMCR_SMS_2  | TIM_SMCR_SMS_1  | TIM_SMCR_TS_1 | TIM_SMCR_TS_2); // trig & slave mode
    TIM1->CCR1 |=  Pulse;           //pulse
    TIM1->CR1   |= TIM_CR1_OPM;     // Select One-pulse mode 
  }

Код:
void TIM4_Start(void)
  { 
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    uint16_t PrescalerValue = 0;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

    /* GPIOB clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

      /* TIM4_CH1 pin (PB.06) configuration */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
    GPIO_Init(GPIOB, &GPIO_InitStructure);
  
      /* TIM4_CH2 pin (PB.07) configuration */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* Compute the prescaler value */
  PrescalerValue = (uint16_t) (SystemCoreClock / 72000000) - 1;
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 455;
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  /* TIM4 PWM2 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 300;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC1Init(TIM4, &TIM_OCInitStructure);

  /* TIM4 configuration in Input Capture Mode */

  TIM_ICStructInit(&TIM_ICInitStructure);

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0;

  TIM_ICInit(TIM4, &TIM_ICInitStructure);

  /* One Pulse Mode selection */
  TIM_SelectOnePulseMode(TIM4, TIM_OPMode_Single);

  /* Input Trigger selection */
  TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);

  /* Slave Mode selection: Trigger Mode */
  TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Trigger);



  }

Отредактировано Atomic-dm (2018-05-12 18:05:00)

2

TIM1 ведь более навороченный

Вот поэтому и не смогли... недочитали...
Не увидел в настройках ТИМ1 установки бита МОЕ...

3

HHIMERA написал(а):

Вот поэтому и не смогли... недочитали...
Не увидел в настройках ТИМ1 установки бита МОЕ...

Спасибо! Действительно помогло.

Удивительно, но я кое где встречал инфу про этот бит, но тогда у меня и с ним и без него ничего не получалось... А когда получилось сделать на TIM4 , я уже и забыл про него...  А ведь все действительно оказалось в нем!

Спасибо огромное!


Вы здесь » Микроконтроллеры » Архив » TIM1 и TIM4 One Pulse Mode (STM32F103)