Здравствуйте.
Не могу разобраться с прерыванием (Stm32Vldiscovery).
Когда выполняется функция NVIC_EnableIRQ (RTC_IRQn);
В окне дизасемблера программа весит в BusFault_Handler
Раздел: Песочница или Вопрос-Ответ
Не могу разобраться с прерыванием (Stm32Vldiscovery).
#include "stm32f10x.h"
char a=1;
unsigned char main (void)
{
//НАСТРОЙКА ПРЕРЫВАНИЙ
__enable_irq (); //разрешение глобальных прерываний
RTC->CRL |= RTC_CRL_CNF; //разрешить конфигурирование регистров RTC
RTC->CRH = RTC_CRH_SECIE;//разрешить прерывание от секундных импульсов
RTC->CRL &= ~RTC_CRL_CNF; //выйти из режима конфигурирования
NVIC_EnableIRQ (RTC_IRQn);
//разрешить тактирование модулей управления питанием и управлением резервной областью
RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;
//разрешить доступ к области резервных данных
PWR->CR |= PWR_CR_DBP;
//если часы выключены - инициализировать их
if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN)
{
//выполнить сброс области резервных данных
RCC->BDCR |= RCC_BDCR_BDRST;
RCC->BDCR &= ~RCC_BDCR_BDRST;
//выбрать источником тактовых импульсов внешний кварц 32768 и подать тактирование
RCC->BDCR |= RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL_LSE;
RTC->CRL |= RTC_CRL_CNF;
RTC->PRLL = 0x7FFF; //регистр деления на 32768
RTC->CRL &= ~RTC_CRL_CNF;
//установить бит разрешения работы и дождаться установки бита готовности
RCC->BDCR |= RCC_BDCR_LSEON;
while ((RCC->BDCR & RCC_BDCR_LSEON) != RCC_BDCR_LSEON){}
RTC->CRL &= (uint16_t)~RTC_CRL_RSF;
while((RTC->CRL & RTC_CRL_RSF) != RTC_CRL_RSF){}
return 1;
}
for(;;);
}
void RTC_IRQHandler(void)
{
//причина прерывания - переполнение входного делителя (новая секунда)
if(RTC->CRL & RTC_CRL_SECF)
{
RTC->CRL &= ~RTC_CRL_SECF; //сбросить флаг (обязательно!!!)
//выполняем какие-то действия
++a;
}
}
Когда выполняется функция NVIC_EnableIRQ (RTC_IRQn);
В окне дизасемблера программа весит в BusFault_Handler
Раздел: Песочница или Вопрос-Ответ