kumle 0 9 декабря, 2022 Опубликовано 9 декабря, 2022 (изменено) · Жалоба Пытюсь получать значения субсекунд от RTC сделал тестовую функцию которая запускается в произвольный момент и вызывает 5 чтений SSR через паузы 1 миллисекунду времени по приходу команды void RTC_TEST(void) { volatile unsigned int ssr[5]={0}; ssr[0] = RTC_GetSubSecond(); delay1ms(); ssr[1] = RTC_GetSubSecond(); delay1ms(); ssr[2] = RTC_GetSubSecond(); delay1ms(); ssr[3] = RTC_GetSubSecond(); delay1ms(); ssr[4] = RTC_GetSubSecond(); asm("NOP"); asm("NOP"); asm("NOP"); } далее там где нопы ставлю точку останова и в отладчике смотрю массив ssr. разности соседних значений ssr в массиве соответствуют одной миллисекунде задержки !!!! НО !!!! Далее продолжив программу снова запускаю функцию внешней командой и получаю опять 5 значений в массиве ssr, Причем самое первое ssr[0] всегда примено равно предыдущему значению ssr[0] из предыдущего запуска функции. Как так получается, я ведь запускаю в совершенно разные мометнты времени и миллисекунды тоже должны быть произвольные ? Вот например пример результатов запуска несколько раз этой функции: первый запуск 10944, 10924, 10903, 10883, 10862 второй запуск 10969, 10949, 10928, 10908, 10877 третий запуск 10981, 10961, 10940, 10920, 10900 Модератор: код прячем в теги, пустые строки в большом количестве не оставляем! Изменено 9 декабря, 2022 пользователем haker_fox Оформление поправил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OPTIMA 1 11 декабря, 2022 Опубликовано 11 декабря, 2022 · Жалоба А почему они длжны отличаться если вы в начале обнуляете массив! перед чтением первого значения нет задержки 1мс и значение должно быть всяко разно меньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
codenamehawk 0 12 декабря, 2022 Опубликовано 12 декабря, 2022 · Жалоба On 12/9/2022 at 1:23 PM, kumle said: Как так получается Возможно как то синхронизируется. Попробуйте, между попытками, добавить случайные задержки и выполнить пять запросов за один запуск. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kumle 0 13 декабря, 2022 Опубликовано 13 декабря, 2022 · Жалоба Да, выяснил. Поставил вызов в прерывание и сразу при каждом вызове значения были разные !!! А до этого вызов был в бесконечном цикле в main, а так как RTC от часового кварца, то видимо засинхронизировался с тактами контроллера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xemul 0 13 декабря, 2022 Опубликовано 13 декабря, 2022 · Жалоба Если бы Вы показали инициализацию RTC, гадать было бы проще. У мну почему-то получается (для дефолтного RTC_PRER), что RTC у Вас тактируется от ~ 50 кГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kumle 0 14 декабря, 2022 Опубликовано 14 декабря, 2022 · Жалоба Вот моя инициализация RTC void RTC_Config(void) { /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); // if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN) // { // Сброс данных в резервной области // RCC_BackupResetCmd(ENABLE); // RCC_BackupResetCmd(DISABLE); RCC_LSEConfig(RCC_LSE_ON); /* wait till lse is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Configure the RTC data register and RTC prescaler */ //из даташита: F=Frtcosc/((div_a+1)x(div_s+1))=32768/((1+1)*(16383+1))=1Hz //при этом subsecond точность будет равна 1/16384=61,035мкс !!! RTC_InitStructure.RTC_AsynchPrediv = 1; RTC_InitStructure.RTC_SynchPrediv = 16383; RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_12; /* Check on RTC init */ if (RTC_Init(&RTC_InitStructure) == ERROR) { asm("NOP"); asm("NOP"); asm("NOP"); } /* Enable The TimeStamp */ //RTC_TimeStampCmd(RTC_TimeStampEdge_Falling, ENABLE); // } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xemul 0 14 декабря, 2022 Опубликовано 14 декабря, 2022 · Жалоба 1 LSB RTC_SSR при таком RTC_PRER действительно будет соответствовать 1/LSE_CLK*2. А если в PREDIV_A вписать 0, то 1 LSB RTC_SSR вообще получится 1/LSE_CLK. Но точность этой 1 будет определяться только точностью LSE_CLK. (на всякий случай)Note: When both prescalers are used, it is recommended to configure the asynchronous prescaler to a high value to minimize consumption. И лучше сразу придумать какой-нить выход по таймауту из цикла ожидания готовности LSE. По исходному вопросу у меня только одно предположение: т.к. RTC_SSR обнуляется только в трёх случаях, то за ~ 0.33 с до вызова RTC_TEST() приключался один из этих случаев. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться