Перейти к содержанию
    

Возникают сложности с настройкой таймера для лампочек

Не могу настроить TIM7 т.к. регистр автоперезагрузки (ARR) выходит за пределы 16 бит, нужно его настроить максимально точным, насколько это возможно в 5,8 Гц. Шина APB у меня в 8 МГц





int main(void)         //Главный метод, который запускается по умолчанию
{
    __disable_irq();  //Глобальное запрещение прерывания
    GPIOB1();        //Инициализация порта B
    InitTimer6();   //Инициализация таймера TIM6
    InitTimer7(); //Инициализация таймера TIM17
    
    __enable_irq(); //Глобальное разрешение прерываний
    
    TIM6->CR1 |= 1<<0;   //Разрешаем модулю таймера генерировать прерывания
    TIM7->CR1 |= 1<<0; //Разрешаем модулю таймера генерировать прерывания
    
    while(1)
        {
            if(GPIOB->IDR & (1<<13)) //проверяет есть 1 в 13 бите - sw3
            {
                //GPIOB->BSRR=1<<(6+16)|1<<(4+16); 1 помещает в 20 бит(для отключения) - L5 и 1 помещает в 21 бит (для отключения)
                NVIC_DisableIRQ(TIM6_IRQn);  //выключение таймера у прерывания L7
                NVIC_DisableIRQ(TIM7_IRQn); //выключение таймера у прерывания L5
            }
            else if(GPIOB->IDR & (1<<12)) //проверяет есть 1 в 12 бите - sw4
            {
                //GPIOB->BSRR=1<<6|1<<(4+16); 1 помешает в 6 бит (для включения) - L5 и 0 помещает в 20 бит (для отключения) L7
                NVIC_DisableIRQ(TIM6_IRQn);   //выключение таймера у прерывания L7
                NVIC_EnableIRQ(TIM7_IRQn); //включение таймера у прерывания L5
            }
            else if(!(GPIOB->IDR & (1<<12))) //проверяет есть 1 в 12 бите - sw4 и потом делает в ноль
            {
                //GPIOB->BSRR=1<<(6+16)|1<<4; 1 помещает в 20 порт(для отключения) - L5 и 1 помешает в 4 бит (для включения) L7
                NVIC_EnableIRQ(TIM6_IRQn); //включение таймера у прерывания L7
                NVIC_DisableIRQ(TIM7_IRQn); //выключение таймера у прерывания L5
            }    
        }
}

void GPIOB1(void)
    {
        //Включение тактирования порта B
        RCC->AHBENR|=RCC_AHBENR_GPIOBEN;
        
        //Переключение линий 4 и 6 порта B в режим "Output":
        GPIOB->MODER|=GPIO_MODER_MODER4_0 | GPIO_MODER_MODER6_0;
        //Переключение линий 12(SW4) и 13(SW3) порта B в режим "Input"
        GPIOB->MODER&=~(GPIO_MODER_MODER12 | GPIO_MODER_MODER13);
        //разрешаем работу светодиодам
        GPIOB->BSRR=0x1ff;
    }    
        
void InitTimer6()
    {
        RCC->APB1ENR|=RCC_APB1ENR_TIM6EN; //Включение тактирования модуля TIM6
        TIM6->PSC=7999;    //Установка коэффициента предделителя равного 8000
        TIM6->ARR=200;         //Установка полупериода 2,5  в секундах 0,4 
        TIM6->DIER|=TIM_CR1_CEN; //Разрешаем модулю таймера генерировать прерывание при возникновении события обновления
    }
    
void InitTimer7()
    {
        RCC->APB1ENR|=RCC_APB1ENR_TIM7EN; //Включение тактирования модуля TIM7
        TIM7->PSC=7;         //Установка коэффициента предделителя равного 8, чтобы сделать более точным
        TIM7->ARR=86206;       //Установка полупериода 5,8 
        TIM7->DIER|=TIM_CR1_CEN; //Разрешаем модулю таймера генерировать прерывание при возникновении события обновления
    }
    
    void TIM6_DAC_IRQHandler(void) //обработчик прерываний на L7
    {
        if(GPIOB -> IDR & 1<<6) // L7 проверяет включён ли он
            {
                GPIOB -> BSRR |= 1 << (6 + 16); // L7 выключает
            }
        else
            {
                GPIOB -> BSRR |= 1<<6; // L7 включаем
            }
        TIM6->SR=0; //Флаг прерывания или регистр состояния
    }

void TIM7_IRQHandler(void) // обработчик прерываний на L5
    {
        if(GPIOB -> IDR & 1<<4) // L5 проверяет включён ли он
            {
                GPIOB -> BSRR |= 1 << (4 + 16); // L5 выключаем
            }
        else
            {
                GPIOB -> BSRR |= 1<<4; //L5 включаем
            }
        TIM7->SR=0; //Флаг прерывания или регистр состояния
    }
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...