Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2019-янв-23 16:32

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
СообщениеДобавлено: 2016-апр-11 13:38 
Не в сети

Зарегистрирован: 2016-мар-05 21:08
Сообщения: 25
Пытаюсь разобраться с часами реального времени.
Сам принцип я понимаю. Включаем - считает.
Вот только странно считает.

Здесь происходит инициализация.

Код:
RST_CLK->PER_CLOCK  |= ((uint32_t)(1 << ((((uint32_t)0x400D8000) >> 15) & 0x1F)));
   
   BKP->REG_0F |= (uint32_t)0x80000000;
   BKP->REG_0F &= (uint32_t)0x7FFFFFFF;
   
   BKP->REG_0F &= ~((uint32_t)(0x00000001 | 0x00000002));
   BKP->REG_0F |= ((uint32_t)0x00000001);
   do
   {
   Counter++;
   }
   while ((Counter < 0x0600) && ((BKP->REG_0F & (1 << 13)) == 0x00));
   
   BKP->REG_0F &= (uint32_t)(~(0x0000000C)); // deselect clock sources
   BKP->REG_0F |= (uint32_t)0x00000004;     // select LSE clock
   while((BKP->RTC_CS & 0x00000040) == 0x00000040); // wait for update
   
   BKP->RTC_PRL = 0x8000; //32768;
  while((BKP->RTC_CS & 0x00000040) == 0x00000040); // wait for update
  BKP->RTC_CS |= (uint32_t)0x00000002;      //A
  while((BKP->RTC_CS & 0x00000040) == 0x00000040); // wait for update
  BKP->REG_0F |= (uint32_t)0x00000010;


И на картинке состояния регистров.
Почему то увеличивается значение регистра RTC_DIV.
А значение регистра RTC_CNT начинает увеличиватся только после того как ставлю и убираю галочку RTC_RESET.
Какой должна быть скорость счета? Значение регистра должно увеличиватся на единицу раз в секунду?


