SamuraiFeeed 0 9 марта, 2022 Опубликовано 9 марта, 2022 · Жалоба Не могу настроить 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; //Флаг прерывания или регистр состояния } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 9 марта, 2022 Опубликовано 9 марта, 2022 · Жалоба Он же 16-битный. 8М/43/32077 = 5.799997 4М/44/15674 = 5.799993 Подбирайте... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться