Страницы

Страницы

воскресенье, 27 декабря 2015 г.

STM32F Timer Synchronization


















#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
void Init_timer(void){
//1-ая часть ЭТО настройка ножки для работы под контролем ТАЙМЕРА 2
    // Необходимо настроить ножку для работы в альтернативном режиме
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // это функция разрешения тактирования порта A
    GPIO_InitTypeDef Pinyshka; // создаём переменную (структуру) для ножки
    // заполняем поля структуры для определения режима ножки
    Pinyshka.GPIO_Pin = GPIO_Pin_9;  // определяем ножки!!! порта
    Pinyshka.GPIO_Mode = GPIO_Mode_Out_PP; // определяем режим работы ножки
    Pinyshka.GPIO_Speed = GPIO_Speed_50MHz; // так как режим на выход то определяем скорость работы ножки
    // этой функцией мы определяем работу ножек (ссылка на заполненную структуру ножки) + (указываем порт необходимых нам ножек)
    GPIO_Init( GPIOC , &Pinyshka);
//2-ая часть ЭТО настройка ТАЙМЕРА 2
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // включаем тактирование таймера 2
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // включаем тактирование таймера 3
    /* Настроечные структурки
     1) TIM_TimeBaseInitTypeDef -- Основные настройки таймера
     2) TIM_OCInitTypeDef  -- Настройки для управление каналами настроенные как ВЫХОД
     3) TIM_ICInitTypeDef  -- Настройки для управление каналами настроенные как ВХОД
     4) TIM_BDTRInitTypeDef  -- Дополнительные разные настройки    */
    // БАЗОВЫЕ настройки таймера 22222222222222222222 (переполняется раз в пол секунды !!!)
    TIM_TimeBaseInitTypeDef Timerushka_Base2; // создаём переменную (структуру) для определения режима работы таймера
    Timerushka_Base2.TIM_CounterMode = TIM_CounterMode_Up; // Выбираем режим работы счетчика
    Timerushka_Base2.TIM_Prescaler = 24000 - 1; // пред делитель
    Timerushka_Base2.TIM_Period = 500; // периуд
    Timerushka_Base2.TIM_ClockDivision = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
    // Timerushka_Base.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
    TIM_TimeBaseInit(TIM2, &Timerushka_Base2); // Засовываем настройи в регистры
    // БАЗОВЫЕ настройки таймера 33333333333333 (переполняется раз в 1 сек !!!!! [так как тактируется от тим2])
    TIM_TimeBaseInitTypeDef Timerushka_Base3; // создаём переменную (структуру) для определения режима работы таймера
    Timerushka_Base3.TIM_CounterMode = TIM_CounterMode_Up; // Выбираем режим работы счетчика
    Timerushka_Base3.TIM_Prescaler = 1 - 1; // пред делитель
    Timerushka_Base3.TIM_Period = 1; // периуд (ВАЖНО ЧТО ЭТО ЧИСЛО ТОЖЕ УЧАСТВУЕТ !!!!)
    Timerushka_Base3.TIM_ClockDivision = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
    // Timerushka_Base.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
    TIM_TimeBaseInit(TIM3, &Timerushka_Base3); // Засовываем настройи в регистры
    // НАСТРАИВАЕМ СВЯЗЬ ТАЙМЕРОВ
    /* Хотим чтобы [TIM2-(тактирует)->TIM3] */
    /* Определяем когда импульсы давать ведомому таймеру? говорим по переполнению */
    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); // рег TIMx->CR2 биты MMS.
    TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1); // рег TIMx->SMCR биты TS.// Table 71. TIMx internal trigger connection
    /* Включаем тактирование от внешнего источника.  */
   // TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); // рег TIMx->SMCR бит MSM.
    // выбираемс откуда приходят тактушки
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1); // рег TIMx->SMCR биты SMS.
    /* Разрешаем таймеру генерировать прерывание по переполнению TIM3*/
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    /* Разрешаем прерывания таймера TIM2 */
    NVIC_EnableIRQ(TIM3_IRQn);
    // ЗАПУСК всего безобразий !!!
    TIM_Cmd(TIM2, ENABLE);
    TIM_Cmd(TIM3, ENABLE);
}
// ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 3
void TIM3_IRQHandler(void)
{
  static uint32_t flag = 0;
  // Смотрим что прерывание от таймера именно по событию переполнение
  if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
  {
    /* Очищаем флажочик этого прерывания */
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
    if(flag)// играемся с зелененьким светодиодиком (вкл/выкл)
    {  GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_SET);    flag=0;}//
    else
    {  GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_RESET);  flag=1;};//
  }
}
int main(void) {
Init_timer(); // инициализация таймера 6
    while (1); // безконечный цикл
    return 0;
}



