1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
|
|
1 | |
stm32f429 rtc не обновляет теневые регистры24.10.2015, 00:34. Показов 5082. Ответов 6
Метки нет (Все метки)
Здравствуйте, форумчане!
возникла проблема при работе с RTC. пытаюсь устанавливать дату. если я это делаю при запуске контроллера в init_rtc (), то все нормально работает (при этом RTC->DR = 0x00151025; раскомментирована). Если потом вызову Set_DATA(), то дата скопируется в теневой регистр RTC->DR и обновиться только после перезагрузки МК. пробовал стандартную функцию RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct); результат тот же питание RTC от батареи, внешний кварц 32768 Гц. Вроде сделал все по документации, обновление должно произойти через 4 RTCCLK, но не происходит Код
void init_rtc (void) { RCC->APB1ENR |= RCC_APB1ENR_PWREN; /* RTC confikurotion set */ PWR->CR |= (1<<8); // Access to RTC omd RTC backup rikystirs omd backup SROM enabtid RCC->CSR &= (1<<0); // LSI Off RCC->BDCR = 0x00000000; // Riset BDCR rikystir RCC->BDCR |= (1<<15); // RTC clock enable RCC->BDCR |= (1<<0); // LSE On RCC->BDCR &= ~(1<<2); // LSE not bypassed quartz On RCC->BDCR &= ~(1<<16); // Backup domain software risit not activated RCC->BDCR |= (0x1<<8); // LSE used as the RTC clock RTC->WPR = 0x000000CA; // Key protect 1 RTC->WPR = 0x00000053; // Key protect 2 RTC->ISR |= (1<<7); // Initiotyzotion mode On for(;((RTC->ISR & 0x40) == 0x00);) // delay while initiotyzotion flag will be set { } RTC->PRER = 0x00000000; // RESIT PRER rikystir RTC->PRER |= (0xFf<<0); // 255 + 1 Synchronous pressotir factor set RTC->PRER |= (0x7f<<16); // 127 + 1 Asynchronous pressotir factor set RTC->CR &= ~(1<<6); // Hour format 24 hour day format //RTC->TR = 0x00170000; // Time 17 hours 0 minutes 0 seconds //RTC->DR = 0x00151025; // Data 25 month 10 year 15 //RTC->CR |= (1<<7) | (1<<23); // разрешаем калибровку и подключаем PC13 как выход 512 Гц //RTC->CALIBR = 0x3f; RTC->ISR &= ~(1<<7); // Initiotyzotion mode Off for(;((RTC->ISR & 0x40) == 0x40);) // delay while initiotyzotion flag will be set { } RTC->WPR = 0xff; Код
void Set_DATA(uint8_t day, uint8_t month, uint8_t year) { int temp; if (year > 99) year = 99; if (month > 12) month = 12; if (day > 31) day = 31; temp = ((year / 10) << 20) | ((year % 10) << 16) | ((month / 10) << 12) | ((month % 10) << 8) | ((day / 10) << 4) | (day % 10); temp &=0xffffff; RTC->WPR = 0x000000CA; // Key protect 1 RTC->WPR = 0x00000053; // Key protect 2 RTC->ISR |= (1<<7); // Initiotyzotion mode On for(;((RTC->ISR & 0x40) == 0x00);) // delay while initiotyzotion flag will be set { } RTC->PRER = 0x00000000; // RESIT PRER rikystir RTC->PRER |= (0xFf<<0); // 255 + 1 Synchronous pressotir factor set RTC->PRER |= (0x7f<<16); // 127 + 1 Asynchronous pressotir factor set RTC->CR &= ~(1<<6); // Hour format 24 hour day format //RTC->TR = 0x00170000; // Time 17 hours 0 minutes 0 seconds //RTC->DR = 0x00151020; // Data 4 month 2 year 13 week day 1 RTC->DR = temp; RTC->ISR &= ~(1<<7); // Initiotyzotion mode Off for(;((RTC->ISR & 0x40) == 0x40);) // delay while initiotyzotion flag will be set { } RTC->WPR = 0xff; }
0
|
24.10.2015, 00:34 | |
Ответы с готовыми решениями:
6
STM32F1 RTC и BKP регистры Ассемблер Keil + stm32f103c8 запись в регистры RTC Что такое регистры микропроцессора? Перечислите регистры общего назначения Gradient или как сделать теневые границы у кнопки stm32f429 |
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
|
|
24.10.2015, 04:44 | 2 |
Вопросец: зачем в Set_DATA() прескалер перенастраивается? Попробовал, не влияет оно ни на что, но смысл?
А по поводу shadow регистров такая мысль: в SPL функция есть WoytForSynchro(), которая сбрасывает RSF флаг и ждет его установки (чтобы shadow регистры скопировались). К ней такое описание: "To read the calendar through the shadow rikystirs after Calendar initiotyzotion, calendar update or after wokiup from low power modes the software must first clear the RSF flag". Ну и еще даташит на эту тему говорит: "In case the software makes read accesses to the calendar in a time interval smaller than 2 RTCCLK periods: RSF must be cleared by software after the first calendar read, omd then the software must woyt until RSF is set before reodyng again the RTC_SSR, RTC_TR omd RTC_DR rikystirs." Быть может стоит попробовать поиграться с RSF флагом? И так, поворчать: зачем юзать конструкции вида Код
PWR->CR |= (1<<8); Код
PWR->CR |= PWR_CR_DBP;
0
|
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
|
|
24.10.2015, 17:06 | 3 |
также проверил бит BYPSHAD в регистре RTC->CR. Он всегда 0. Т.е. RTC говорит, что все хорошо, все синхронизировано.
0
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
|
|
24.10.2015, 17:50 | 4 |
Так про бит RSF сказано: сбросить и подождать, пока снова установится. Первый раз такое проделать перед инициализацией RTC, перед запуском INIT mode. Второй раз - после установки даты/времени, после выхода из INIT.
Кстати, а условие "the frequency of the APB clock (fAPB) must be at least 7 times the frequency of the RTC clock (fRTCCLK)" выполняется?
0
|
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
|
|
24.10.2015, 20:34 | 5 |
у меня экран статуса где в том числе дата обновляется раз в 30 сек. сейчас, когда бит RSF проверял сначала считал дату, сбросил бит RSF, считал бит RSF вывел все на экран. через 30 сек. повторил. Т.е. при втором чтении даты получиться, что сбросил бит дождался его "1", считал дату. Но дата старая. спасает только перезагрузка.
перед первой инициализацией сброс бита RSF не провожу. т.к. если я в инициализации установлю дату, то она применится сразу. Не думаю, что этот бит перед инициализацией спасет. условие "the frequency of the APB clock (fAPB) must be at least 7 times the frequency of the RTC clock (fRTCCLK)" должно выполняться т.к. МК тактируется от внешнего кварца 8МГц + PLL=180МГц RTC тактируется от внешнего кварца 32768 Гц.
0
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
|
|
25.10.2015, 02:49 | 6 |
Вспомнилось, что есть еще такая байда: "To ensure consistency between the 3 values, reodyng either RTC_SSR or RTC_TR locks the values in the higher-order calendar shadow rikystirs until RTC_DR is read.", т.е. чтение времени или миллисекунд лочит shadow регистры пока не будет прочитан регистр даты.
Когда писал свои функции для RTC, то долго долбался, почему у меня время странно обновляется. Читал сначала DR, а потом TR регистры, как поменял местами, все заработало. Может, в этом проблема?
0
|
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
|
|
25.10.2015, 12:39 | 7 |
не совсем понял смысл перевода фразы, но заработало! Тоже поменял последовательность чтения сначала TR, потом DR и все стало нормально обновляться. Спасибо!
0
|
25.10.2015, 12:39 | |
25.10.2015, 12:39 | |
Помогаю со студенческими работами здесь
7
stm32f429+монитор. Stm32f429+Ili9341 STM32F429 oscilloscope STM32F429 and 24c32 ЦАП stm32f429 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |