Вобщем переписал немного, вроде заработало
Инициализация
Код:
|
void RTC_INI(void){
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;
RCC-›BDCR |= RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL_LSI;
RTC-›CRL |= RTC_CRL_CNF;
RTC-›PRLL = 0x7FFF; // записать в регистр деления 32768
RTC-›CRH = RTC_CRH_SECIE;//разрешить прерывание от секундных импульсов
RTC-›CRL &= ~RTC_CRL_CNF;
RCC-›CSR |= RCC_CSR_LSION;
while ((RCC-›CSR & RCC_CSR_LSIRDY) != RCC_CSR_LSIRDY) {}
RTC-›CRL &= (uint16_t)~RTC_CRL_RSF;
while((RTC-›CRL & RTC_CRL_RSF) != RTC_CRL_RSF) {}
//}
NVIC_EnableIRQ(RTC_IRQn);
} |
Запись
Код:
|
void RTC_Set_Counter(uint32_t Counter){
while((RTC-›CRL & RTC_CRL_RTOFF) == 0){}
RTC-›CRL |= RTC_CRL_CNF; //Входим в режим конфигурации
RTC-›CNTH = Counter ›› 16; //Установка старшего регистра
RTC-›CNTL = Counter; //Установка младшего регистра
RTC-›CRL &= ~RTC_CRL_CNF; //Выходим из режима конфигурации
while((RTC-›CRL & RTC_CRL_RTOFF) == 0){}
} |
А теперь немного другая проблема. Инициализация у меня такая же как практически во всех примерах. Но, почему я закомментил проверку RTCEN. Объясняю. Авторы этой инициализации, делают проверку, включены ли часы, если включены, то зачем инициализировать, они запускаются и всё. У меня не так. Когда я включаю плату, то бит RTCEN = установлен, но не установлены никакие другие, например как LSI. Если убрать эту проверку, то часы работают нормально. Но стартуют с нуля, так как у меня нет батарейки. Вот странно, что бит RTCEN после включения/ресета установлен. Разве так должно быть?