Вложения:
2016-04-11_15-25-04.png
2016-04-11_15-25-04.png [ 11.94 КБ | Просмотров: 2777 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-13 16:40 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
newfag писал(а):
Почему то увеличивается значение регистра RTC_DIV.

В описании регистра RTC_DIV сказано: "Значение счетчика предварительного делителя часов реального времени", - поэтому значение этого регистра увеличивается.
newfag писал(а):

А значение регистра RTC_CNT начинает увеличиватся только после того как ставлю и убираю галочку RTC_RESET.

Либо что-то не настраивается, либо счетчик предварительного делителя ещё не досчитал до значения основания счета, соответственно, не сформировал импульс для основного счетчика.
newfag писал(а):

Какой должна быть скорость счета? Значение регистра должно увеличиватся на единицу раз в секунду?

В зависимости от настроек и частоты тактового сигнала для часов реального времени.
Для приведенных настроек и частоты LSE генератора 32768 Гц, основной счетчик должен каждую секунду увеличиваться на 1.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-18 07:26 
Не в сети

Зарегистрирован: 2016-мар-05 21:08
Сообщения: 25
Вроде со всем разобрался, но теперь проблема в том что не могу запустить счетчик от внешнего НЧ генератора LSE. От внутреннего LSI запускается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-18 11:43 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
Сам LSE генератор запускаете? На чем экспериментируете (на отладочной плате или на собственной)? Если на отладочной, то надо подключить перемычками низкочастотный кварцевый резонатор к выводам контроллера.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-18 11:54 
Не в сети

Зарегистрирован: 2016-мар-05 21:08
Сообщения: 25
Petr писал(а):
Сам LSE генератор запускаете? На чем экспериментируете (на отладочной плате или на собственной)? Если на отладочной, то надо подключить перемычками низкочастотный кварцевый резонатор к выводам контроллера.


у меня плата от LDM.
Перемычки уже стоят где надо.
Частота LSI равно 40 кгц. Если ставлю значение делителя 0x9C40, то должно получится 1 гц. У меня через некоторое время это значение отклоняется, при сравнении с часами компьютера.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-18 12:07 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
newfag писал(а):
Частота LSI равно 40 кгц.

Частота LSI генератора неточная. В таблице 538 (страница 463) "Электрические параметры микросхем при приемке и поставке" указан диапазон 10 - 60 КГц.
Так что если требуется точность в отсчете времени, надо использовать внешний точный кварцевый резонатор (генератор) совместно с LSE.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-18 12:24 
Не в сети

Зарегистрирован: 2016-мар-05 21:08
Сообщения: 25
Petr писал(а):
newfag писал(а):
Частота LSI равно 40 кгц.

Частота LSI генератора неточная. В таблице 538 (страница 463) "Электрические параметры микросхем при приемке и поставке" указан диапазон 10 - 60 КГц.
Так что если требуется точность в отсчете времени, надо использовать внешний точный кварцевый резонатор (генератор) совместно с LSE.



Мне не нравится то что при тактировании RTC в таблице нету выбора нч генераторов. Или я чего то не понимаю?
Может выбор нч генераторов осуществляется только битами RTC SEL[1:0] регистра REG_0F?
Все же при значении RTC SEL[1:0] равным 01 ничего не происходит, а если 00 то работает.


Вложения:
2016-04-18_14-18-10.png
2016-04-18_14-18-10.png [ 46.24 КБ | Просмотров: 2667 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-18 12:35 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
newfag писал(а):
Может выбор нч генераторов осуществляется только битами RTC SEL[1:0] регистра REG_0F?

да, выбор LSI или LSE для тактирования RTC осуществляется полем RTC_SEL[1:0] в регистре BKP->REG_0F.
newfag писал(а):
Все же при значении RTC SEL[1:0] равным 01 ничего не происходит, а если 00 то работает.

Сначала надо запустить LSE (0-й бит (LSEON) регистра BKP->REG_0F), дождаться выхода LSE в рабочий режим (13 бит (LSERDY) регистра BKP->REG_0F), затем уже разрешать тактирование RTC от LSE-генератора.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-18 14:03 
Не в сети

Зарегистрирован: 2016-мар-05 21:08
Сообщения: 25
Petr писал(а):
newfag писал(а):
Может выбор нч генераторов осуществляется только битами RTC SEL[1:0] регистра REG_0F?

да, выбор LSI или LSE для тактирования RTC осуществляется полем RTC_SEL[1:0] в регистре BKP->REG_0F.
newfag писал(а):
Все же при значении RTC SEL[1:0] равным 01 ничего не происходит, а если 00 то работает.

Сначала надо запустить LSE (0-й бит (LSEON) регистра BKP->REG_0F), дождаться выхода LSE в рабочий режим (13 бит (LSERDY) регистра BKP->REG_0F), затем уже разрешать тактирование RTC от LSE-генератора.



Снял сигнал с обеих выводов генератора, сигнал очень слабо похож на синусоиду.
Или он становится похожим на синусоиду только после настройки? Я сомневаюсь в этом.


Вложения:
IMG_20160418_155741_HDR.jpg
IMG_20160418_155741_HDR.jpg [ 2.89 МБ | Просмотров: 2660 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-дек-27 17:45 
Не в сети

Зарегистрирован: 2018-дек-19 17:59
Сообщения: 4
Подскажите, пожалуйста, как выглядит программа для вывода времени на ЖКИ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-дек-28 10:20 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 230
Откуда: ПКК "Миландр"
может быть так


Вложения:
Комментарий к файлу: набросок
RTC_Clock.zip [25.19 КБ]
Скачиваний: 22

_________________
Отдел технической поддержки support@milandr.ru
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-04 20:21 
Не в сети

Зарегистрирован: 2018-дек-19 17:59
Сообщения: 4
В Keil uVision5 выдает ошибку. Можете, пожалуйста, проверить программу и исправить где нужно? программа выводить дату и время на ЖКИ
// Подключение нужных библиотек
#include <MDR32F9Qx_port.h>
#include <MDR32F9Qx_rst_clk.h>
// Подклчение файла инициализации ЖК-модуля
#include «lcd.h»
#define DELAY (T) for (i=T; i>0; i--)
unsigned int i;
char stroka [17]; // Установка размера массива для строки
// Процедура инициализации батарейного домена
void U_Alarm_Init(void)
{
// Разрешение тактирования батарейного домена и порта PORTE
RST_CLK_PCLKcmd (RST_CLK_PCLK_BKP | RST_CLK_PCLK_PORTE, ENABLE);
// Инициализация линий PE6 и PE7, к которым и подключен кварцевый резонатор
PORT_StructInit (&PortInitStructure);
PortInitStructure.PORT_Pin = PORT_Pin_6 | PORT_Pin_7;
PortInitStructure.PORT_MODE = PORT_MODE_ANALOG;
PORT_Init (MDR_PORTE, &PortInitStructure);
// Включение генератора LSE и дожидание его «разгона»
RST_CLK_LSEconfig (RST_CLK_LSE_ON);
while (RST_CLK_LSEstatus() != SUCCESS);
// Выбор LSE в качестве источника тактирования RTC, дождавшись обновления регистров RTC
BKP_RTC_WaitForUpdate ();
BKP_RTCclkSource (BKP_RTC_LSEclk);
// Коэффициент деления для делителя RTC_DIV
BKP_RTC_WaitForUpdate ();
BKP_RTC_WaitForUpdate ();
BKP_RTC_SetPrescaler (RTC_PRESCALER);
// Константа равна 32768, поскольку LSE с нашей отладочной платой вырабатывает
// частоту 4096 Гц, а нам надо получить 8 МГц.
#define RTC_PRESCALER 4096
// Корректировка точности хода часов
BKP_RTC_WaitForUpdate ();
BKP_RTC_Calibration (RTC_CALIBRATION);
// Разрешить работу RTC
BKP_RTC_WaitForUpdate ();
BKP_RTC_Enable (ENABLE);
//Разрешаем прерывания от батарейного домена
NVIC_SetPriority (BACKUP_IRQn, 0x02);
NVIC_EnableIRQ (BACKUP_IRQn);
}
// Объявление главной функции
int main ()
{
// Процедура инициализации батарейного домена
U_Alarm_Init();
// Задаем начальное время
void U_RTC_Set_Start_DateTime (void)
{
struct tm timeinfo;
time_t TimeStamp;
// Установить начальные дату и время
// 30.11.2018 09:55:00
timeinfo.tm_sec = 0; // Секунды (0..60)
timeinfo.tm_min = 55; // Минуты (0..59)
timeinfo.tm_hour = 9; // Часы (0..23)
timeinfo.tm_mday = 30; // День месяца (1..31)
timeinfo.tm_mon = 11 - 1; // Полных месяцев с начала года
// (0 - январь, 11 - декабрь)
timeinfo.tm_year = 2018 - 1900; // Полных лет с 1900 года
// Преобразовать структуру даты и времени в отметку времени
TimeStamp = mktime (&timeinfo);
BKP_RTC_WaitForUpdate ();
// Задать дату и время
U_RTC_Set_DateTime_Stamp (TimeStamp);
}
//Вывод текущей даты и времени на ЖКИ
__task void U_RTC_Task_Show_Function (void)
{
time_t TimeStamp;
// Главный цикл
while(1)
{
// Получаем текущие дату и время в формате: dd.mm.yyyy hh:uu:ss
BKP_RTC_WaitForUpdate ();
TimeStamp = U_RTC_Get_DateTime_String (current_date,
current_time);
// Выводим на ЖКИ текущую дату
U_MLT_Put_String (current_date, 4);
// Выводим на ЖКИ текущее время
U_MLT_Put_String (current_time, 5);
// Выводим на ЖКИ отметку времени
sprintf (message, "%u", TimeStamp);
U_MLT_Put_String (message, 6);
os_dly_wait(1000);
}
}
// Формирование строк с датой и временем
U_RTC_Get_DateTime_String():
time_t U_RTC_Get_DateTime_String (char* dateString, char* timeString)
{
struct tm *timeinfo;
time_t TimeStamp;
BKP_RTC_WaitForUpdate ();
TimeStamp = BKP_RTC_GetCounter ();
timeinfo = localtime (&TimeStamp);
strftime (timeString, 16, "%H:%M:%S ", timeinfo);
strftime (dateString, 16, "%d.%m.%Y", timeinfo);
return TimeStamp;
}
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-05 00:46 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 39
Хоть бы написали, что за ошибку выдаёт Кейл. Скопировать из лога и вставить в текст сообщения нетрудно.

Я хоть и не компилятор, но вижу, что вы определяете свои функции (например void U_RTC_Set_Start_DateTime (void) ) внутри других функций - int main (). Язык Си не разрешает такого. Выносите определения функций за пределы всех функций. Функции в Си должны быть глобальными. Объявляйте их до main () - прототип, а определяйте после - реализация. Внутри других функций, в т.ч. и main (), только вызывайте (непосредственно или через указатель на них). Такой порядок работы с функциями общепринятый и правильный.

И разберитесь с макросом __task - где он определен и что значит. Подозреваю, что его там быть не должно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-05 20:07 
Не в сети

Зарегистрирован: 2018-дек-19 17:59
Сообщения: 4
Вот что выдает


Вложения:
nyeci0nI7aA.jpg
nyeci0nI7aA.jpg [ 189.69 КБ | Просмотров: 265 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-06 09:42 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 39
Lina21 писал(а):
Вот что выдает

Не скриншот нужен. На нем не видно описание ошибки. Скопируйте весь текст из окна Build Output и вставьте его в сообщение в обрамлени тегов Code или Spoiler (или код в спойлере).
Скорее всего у вас ошибка линковки (не добавили в проект файл lcd.c), или компиляции - компилятор не находит файл lcd.h.

UPD
Плюс к сказанному ранее про объявление и определение функций:
1. Отсутствует строка #include <MDR32F9Qx_bkp.h>
2. PORT_StructInit (&PortInitStructure); - не объявлена структура PortInitStructure
3. BKP_RTC_SetPrescaler (RTC_PRESCALER); - макрос RTC_PRESCALER должен быть объявлен ДО, а не ПОСЛЕ использования
4. BKP_RTC_Calibration (RTC_CALIBRATION); - не объявлено имя (макрос) RTC_CALIBRATION
5. timeinfo = localtime (&TimeStamp); - не объявлена функция localtime
6. strftime (timeString, 16, "%H:%M:%S ", timeinfo); - не объявлена функция strftime
7. TimeStamp = mktime (&timeinfo); - не объявлена функция mktime
8. os_dly_wait(1000); - не объявлена функция os_dly_wait
9. Тип time_t не объявлен
10. Тип структуры struct tm не определён
11. TimeStamp = U_RTC_Get_DateTime_String (current_date,current_time); - не объявлены current_date и current_time

Исправляйте.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB