21.09.2017, 23:51
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
STM32F4 и RTC
Помогите пожалуйста. Часы тикают, но не происходит прерывание... На F100 помню было очень удобно, там хорошо реализовано прерывание каждую секунду. А на F4 такого нет, приходится делать через ALARM.
Код:
|
void RTC_Alarm_IRQHandler(){
if(RTC-›ISR & RTC_ISR_ALRAF){
RTC-›ISR = ~RTC_ISR_ALRAF;
GPIOB-›ODR ^= 0x4000;
}
}
void rtc_ini(void){
RCC-›APB1ENR |= RCC_APB1ENR_PWREN;
PWR-›CR |= PWR_CR_DBP; //Open access to Backup regs
RCC-›BDCR |= RCC_BDCR_BDRST;
RCC-›BDCR &= ~RCC_BDCR_BDRST;
RCC-›BDCR |= RCC_BDCR_LSEON;
while(!(RCC-›BDCR & RCC_BDCR_LSERDY)){}
RCC-›BDCR |= RCC_BDCR_RTCSEL_0;
RCC-›BDCR |= RCC_BDCR_RTCEN;
RTC_WaitForSynchro();
RTC-›WPR = 0xCA; //Open access to RTC
RTC-›WPR = 0x53; //Open access to RTC
RTC-›CR &= ~RTC_CR_FMT; //24h format
RTC-›PRER |= 0xFF;
RTC-›PRER |= (uint32_t)(0x7F ‹‹ 16);
//Alarm
RTC-›CR &= ~RTC_CR_ALRAE;
while(!(RTC-›ISR & RTC_ISR_ALRAWF)){}
RTC-›ALRMAR |= RTC_ALRMAR_MSK1 | RTC_ALRMAR_MSK2 | RTC_ALRMAR_MSK3;
RTC-›ALRMAR |= RTC_ALRMAR_SU_0 | RTC_ALRMAR_SU_1;
RTC-›CR |= RTC_CR_ALRAE;
RTC-›CR |= RTC_CR_ALRAIE;
RTC-›ISR = ~RTC_ISR_ALRAF;
RTC-›WPR = 0xFF; //Close access to RTC
NVIC_EnableIRQ(RTC_Alarm_IRQn);
} |
вот сюда RTC-›ALRMAR |= RTC_ALRMAR_SU_0 | RTC_ALRMAR_SU_1; я подставлял разные значения. Не помогает. Что-то упустил, подскажите пожалуйста, что?
|
|
|
|
22.09.2017, 00:31
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32F4 и RTC
В чипах F4 прерывание от часов замаплено куда-то на линию EXTI, смотри референс на свой чип (примерно на EXTI-18 кажется)
|
|
|
|
23.09.2017, 00:42
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM32F4 и RTC
Заработало
Код:
|
void RTC_Alarm_IRQHandler(){
if(RTC-›ISR & RTC_ISR_ALRAF){
RTC-›ISR = ~RTC_ISR_ALRAF;
EXTI-›PR = ~EXTI_PR_PR17;
GPIOB-›ODR ^= 0x4000;
}
}
void rtc_ini(void){
RCC-›APB1ENR |= RCC_APB1ENR_PWREN;
PWR-›CR |= PWR_CR_DBP; //Open access to Backup regs
RCC-›BDCR |= RCC_BDCR_BDRST;
RCC-›BDCR &= ~RCC_BDCR_BDRST;
RCC-›BDCR |= RCC_BDCR_LSEON;
while(!(RCC-›BDCR & RCC_BDCR_LSERDY)){}
RCC-›BDCR |= RCC_BDCR_RTCSEL_0;
RCC-›BDCR |= RCC_BDCR_RTCEN;
RTC_WaitForSynchro();
RTC-›WPR = 0xCA; //Open access to RTC
RTC-›WPR = 0x53; //Open access to RTC
RTC-›CR &= ~RTC_CR_FMT; //24h format
RTC-›PRER |= 0xFF;
RTC-›PRER |= (uint32_t)(0x7F ‹‹ 16);
//Alarm A Every 1 second
//RTC-›ISR = ~RTC_ISR_ALRAF; //STM32 is stuck
EXTI-›PR = EXTI_PR_PR17;
EXTI-›IMR |= EXTI_IMR_MR17;
EXTI-›EMR &= ~EXTI_EMR_MR17;
EXTI-›RTSR |= EXTI_RTSR_TR17;
NVIC_EnableIRQ(RTC_Alarm_IRQn);
RTC-›CR &= ~RTC_CR_ALRAE;
while(!(RTC-›ISR & RTC_ISR_ALRAWF)){}
RTC-›ALRMAR |= RTC_ALRMAR_MSK1 | RTC_ALRMAR_MSK2 | RTC_ALRMAR_MSK3 | RTC_ALRMAR_MSK4; //Alarm every 1 second
RTC-›ALRMAR |= RTC_ALRMAR_SU_0; // 1 second in BCD format
RTC-›CR |= RTC_CR_ALRAE;
RTC-›CR |= RTC_CR_ALRAIE;
RTC-›WPR = 0xFF; //Close access to RTC
} |
Только странно, в даташите сказано, перед настройкой аларм сбросить флаг прерывания, хотя он и так там не стоит . RTC-›ISR = ~RTC_ISR_ALRAF;. Если поставить эту строчку перед алармом, то МК зависает
|
|
|
|
23.09.2017, 10:57
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32F4 и RTC
маладец, всего 4 ошибки в коде.
1. после включения тактирования надо делать паузу на неск тактов
2. перед выборкой источника тактирования RTC надо маской чистить место под бит
3. при настройке часов надо переходить в режим настройки, видимо поэтому и виснет
4. сброс битов прерывания делается прямой а не инверсной маской в EXTI и прочих
это что сразу в глаза бросилось...
|
|
|
|
23.09.2017, 20:34
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM32F4 и RTC
Сообщение от Hives
|
маладец, всего 4 ошибки в коде.
1. после включения тактирования надо делать паузу на неск тактов
2. перед выборкой источника тактирования RTC надо маской чистить место под бит
3. при настройке часов надо переходить в режим настройки, видимо поэтому и виснет
4. сброс битов прерывания делается прямой а не инверсной маской в EXTI и прочих
это что сразу в глаза бросилось...
|
А можно подробнее про пункт 2?
И по п. 4. Про EXTI, согласен, в даташите rc_w1. Что значит запись 1. А вот в RTC_ISR - rc_w0. Значит здесь-то ноль записывать?
|
|
|
|
23.09.2017, 22:00
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32F4 и RTC
2. как то так
RCC-›BDCR = (RCC-›BDCR & (~RCC_BDCR_RTCSEL)) | RCC_BDCR_RTCSEL_0;
выборка источника RTC независимо от того что было до этого.
4. регистр RTC_ISR чистится записью нолей, правильно.
|
|
|
|
23.09.2017, 23:00
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM32F4 и RTC
Спасибо) осталось только одна загвоздка, не тикает от батарейки, при включении сбрасывает все по нулям(
|
|
|
|
23.09.2017, 23:49
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32F4 и RTC
а сброс бакап домена убрать из кода не догадался?
|
|
|
|
24.09.2017, 00:18
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM32F4 и RTC
Сообщение от Hives
|
а сброс бакап домена убрать из кода не догадался?
|
О, спасибо. Убрал
//RCC-›BDCR |= RCC_BDCR_BDRST;
//RCC-›BDCR &= ~RCC_BDCR_BDRST;
теперь тикают от батарейки. Тогда почему в большинстве уроков про rtc есть эти строки? зачем они тогда нужны?
|
|
|
|
24.09.2017, 00:52
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32F4 и RTC
уроки писали идиоты, что еще сказать.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:20.
|
|