Цитата(Pridnya @ Jun 15 2016, 22:40)

а отстающие периодически (1 раз в 8 секунд, после коррекции) показывают время в миллисекундах .000 примерно на полсекунды, а потом идут тоже с точностью 0,001 сек.
Оказывается, что после сдвига значение регистра SSR может превышать значение синхронного счетчика PREDIV_S (он равен 0x7FF), а я это не учел в формуле, которая переводит субсекунды в миллисекунды. Получилось, что для всех значений, больших PREDIV_S миллисекунды равны нулю, а затем расчитываются правильно.
CODE
//SecondFraction = (float)( PREDIV_S - SSR ) / ( PREDIV_S + 1 );
uint32_t SSR = 2058; // Субсекунды.
uint32_t SS = 0; // Тысячные доли.
do
{
float Second_fraction = 0;
Second_fraction = (float)( 2047.0F - (float)SSR ) / ( 2048.0F );
printf("SSR=%d",SSR);
printf(" ");
printf("Second_fraction=%f",Second_fraction);
Second_fraction *= 1000.0F;
SS = Second_fraction;
printf(" ");
printf("SS=%d\n",SS);
SSR--;
}
while(SSR>2028);
SSR=2058 Second_fraction=-0.005371 SS=0
...
SSR=2049 Second_fraction=-0.000977 SS=0
SSR=2048 Second_fraction=-0.000488 SS=0
SSR=2047 Second_fraction=0.000000 SS=0
SSR=2046 Second_fraction=0.000488 SS=0
SSR=2045 Second_fraction=0.000977 SS=0
SSR=2044 Second_fraction=0.001465 SS=1
SSR=2043 Second_fraction=0.001953 SS=1
SSR=2042 Second_fraction=0.002441 SS=2
SSR=2041 Second_fraction=0.002930 SS=2
SSR=2040 Second_fraction=0.003418 SS=3
SSR=2039 Second_fraction=0.003906 SS=3
SSR=2038 Second_fraction=0.004395 SS=4
SSR=2037 Second_fraction=0.004883 SS=4
SSR=2036 Second_fraction=0.005371 SS=5
SSR=2035 Second_fraction=0.005859 SS=5
SSR=2034 Second_fraction=0.006348 SS=6
SSR=2033 Second_fraction=0.006836 SS=6
SSR=2032 Second_fraction=0.007324 SS=7
SSR=2031 Second_fraction=0.007812 SS=7
SSR=2030 Second_fraction=0.008301 SS=8
SSR=2029 Second_fraction=0.008789 SS=8
В рабочий журнал добавил запись до сдвига и после. Видно, что после сдвига время на 1 секунду больше, при этом RTC_SSR превышает PREDIV_S, равен 0xFFA. Об этом упоминается в RM0090, в описании RTC_SSR
Цитата
Note: SS can be larger than PREDIV_S only after a shift operation. In that case, the correct
time/date is one second less than as indicated by RTC_TR/RTC_DR.
Код
// Субсекунды 0-2047 (разрешение 0,00049 сек)
ssr = RTC_GetSubSecond(); // Читаем до сдвига.
If() {...}
else // Если часы модуля RTC отстают.
{
AddSystemEvent(0xC000|ssr); // ssr=2, (2047-ssr/2048)=.998
PWR_BackupAccessCmd(ENABLE);
stat = RTC_SynchroShiftConfig(RTC_ShiftAdd1S_Set, 2048-ssr); //2048-2=2046
PWR_BackupAccessCmd(DISABLE);
ssrs = RTC_GetSubSecond();
AddSystemEvent(0xC000|ssrs);
}
Не совсем понимаю, а как в этом случае получить корректное время и что происходит с RTC_SSR, пока его значение больше PREDIV_S?
Сообщение отредактировал IgorKossak - Jun 16 2016, 14:01
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!
Эскизы прикрепленных изображений