это инициализация системы тактирования - использую внешний кварц на 8 Мгц (надо сказать что UART настроенный на 9600 работает как надо, т.е. тут вроде всё как надо должно быть...)
Код: Выделить всё
void init_RCC()
{
RCC->CR |= HSEBYP | HSEON; // включаем HSE
RCC->CFGR|= SW_0; // тактируем SYS_CLK от HSE
RCC->APB2ENR |= SPI1_EN; // вкл тактирование spi_1
RCC->APB2ENR |= USART1_EN; // вкл тактирование uart_1
RCC->APB1ENR |= TIM2_EN; // enable timer 2
RCC->AHB1ENR |= GPIOA_EN; // вкл тактирование PORTA
RCC->AHB1ENR |= GPIOB_EN; // вкл тактирование PORTB
RCC->AHB1ENR |= GPIOD_EN; // вкл тактирование PORTD
RCC->AHB1ENR |= GPIOE_EN; // вкл тактирование PORTD
}инициализация самого таймера
Код: Выделить всё
void init_TIM2()
{
RCC->APB1ENR |= TIM2_EN; // enable timer 2
TIM2->CR1 |= TIM_CR1_ARPE;//
TIM2->DIER |= TIM_DIER_UIE; // interrupt enable
TIM2->PSC = 8000 - 1; // по идее если у нас APB1 работает на 8Мгц, а я не ставил никаких делителей итп,
TIM2->ARR = 200; // то с данными настройками прерывание каждые 200мс
NVIC_EnableIRQ (TIM2_IRQn);
TIM2->CR1 |= CEN; //enable timer
}
сам обработчик:
Код: Выделить всё
void TIM2_IRQHandler(void)
{
if(!counter)
{
counter=1;
add_task(red_on);
}
else
{
counter=0;
add_task(red_off);
}
TIM2->SR &= ~TIM_SR_UIF;
return;
}