Ярлыки

_GetPixelIndex (1) _SetPixelIndex (1) 3-phase (1) 800x480 (1) АЦП (1) генератор (1) синхронный усилитель (2) структура (1) учебный курс (1) шаговый двигатель (1) ШИМ (2) accert (1) AD7608 (1) AD8429 (1) ADC (5) amplifer (1) arccos (1) arcsin (1) arctang (2) arctg (3) ARM (2) arm_sqrt_q15 (2) assembler (6) ASSERT (1) atan (2) bit (1) Bitband (1) boot (3) bootlloader (1) BUTTON (1) C (5) C# (1) CAN (2) CC2530 (5) CMSIS (4) command (1) Cordic (1) Core746I (1) CubeMX (4) DBGMCU (2) debug (2) debug.ini (1) delegate (1) Digital Potentiometers (1) DigitalPOT (1) Discovery (1) DMA (9) DMA2D (1) DSP (1) DSP library (1) DWT (1) EFM32 (5) EmWin (9) EXTI (1) FATFS (1) FMC (2) FreeRTOS (2) gl868-dual cmux (1) GPIO (4) GUI (2) GUIBuilder (1) GUIDRV_CompactColor_16 (1) HAL (3) HappyGecko (1) Hard Fault (2) heap (1) I2C (1) ID (1) ILI9320 (1) ILI9325 (1) Initialisation (1) InitLTDC (1) Instrumentithion (1) Interrupt (4) ITR (1) JTAG (1) Keil (5) LCDConf (2) lock-in (1) LTCD (1) LTDC (3) main (1) memory (1) MINI_STM32 Revision 01 (1) nBoot0 (1) NVIC (1) OnePulse (2) OSAL (4) pack (1) phase (1) printf (3) Pulse (1) PWM (12) RCC (2) RCR (1) Register (1) RESET (2) RS232 (3) RSS (1) RTC (3) RTOS-RTX (1) RTT (1) RTX-RTOS (1) SDCard (1) SDRAM (6) Segger (2) SPI (3) sqrt (3) SSD1298 (1) SSD1963 (1) Standart Peripherial Library (3) STANDBAY (1) startup (1) STemWin (8) stepper motor (1) STlink (2) STM32 (17) STM32429ZI (1) STM32Cube (1) STM32DBG.IN (1) STM32F (28) STM32F0 (4) STM32F1 (13) STM32F4 (10) STM32F4 Discovery (1) STM32F407ZG (1) STM32F429 (2) STM32F746 (1) STOP (1) string (1) struct (1) SWD (1) SWD JTAG (1) Synhronization (1) system_stm32f4xx.c (1) SystemInit (1) SysTick (1) task (4) telit (1) TIM (27) typedef (1) UART (1) USART (9) viewer (2) WM_PAINT (1) Z-stack (5) ZigBee (5)

воскресенье, 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;
}




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

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