Easyelectronics.ru

Электроника для всех
Текущее время: 23 апр 2019, 23:16

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 04 фев 2016, 14:00 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
Здравствуйте, изучаю армовский микроконтроллер на плате Nucleo STM32-L053R8.
В частности хочу вывести время на экран дисплея BL12864GERNHn$ (128х64, контроллер ssd1303)
с помощью RTC встроенного в МК.

Конечно в идеале на экран время нужно выводить наверное по прерыванию,
но я в учебных целях хотел его вывести по опросу в цикле.

Пользуюсь средой IAR, а также стандартной HAL библиотекой.

Код программы main:

Show


Проблема заключается в том что когда работаю в режиме отладки,
ставлю точку останова в строке (внутри цикла while)

Код:
HAL_RTC_GetTime(&hrtc, &aMyTime, FORMAT_BCD);


на экране дисплея все обновляется, секунды тикают, но если я
запускаю без режима отладки, то он перестает обновляться, т.е.
выводить первоначальное значение (в частности "00:00:00")
и больше не обновляется.

Подскажите пожалуйста, каким образом можно обновлять на экране "часы"
без использования режима отладки ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 04 фев 2016, 15:31 
Заглядывает иногда

Зарегистрирован: 17 апр 2013, 21:00
Сообщения: 114
foxis писал(а):
Подскажите пожалуйста, каким образом можно обновлять на экране "часы"
без использования режима отладки ?

А добавьте-ка в бесконечный цикл майн паузу миллисекунд так в 300, так, для начала.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 04 фев 2016, 17:45 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
embedd,

попробовал, к сожалению, не помогло.

Выложил, только тело цикла (все остальное осталось без изменений)

Код:
while (1)
  {
  /* USER CODE END WHILE */
  HAL_RTC_GetTime(&hrtc, &aMyTime, FORMAT_BCD);

  sprintf((char*)str,"%.2d:%.2d:%.2d",( (aMyTime.Hours & 0x0F) + ((aMyTime.Hours & 0xF0)>>4)*10 ), ( (aMyTime.Minutes & 0x0F) + ((aMyTime.Minutes & 0xF0)>>4)*10 ), ( (aMyTime.Seconds & 0x0F) + ((aMyTime.Seconds & 0xF0)>>4)*10 ));

PrintString(str,0,0);
HAL_Delay(300);

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */


Вместо 300 мс пробовал 900, 1500 - безрезультатно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 04 фев 2016, 18:08 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
Пробовал еще такой эксперимент провести в цикле поочередно выводил
на дисплей слова "Hello" и "World" через каждые 2 с.
В этом случае все нормально работает, поочередно выводятся "Hello" и "World"

Код программы (только тело цикла):
Show


Видимо проблема в том что при работе в цикле без отладки
в функции HAL_RTC_GetTime(&hrtc, &aMyTime, FORMAT_BCD); поля
aMyTime.Hours, aMyTime.Minutes, aMyTime.Seconds не обновляются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 04 фев 2016, 18:26 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2160
Попробуйте объявить переменную-структуру, в которой время храните, c макросом volatile
Может компилятор "оптимизирует". Странно всё это.
Тактирование на часы точно включили?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 04 фев 2016, 18:48 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
Pingvin писал(а):
Попробуйте объявить переменную-структуру, в которой время храните, c макросом volatile
Может компилятор "оптимизирует". Странно всё это.
Тактирование на часы точно включили?


Pingvin,
попробовал как вы говорите, переменную str объявил
как volatile unsigned char, не помогло.

Пробовал также полностью выключить оптимизатор в настройках IAR
тоже не помогло.

Код программы:
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 04 фев 2016, 19:19 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2160
Бог с Вами!
Причем здесь строка?!
В какой структуре время то храните?

В этой?
Код:
aMyTime


Вот перед ней volatile поставьте В ОБЪЯВЛЕНИИ переменной.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 04 фев 2016, 20:02 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Да возьмите вы уже время прямо из регистров RTC (для простоты - из одного регистра, секундного), чтобы убедиться, что там всё обновляется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 04 фев 2016, 20:40 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2160
Наговнокодил, но все работает.

Код:
#define JD0 2451911 // дней до 01 янв 2001 ПН
typedef struct{
uint16_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t minute;
uint8_t second;
} ftime_t;





Код:

void BKPinit()
{
    /* Enable PWR and BKP clock */
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_BKP, ENABLE);
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_PWR, ENABLE);
    PWR_BackupAccessCmd(ENABLE);

}


void RTC_Init(){

        volatile  int i;
         i++;
         i=90;
/*
         NVIC_InitTypeDef NVIC_InitStructure;

            // Configure one bit for preemption priority
            NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

            // Enable the RTC Interrupt
            NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
            NVIC_Init(&NVIC_InitStructure);
*/



    RCC_LSEConfig(RCC_LSE_ON);

      while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){

      }

      RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
      RCC_RTCCLKCmd(ENABLE);

      RTC_WaitForSynchro();
      RTC_WaitForLastTask();
      RTC_ITConfig(RTC_IT_SEC, ENABLE);
      RTC_WaitForLastTask();
      RTC_SetPrescaler(32767); // RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
      RTC_WaitForLastTask();


}
/*

*/

void RTC_IRQHandler(void)
{
   if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
   {
      RTC_ClearITPendingBit(RTC_IT_SEC);
      RTC_WaitForLastTask();
   }

//   CounterToFtime ((uint32_t)RTC_GetCounter(),&date);
//   USART1_SendStr(int_to_str(date.second,2));
//   USART1_SendStr("\n\r");
//   lcd_time_update(date.hour, date.minute, date.second);

   //times=RTC_GetCounter();
}


// функция преобразования григорианской даты и времени в значение счетчика
uint32_t FtimeToCounter(ftime_t * ftime)
{
uint8_t a;
uint16_t y;
uint8_t m;
uint32_t JDN;

// Вычисление необходимых коэффициентов
a=(14-ftime->month)/12;
y=ftime->year+4800-a;
m=ftime->month+(12*a)-3;
// Вычисляем значение текущего Юлианского дня
JDN=ftime->day;
JDN+=(153*m+2)/5;
JDN+=365*y;
JDN+=y/4;
JDN+=-y/100;
JDN+=y/400;
JDN+=-32045;
JDN+=-JD0; // так как счетчик у нас нерезиновый, уберем дни которые прошли до 01 янв 2001
JDN*=86400;     // переводим дни в секунды
JDN+=(ftime->hour*3600); // и дополняем его скундами текущего дня
JDN+=(ftime->minute*60);
JDN+=(ftime->second);
// итого имеем количество секунд с 00-00 01 янв 2001
return JDN;
}

// функция преобразования значение счетчика в григорианскую дату и время
void CounterToFtime(uint32_t counter,ftime_t * ftime)
{
uint32_t ace;
uint8_t b;
uint8_t d;
uint8_t m;

ace=(counter/86400)+32044+JD0;
b=(4*ace+3)/146097; // может ли произойти потеря точности из-за переполнения 4*ace ??
ace=ace-((146097*b)/4);
d=(4*ace+3)/1461;
ace=ace-((1461*d)/4);
m=(5*ace+2)/153;
ftime->day=ace-((153*m+2)/5)+1;
ftime->month=m+3-(12*(m/10));
ftime->year=100*b+d-4800+(m/10);
ftime->hour=(counter/3600)%24;
ftime->minute=(counter/60)%60;
ftime->second=(counter%60);
}


Код:
int main(void)
{
   //int iii;
   BKPinit();
   RTC_Init();
...



Код:

CounterToFtime ((uint32_t)RTC_GetCounter(),&date);
              lcd_time_update();




Код:
void lcd_time_update(void){


#define symbolWidth 5
#define   symbolHeight 8
#define x_pos 16
   //(84-5*symbolWidth+1)
#define y_pos 41
   //(16+5)

   uint8_t tens,units;
   fillRect(x_pos,y_pos,5*symbolWidth-1,symbolHeight,0);
   tens = date.hour/10;
   units = date.hour - tens*10;

   drawSmallDigit(x_pos,y_pos,tens,1);
   drawSmallDigit(x_pos+symbolWidth,y_pos,units,1);
   drawSmallDigit(x_pos+symbolWidth*2,y_pos,11,1);//dot

   tens = date.minute/10;
   units = date.minute - tens*10;

   drawSmallDigit(x_pos+symbolWidth*3,y_pos,tens,1);
   drawSmallDigit(x_pos+symbolWidth*4,y_pos,units,1);
/*   drawSmallDigit(x_pos+symbolWidth*5,y_pos,11,1);//dot

   tens = date.second/10;
   units = date.second - tens*10;

   drawSmallDigit(x_pos+symbolWidth*6,y_pos,tens,1);
   drawSmallDigit(x_pos+symbolWidth*7,y_pos,units,1);
*/
//   if (!screen_auto_refresh)lcd8544_dma_refresh();

}



Последний раз редактировалось Pingvin 04 фев 2016, 20:48, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 04 фев 2016, 20:44 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2160
http://microtechnics.ru/stm32f4-chasy-r ... emeni-rtc/
https://argrento.org/2011/09/11/bkp/
viewtopic.php?f=35&t=11141


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 05 фев 2016, 13:00 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
Pingvin писал(а):
Бог с Вами!
Причем здесь строка?!
В какой структуре время то храните?

В этой?
Код:
aMyTime


Вот перед ней volatile поставьте В ОБЪЯВЛЕНИИ переменной.


Pingvin, пробовал ставить volatile при объявлении
структуры aMyTime - не помогло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 05 фев 2016, 13:12 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
AlexPM писал(а):
Да возьмите вы уже время прямо из регистров RTC (для простоты - из одного регистра, секундного), чтобы убедиться, что там всё обновляется.


Пробовал использовать непосредственно регистры для секунд, не помогло,
также время не обновляется.

Код цикла
Код:
while (1)
  {
  /* USER CODE END WHILE */
  HAL_RTC_GetTime(&hrtc, &aMyTime, FORMAT_BCD);
  sprintf((char*)str,"%.2d:%.2d:%.2d",( (aMyTime.Hours & 0x0F) + ((aMyTime.Hours & 0xF0)>>4)*10 )  , ( (aMyTime.Minutes & 0x0F) + ((aMyTime.Minutes & 0xF0)>>4)*10 ),( RTC->TR & 0x0000000F + ((RTC->TR & 0x000000F0)>>4)*10 ) );


  PrintString(str,0,0);

HAL_Delay(300);

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 05 фев 2016, 13:17 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
Pingvin писал(а):
http://microtechnics.ru/stm32f4-chasy-realnogo-vremeni-rtc/
https://argrento.org/2011/09/11/bkp/
viewtopic.php?f=35&t=11141


Спасибо за ссылки, Pingvin, но они не особо актуальны для меня.

В моем случае часы работают, но выуживать из них информацию можно только
в режиме отладки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 05 фев 2016, 17:11 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2160
Дайте посмотреть, что там в функции HAL_RTC_GetTime(&hrtc, &aMyTime, FORMAT_BCD) написано.


Проект под какой контроллер?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 05 фев 2016, 18:01 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
Pingvin писал(а):
Дайте посмотреть, что там в функции HAL_RTC_GetTime(&hrtc, &aMyTime, FORMAT_BCD) написано.


Проект под какой контроллер?


Pingvin,

1) Проект написан для МК STM32L053R8 (отладочная плата Nucleo-L053R8)

2) Функция HAL_RTC_GetTime(&hrtc, &aMyTime, FORMAT_BCD):

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 05 фев 2016, 18:42 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2160
А это что значит?
Цитата:
You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values in the higher-order calendar shadow registers to ensure consistency between the time and date values. Reading RTC current time locks the values in calendar shadow registers until Current date is read to ensure consistency between the time and date values.



Тут про какую то блокировку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 05 фев 2016, 20:44 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5362
Читать надо не только время но и дату, господа любители халявы. Кстати в RM есть и примеры кода, правда не на г**кале ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 RTC Вывод на дисплей времени
СообщениеДобавлено: 06 фев 2016, 13:14 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
Ура, все заработало,дисплей начал обновлять время. :)
Спасибо большое, Pingvin, и, dosikus_2, за помощь.

На фразу "You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values in the higher-order calendar shadow registers to ensure consistency between the time and date values. Reading RTC current time locks the values in calendar shadow registers until Current date is read to ensure consistency between the time and date values."
в свое время обратил внимание,но вот полностью перевести и осознать поленился, т.к. заметив первую часть
"You must call HAL_RTC_GetDate() " посчитал что раз дата мне не нужна то и дочитывать не обязательно (тут же про дату говориться).

Вывод: надо быть внимательнее, и стараться дочитывать информацию до конца по крайней мере тех функций,
которые используются в программе.

Еще раз спасибо всем за помощь. :)

Рабочий код программы:
Show


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB