STM32L часы реального времени

Кто любит RISC в жизни, заходим, не стесняемся.
Up2805
Встал на лапы
Сообщения: 148
Зарегистрирован: Сб июн 04, 2022 05:21:07

Re: STM32L часы реального времени

Сообщение Up2805 »

Несъемные батарейки рассчитаны примерно на 10-12 лет, а это как раз срок службы современной техники. Например электронные бытовые газовые счетчики - с распаянной несъемной батарейкой на 12 лет. После этого счетчик выкидывается и ставится новый.
Так же встречал микросхемы памяти NVRAM со встроенной батарейкой на 10 лет https://www.compel.ru/lib/53938?ysclid= ... g717752229

Микросхемы RTC есть как с отдельным выводом Vbat, так и без него. Вместо батарейки может стоять несъемный Ni-Cd аккум с "капельной" подзарядкой через микросхему RTC или ионистор.
Реклама
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Re: STM32L часы реального времени

Сообщение TEPEM »

На просторах интернета нашел ввроде доступным языком описанную реализацию этих самых волшебных часов.
Спойлер

Код: Выделить всё

typedef struct sRTC_struct{
		 unsigned year : 6; 
		 unsigned month : 4;
		 unsigned week : 3; 
		 unsigned date : 5;
		 unsigned hour : 5;
		 unsigned minute :6;
		 unsigned sec : 6;
}RTC_struct;
volatile RTC_struct rtc;
void RTC_Init(RTC_struct volatile *value)
{
	RCC->CSR |= RCC_CSR_LSION;
	while ( !(RCC->CSR & RCC_CSR_LSIRDY) ){}
	RCC->APB1ENR |= RCC_APB1ENR_PWREN;
	PWR->CR |= PWR_CR_DBP;
	RCC->BDCR |= RCC_BDCR_RTCSEL_1;
	RCC->BDCR |= RCC_BDCR_RTCEN;
	RTC_Update(value);	
}
void RTC_Update(RTC_struct volatile *value)
{
	uint32_t TR, DR;
	RTC->WPR = 0xCA;
	RTC->WPR = 0x53;
	RTC->ISR |= RTC_ISR_INIT;
	while( !(RTC->ISR & RTC_ISR_INITF) ){};   
	RTC->PRER = (uint32_t)(99 << 16);
	RTC->PRER |= (uint32_t)399;
	TR = ( ((uint32_t)(value->hour/10*16 + value->hour%10) << 16) | ((uint32_t)(value->minute/10*16 + value->minute%10) << 8) | ((uint32_t)value->sec/10*16 + value->sec%10) );
	RTC->TR = TR;
	DR = (uint32_t)(value->year/10*16 + value->year%10) << 16  | (uint32_t)(value->week/10*16 + value->week%10) << 13 | (uint32_t)(value->month/10*16 + value->month%10) << 8 | (uint32_t)(value->date/10*16 + value->date%10);
	RTC->DR = DR;
	RTC->ISR &= ~(RTC_ISR_INIT);
	RTC->WPR = 0xFF;
}
И вроде все хорошо, но есть один *** нюанс. Я не могу вызвать эту самую инициализацию.
Вот как я себе вижу это
в майне -

Код: Выделить всё

volatile RTC_struct rtn;
 rtn.year = 23;// RTC_Init(rtc);
    rtn.month = 4;
    rtn.week = 3; 
    rtn.date = 17;
    rtn.hour = 15;
    rtn.minute = 45;
    rtn.sec = 30;
    RTC_Init(rtn.date);
От балды забил, для пробы. Ошибка синтаксиса вылазит Error[Pe167]: argument of type "unsigned int" is incompatible with parameter of type "RTC_struct volatile *" C:\Users\Pagan\Desktop\F411\main.c 55
Я пробовал через указатель, пробовал отдельно составляющие структуры закидывать. Может кто то подсказать ???
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32L часы реального времени

Сообщение VladislavS »

RTC_Init(&rtn);
Ответить

Вернуться в «ARM»