Сделал два прерывания на кнопку и на таймер. Нажатие кнопки прекрасно обрабатывается. А вот с таймером проблемы. Решил потетстить свою настройку RCC, т.к. она не хочет работать корректно, ну или мне так кажется, но наткнулся еще на одну проблему. Код:
void exti_init()
{
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
SYSCFG->EXTICR[3] |=
SYSCFG_EXTICR1_EXTI0_PA;
EXTI->RTSR |=
EXTI_RTSR_TR0;
EXTI->PR =
EXTI_PR_PR0;
EXTI->IMR |= EXTI_IMR_MR0;
NVIC_EnableIRQ( EXTI0_IRQn );
NVIC_SetPriority( EXTI0_IRQn, 14 );
// NVIC_EnableIRQ ( RCC_IRQn );
// NVIC_SetPriority( RCC_IRQn, 10 );
__enable_irq();
}
void RCC_Init(void )
{
SET_BIT( RCC->CR, RCC_CR_HSEON );
while ( READ_BIT( RCC->CR, RCC_CR_HSERDY == RESET ) );
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY_0WS;
SET_BIT( RCC->PLLCFGR, RCC_PLLCFGR_PLLM_2 );
SET_BIT( RCC->PLLCFGR, RCC_PLLCFGR_PLLM_3 );
SET_BIT( RCC->PLLCFGR, RCC_PLLCFGR_PLLN_5 );
SET_BIT( RCC->PLLCFGR, RCC_PLLCFGR_PLLN_6 );
SET_BIT( RCC->PLLCFGR, ~RCC_PLLCFGR_PLLP_Pos );
SET_BIT( RCC->CFGR, RCC_CFGR_PPRE2_DIV1 );
SET_BIT( RCC->CFGR, RCC_CFGR_PPRE1_DIV2 );
SET_BIT( RCC->CFGR, RCC_CFGR_HPRE_DIV1 );
SET_BIT( RCC->CR, RCC_CR_PLLON );
while ( READ_BIT( RCC->CR, RCC_CR_PLLRDY == RESET ) );
SET_BIT( RCC->CFGR, RCC_CFGR_SW_PLL );
while ( READ_BIT( RCC->CR, RCC_CFGR_SWS_1 == RESET ) );
}
GPIO_init(void )
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;
GPIOC->MODER |= GPIO_MODER_MODER13_0;
GPIOA->MODER &= ~GPIO_MODER_MODER0_0;
GPIOA->MODER &= ~GPIO_MODER_MODER0_1;
SET_BIT( GPIOA->PUPDR, GPIO_PUPDR_PUPD0_0 );
}
TIM2_init(void){
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->PSC = 8000-1;
TIM2->ARR = 1000-1;
TIM2->DIER |= TIM_DIER_UDE;
TIM2->CR1 |= TIM_CR1_CEN;
NVIC_EnableIRQ(TIM2_IRQn);
NVIC_SetPriority(TIM2_IRQn, 13);
}
int main( void )
{
// RCC_Init();
GPIO_init();
TIM2_init();
exti_init();
while ( 1 ) {
}
}
void RCC_IRQHandler()
{
}
void EXTI0_IRQHandler( void )
{
if ( EXTI->PR & EXTI_PR_PR0 ) {
EXTI->PR = EXTI_PR_PR0;
GPIOC->ODR ^= GPIO_ODR_ODR_13;
}
}
void TIM2_IRQHandler(void)
{
TIM2->SR = TIM_SR_UIF;
GPIOC->ODR ^= GPIO_ODR_ODR_13;
}