#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
void Init_timer(void){
//1-ая часть ЭТО настройка ножки для работы под контролем ТАЙМЕРА 2
    // Необходимо настроить ножку для работы в альтернативном режиме
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // это функция разрешения тактирования порта A
    GPIO_InitTypeDef Pinyshka; // создаём переменную (структуру) для ножки
    // заполняем поля структуры для определения режима ножки
    Pinyshka.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;  // определяем ножки!!! порта
    Pinyshka.GPIO_Mode = GPIO_Mode_Out_PP; // определяем режим работы ножки
    Pinyshka.GPIO_Speed = GPIO_Speed_50MHz; // так как режим на выход то определяем скорость работы ножки
    // этой функцией мы определяем работу ножек (ссылка на заполненную структуру ножки) + (указываем порт необходимых нам ножек)
    GPIO_Init( GPIOC , &Pinyshka);
//2-ая часть ЭТО настройка ТАЙМЕРА 2
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // включаем тактирование таймера 2
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // включаем тактирование таймера 3
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); // включаем тактирование таймера 3
    /* Настроечные структурки
     1) TIM_TimeBaseInitTypeDef -- Основные настройки таймера
     2) TIM_OCInitTypeDef  -- Настройки для управление каналами настроенные как ВЫХОД
     3) TIM_ICInitTypeDef  -- Настройки для управление каналами настроенные как ВХОД
     4) TIM_BDTRInitTypeDef  -- Дополнительные разные настройки    */
    // БАЗОВЫЕ настройки таймера 22222222222222222222 (переполняется раз в пол секунды !!!)
    TIM_TimeBaseInitTypeDef Timerushka_Base2; // создаём переменную (структуру) для определения режима работы таймера
    Timerushka_Base2.TIM_CounterMode = TIM_CounterMode_Up; // Выбираем режим работы счетчика
    Timerushka_Base2.TIM_Prescaler = 24000 - 1; // пред делитель
    Timerushka_Base2.TIM_Period = 500; // периуд
    Timerushka_Base2.TIM_ClockDivision = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
    // Timerushka_Base.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
    TIM_TimeBaseInit(TIM2, &Timerushka_Base2); // Засовываем настройи в регистры
    // БАЗОВЫЕ настройки таймера 33333333333333 (переполняется раз в 1 сек !!!!! [так как тактируется от тим2])
    TIM_TimeBaseInitTypeDef Timerushka_Base3; // создаём переменную (структуру) для определения режима работы таймера
    Timerushka_Base3.TIM_CounterMode = TIM_CounterMode_Up; // Выбираем режим работы счетчика
    Timerushka_Base3.TIM_Prescaler = 1 - 1; // пред делитель
    Timerushka_Base3.TIM_Period = 1; // периуд (ВАЖНО ЧТО ЭТО ЧИСЛО ТОЖЕ УЧАСТВУЕТ !!!!)
    Timerushka_Base3.TIM_ClockDivision = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
    // Timerushka_Base.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
    TIM_TimeBaseInit(TIM3, &Timerushka_Base3); // Засовываем настройи в регистры
    // БАЗОВЫЕ настройки таймера 4444444 (переполняется раз в 2 сек !!!!! [так как тактируется от тим2])
    TIM_TimeBaseInitTypeDef Timerushka_Base4; // создаём переменную (структуру) для определения режима работы таймера
    Timerushka_Base4.TIM_CounterMode = TIM_CounterMode_Up; // Выбираем режим работы счетчика
    Timerushka_Base4.TIM_Prescaler = 1 - 1; // пред делитель
    Timerushka_Base4.TIM_Period = 3; // периуд (ВАЖНО ЧТО ЭТО ЧИСЛО ТОЖЕ УЧАСТВУЕТ !!!!)
    Timerushka_Base4.TIM_ClockDivision = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
    // Timerushka_Base.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
    TIM_TimeBaseInit(TIM4, &Timerushka_Base4); // Засовываем настройи в регистры
    // НАСТРАИВАЕМ СВЯЗЬ ТАЙМЕРОВ
    /* Хотим чтобы [TIM2-(тактирует)->TIM3] */
    /* Определяем когда импульсы давать ведомому таймеру? говорим по переполнению */
    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); // рег TIMx->CR2 биты MMS.
    TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1); // рег TIMx->SMCR биты TS.// Table 71. TIMx internal trigger connection
    /* Включаем тактирование от внешнего источника.  */
   // TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); // рег TIMx->SMCR бит MSM.
    // выбираемс откуда приходят тактушки
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1); // рег TIMx->SMCR биты SMS.
    /* Хотим чтобы [TIM2-(тактирует)->TIM4] */
    /* Определяем когда импульсы давать ведомому таймеру? говорим по переполнению */
    //TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); // рег TIMx->CR2 биты MMS.
    TIM_SelectInputTrigger(TIM4, TIM_TS_ITR1); // рег TIMx->SMCR биты TS.// Table 71. TIMx internal trigger connection
    /* Включаем тактирование от внешнего источника.  */
   // TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); // рег TIMx->SMCR бит MSM.
    // выбираемс откуда приходят тактушки
    TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_External1); // рег TIMx->SMCR биты SMS.
    /* Разрешаем таймеру генерировать прерывание по переполнению TIM3*/
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    /* Разрешаем прерывания таймера TIM3 */
    NVIC_EnableIRQ(TIM3_IRQn);
    /* Разрешаем таймеру генерировать прерывание по переполнению TIM3*/
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
    /* Разрешаем прерывания таймера TIM3 */
    NVIC_EnableIRQ(TIM4_IRQn);
    // ЗАПУСК всего безобразий !!!
    TIM_Cmd(TIM2, ENABLE);
    TIM_Cmd(TIM3, ENABLE);
    TIM_Cmd(TIM4, ENABLE);
}
// ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 3
void TIM3_IRQHandler(void)
{
  static uint32_t flag = 0;
  // Смотрим что прерывание от таймера именно по событию переполнение
  if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
  {
    /* Очищаем флажочик этого прерывания */
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
    if(flag)// играемся с зелененьким светодиодиком (вкл/выкл)
    {  GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_SET);    flag=0;}//
    else
    {  GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_RESET);  flag=1;};//
  }
}
// ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 4
void TIM4_IRQHandler(void)
{
  static uint32_t flag = 0;
  // Смотрим что прерывание от таймера именно по событию переполнение
  if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
  {
    /* Очищаем флажочик этого прерывания */
    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    if(flag)// играемся с зелененьким светодиодиком (вкл/выкл)
    {  GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET);    flag=0;}//
    else
    {  GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_RESET);  flag=1;};//
  }
}
int main(void) {
Init_timer(); // инициализация таймера 6
    while (1); // безконечный цикл
    return 0;
}




Комментариев нет:

Отправить комментарий