Tag: таймер



Микроконтроллер STM32F103VCT6 имеет четыре таймера общего назначения (TIM2, TIM3, TIM4, TIM5) и два расширенных таймера (TIM1, TIM8): .. continue reading ..






Настройка таймера TIM6 на генерацию меандра частотой 100 кГц:

     TIM6->PSC = 71; // Это 1 MГц при тактовой частоте 72 МГц
     TIM6->ARR = 4; // При PSC 71 и ARR 4 прерывание каждые 5 мкс (200 кГц)
     TIM6->DIER |= TIM_DIER_UIE; // Разрешаем прерывание от таймера
     TIM6->CR1 |= TIM_CR1_CEN; // Начать отсчёт!
     NVIC_EnableIRQ(TIM6_IRQn); // Разрешение TIM6_IRQn прерывания

Разместив эти коды в программе и дополнив из процедурой обработки прерывания

void TIM6_IRQHandler(void) {
  if (PC3_flipflop) {
    GPIO_ResetBits(GPIOC, GPIO_Pin_3);
    PC3_flipflop = 0;
  }
  else {
    GPIO_SetBits(GPIOC, GPIO_Pin_3);
    PC3_flipflop = 1;
  }
  TIM6->SR &= ~TIM_SR_UIF; // без сбрасывания флага программа зависает!!!
}

на ножке PC3 получим сигнал, изменяющийся с периодичностью 10 мкс: 5 мкс HIGH, 5 мкс LOW.

Естественно, не забываем включить тактирование для используемой периферии:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	// разрешить тактирование GPIOC
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);	// разрешить тактирование TIM6

и правильно настроить используемый вывод:

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

В таком варианте приходится использовать обработку в рамках ISR.

Если хочется добиться полностью автоматической работы генератора меандра по принципу “настроил и забыл”, то естественным образом следует обратиться к ШИМ.

  Tim_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef       TIM_OCInitStructure;

Перво-наперво конфигурируем вывод PA1, с которого будем снимать сигнал

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	// разрешить тактирование GPIOA
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

Разрешаем тактирование таймера 2

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

Конфигурируем таймер: чтобы получить частоту меандра 100 кГц (период 10 мкс) при системной тактовой частоте 72 МГц, запишем в PSC 71, а в ARR – 9 (72,000,000/72 = 1,000,000 1,000,000/10 = 100,000)

  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/1000000 - 1;
  TIM_TimeBaseStructure.TIM_Period = 10 - 1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

После настройки таймера настраиваем ШИМ: Channel 2 / Edge-aligned / not single pulse mode

  TIM_OCStructInit(&TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;             // режим ШИМ -> непрерывные пульсации
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //
  TIM_OCInitStructure.TIM_Pulse = 4;                            // пульс длинной 5 тактов => 5/10 = 50%
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     // полярность => пульс - это единица (+3.3V)
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);                      // инициализация канала 2 таймера 2 -> PA1

Конфигурирование завершено, запускаем таймер

  TIM_Cmd(TIM2, ENABLE);

и с чувством глубокого удовлетворения пользуемся сигналом на выводе PA1.

———–

http://habrahabr.ru/post/161993/

Настройка таймера TIM5 на генерацию меандра с частотой 10 кГц:

    // Тоже самое, только теперь таймер №5 на частоте 10 kHz
    TIM_BaseConfig.TIM_Prescaler =  (SystemCoreClock / 10000) - 1;
    // Мигаем светодиодом 1 раз в секунду.
    TIM_BaseConfig.TIM_Period = 9999;
    TIM_BaseConfig.TIM_ClockDivision = 0;
    TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM5, &TIM_BaseConfig);

    TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCConfig.TIM_Pulse = 4999;
    TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;

    // Первый выход - PA0
    TIM_OC1Init(TIM5, &TIM_OCConfig);

    TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM5, ENABLE);

    TIM_Cmd(TIM5, ENABLE);





О нем достаточно много написано на сайте chipspace.ru. .. continue reading ..