Easyelectronics.ru

Электроника для всех
Текущее время: 19 окт 2019, 05:35

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



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

Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 57 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 02:06 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
Доброго дня.

На досуге накалякал платку для фитолампочки с блутузом, и куртизанками для освещения всяких растений по расписанию с использованием RTC. Батарейка подключена, и на ней 3.2В.

Всё работает, но есть один замечательный баг:

при отключении основного питания cntl, и cnth улетают за минуты на сотни тысяч. Т.е. набегают месяцы. При возвращении основного питания - всё ок.
Смотрел генерацию на 32к кварце - всё как в аптеке - генерация не прекращается никогда (что очевидно).

Уверен, что есть этому вменяемое объяснение. Знающие люди, помогите?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 11:53 
Старожил
Аватара пользователя

Зарегистрирован: 07 июн 2010, 21:00
Сообщения: 596
Тоже столкнулся с проблемами RTC. Не получается откалибровать. Частота не меняется предделителем на f103, Как бы не менял RTC->PRL. За сутки на 14 сек ушло.. Сейчас частота на выходе ножки /64 512,119Hz*64=32775,6Hz. Заменил предделитель но не помогло

_________________
Надежность оборудования обратно пропорциональна числу и положению лиц, за ним наблюдающих


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 13:15 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
Откуда тактируется RTC, какой код, разводка платы. Откуда ж нам знать как оно все собрано и сконфигурено.

Экстрасенсы на шашлыках.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 13:23 
Старожил
Аватара пользователя

Зарегистрирован: 07 июн 2010, 21:00
Сообщения: 596
Show Сейчас так

Show

Кондеры не припаены c12 и c11
http://www.farnell.com/datasheets/14218.pdf
Crystal MS2V-T1S 7pF

_________________
Надежность оборудования обратно пропорциональна числу и положению лиц, за ним наблюдающих


Последний раз редактировалось AlexArt 13 апр 2019, 19:30, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 15:01 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
Не уверен, что схемотехника поможет.

Вот весь проект: https://easyeda.com/kalashnikov.alexander.b/fitolamp

Время за минуту без основного питания на одной батарейке уходит вперед на неделю. Понимаете?
При запитаном ядре MCU - всё идёт тютя в тютю.

При этом на кварце 32768 всё время.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 16:20 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 634
Откуда: GMT+6
st41ker
Может Вы при возобновлении питания MCU перезаписываете регистры RTC или не делаете синхронизацию?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 16:40 
Старожил
Аватара пользователя

Зарегистрирован: 07 июн 2010, 21:00
Сообщения: 596
я заметил, что у меня RTC->PRLL = 0x8000 хотя я мог например установить 0x8005

_________________
Надежность оборудования обратно пропорциональна числу и положению лиц, за ним наблюдающих


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 17:02 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
Kelvin писал(а):
st41ker
Может Вы при возобновлении питания MCU перезаписываете регистры RTC или не делаете синхронизацию?


HAL её делает.

Я делаю отето:

/**
******************************************************************************
* @file main.c
* @author Ac6
* @version V1.0
* @date 01-December-2013
* @brief Default main function.
******************************************************************************
*/

#include "stm32f1xx.h"
#include "main.h"
#include "rtc.h"

TIM_HandleTypeDef s_Timer1 = { .Instance = TIM1 };
TIM_HandleTypeDef s_Timer3 = { .Instance = TIM3 };

I2C_HandleTypeDef s_I2C1 = { .Instance = I2C1 };
RTC_HandleTypeDef hrtc = { .Instance = RTC };
TIM_OC_InitTypeDef sConfigOC_T1C1 = { 0 };
TIM_OC_InitTypeDef sConfigOC_T1C2 = { 0 };
TIM_OC_InitTypeDef sConfigOC_T1C3 = { 0 };
TIM_OC_InitTypeDef sConfigOC_T1C4 = { 0 };
TIM_OC_InitTypeDef sConfigOC_T3C1 = { 0 };
TIM_OC_InitTypeDef sConfigOC_T3C3 = { 0 };

/**
* f_States: state flags.
* bit 0: 1 - Lamp was shut down permanently
* bit 1: 1 - Slow dimming required
* bit 5: 1 - Now are working hours
**/
volatile uint8_t f_States;

volatile uint32_t b_PulseWidth = PWM_PERIOD;

void StartDimTo(uint32_t width) {
if (TIM1->CCR1 != width) {

f_States |= 1UL << 1;
b_PulseWidth = width;
}
}

uint8_t IsWorkHoursNow() {

_type_datetime dt = { 0 };

rtc_get_dt(&dt);
return dt.hour >= START_WORKHOUR && dt.hour < END_WORKHOUR;

}

void InitializeInterrupts() {


HAL_NVIC_SetPriority(RTC_IRQn, 1, 4);
HAL_NVIC_EnableIRQ(RTC_IRQn);

__HAL_RCC_PWR_CLK_ENABLE()
;
__HAL_RCC_BKP_CLK_ENABLE()
;
__HAL_RCC_RTC_ENABLE()
;

}

void InitializeI2C() {

/* I2C configuration */
s_I2C1.Init.DutyCycle = I2C_DUTYCYCLE_2;
s_I2C1.Init.OwnAddress1 = I2C_OWN_ADDR;
s_I2C1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
s_I2C1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
s_I2C1.Init.ClockSpeed = 400000;
s_I2C1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

HAL_I2C_Init(&s_I2C1);
}

uint8_t InitializeLightSersor() {

uint8_t result = 0;
uint8_t command = 0x01; //Power On command

if (s_I2C1.State == HAL_I2C_STATE_READY) {
if (HAL_I2C_Master_Transmit(&s_I2C1, (LIGHT_SENSOR_I2C_ADDR << 1),
&command, 1, 10))
result = HAL_I2C_GetError(&s_I2C1);
}

return result;
}

uint16_t GetLux() {

uint8_t command = 0x11; //Continuously L-Resolution Mode Command
uint16_t readings = 65535;
uint16_t readings_swaped = 65535;

if (s_I2C1.State == HAL_I2C_STATE_READY) {

if (!HAL_I2C_Master_Transmit(&s_I2C1, (LIGHT_SENSOR_I2C_ADDR << 1),
&command, 1, 10)) {
HAL_Delay(120);
if (!HAL_I2C_Master_Receive(&s_I2C1, (LIGHT_SENSOR_I2C_ADDR << 1),
(uint8_t *) &readings, 2, 10)) {
readings_swaped = (readings << 8) | (readings >> 8);
readings_swaped /= 1.2;
}
}
}

return readings_swaped;

}

void InitializeGPIO() {

GPIO_InitTypeDef GPIOA_InitStruct = { 0 };
GPIO_InitTypeDef GPIOB_InitStruct = { 0 };

/* All GPIO configured as analog inputs AN4899 */
GPIOA_InitStruct.Pin = GPIO_PIN_All;
GPIOA_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIOA_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOA, &GPIOA_InitStruct);
HAL_GPIO_Init(GPIOB, &GPIOA_InitStruct);
HAL_GPIO_Init(GPIOC, &GPIOA_InitStruct);

/* TIM[13] CHANNEL pins*/
GPIOA_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10
| GPIO_PIN_11;
GPIOA_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIOA_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOA, &GPIOA_InitStruct);

GPIOB_InitStruct.Pin = GPIO_PIN_0;
GPIOB_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIOB_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOB, &GPIOB_InitStruct);

/* Configure I2C_EE pins: SCL and SDA */
GPIOB_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIOB_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIOB_InitStruct.Mode = GPIO_MODE_AF_OD;
HAL_GPIO_Init(GPIOB, &GPIOB_InitStruct);

/* Configure movement sensor input pin */
GPIOB_InitStruct.Pin = MOVEMENT_PIN;
GPIOB_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIOB_InitStruct.Mode = GPIO_MODE_INPUT;
GPIOB_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIOB_InitStruct);

/* Configure touch sensor input pin */
GPIOA_InitStruct.Pin = TOUCH_PIN;
GPIOA_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIOA_InitStruct.Mode = GPIO_MODE_INPUT;
GPIOA_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA, &GPIOA_InitStruct);

}

void InitializePWMs() {

s_Timer1.Init.Prescaler = 0;
s_Timer1.Init.CounterMode = TIM_COUNTERMODE_UP;
s_Timer1.Init.Period = PWM_PERIOD - 1;
s_Timer1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
s_Timer1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_PWM_Init(&s_Timer1);

s_Timer3.Init.Prescaler = 0;
s_Timer3.Init.CounterMode = TIM_COUNTERMODE_UP;
s_Timer3.Init.Period = PWM_PERIOD - 1;
s_Timer3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
s_Timer3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_PWM_Init(&s_Timer3);

sConfigOC_T1C1.OCMode = TIM_OCMODE_PWM1;
sConfigOC_T1C1.Pulse = PWM_PERIOD;
sConfigOC_T1C1.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC_T1C1.OCFastMode = TIM_OCFAST_DISABLE;

sConfigOC_T1C2.OCMode = TIM_OCMODE_PWM1;
sConfigOC_T1C2.Pulse = PWM_PERIOD;
sConfigOC_T1C2.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC_T1C2.OCFastMode = TIM_OCFAST_DISABLE;

sConfigOC_T1C3.OCMode = TIM_OCMODE_PWM1;
sConfigOC_T1C3.Pulse = PWM_PERIOD;
sConfigOC_T1C3.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC_T1C3.OCFastMode = TIM_OCFAST_DISABLE;

sConfigOC_T1C4.OCMode = TIM_OCMODE_PWM1;
sConfigOC_T1C4.Pulse = PWM_PERIOD;
sConfigOC_T1C4.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC_T1C4.OCFastMode = TIM_OCFAST_DISABLE;

sConfigOC_T3C1.OCMode = TIM_OCMODE_PWM1;
sConfigOC_T3C1.Pulse = PWM_PERIOD;
sConfigOC_T3C1.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC_T3C1.OCFastMode = TIM_OCFAST_DISABLE;

sConfigOC_T3C3.OCMode = TIM_OCMODE_PWM1;
sConfigOC_T3C3.Pulse = b_PulseWidth;
sConfigOC_T3C3.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC_T3C3.OCFastMode = TIM_OCFAST_DISABLE;

HAL_TIM_PWM_ConfigChannel(&s_Timer1, &sConfigOC_T1C1, TIM_CHANNEL_1);
HAL_TIM_PWM_ConfigChannel(&s_Timer1, &sConfigOC_T1C2, TIM_CHANNEL_2);
HAL_TIM_PWM_ConfigChannel(&s_Timer1, &sConfigOC_T1C3, TIM_CHANNEL_3);
HAL_TIM_PWM_ConfigChannel(&s_Timer1, &sConfigOC_T1C4, TIM_CHANNEL_4);
HAL_TIM_PWM_ConfigChannel(&s_Timer3, &sConfigOC_T3C1, TIM_CHANNEL_1);
HAL_TIM_PWM_ConfigChannel(&s_Timer3, &sConfigOC_T3C3, TIM_CHANNEL_3);

}

void SetPWMPulseWidth(uint32_t width) {

__HAL_TIM_SET_COMPARE(&s_Timer1, TIM_CHANNEL_3, width);
__HAL_TIM_SET_COMPARE(&s_Timer1, TIM_CHANNEL_4, width);
__HAL_TIM_SET_COMPARE(&s_Timer3, TIM_CHANNEL_1, width);
__HAL_TIM_SET_COMPARE(&s_Timer3, TIM_CHANNEL_3, width);
__HAL_TIM_SET_COMPARE(&s_Timer1, TIM_CHANNEL_1, width);
__HAL_TIM_SET_COMPARE(&s_Timer1, TIM_CHANNEL_2, width);

}

void SystemClock_Config(void) {

RCC_ClkInitTypeDef clkinitstruct = { 0 };
RCC_OscInitTypeDef oscinitstruct = { 0 };
RCC_PeriphCLKInitTypeDef rtcinitstruct = { 0 };
/* Configure PLLs------------------------------------------------------*/
/* Enable HSE Oscillator and activate PLL with HSE as source */
oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_HSE
| RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI;
oscinitstruct.HSEState = RCC_HSE_ON;
oscinitstruct.LSEState = RCC_LSE_ON;
oscinitstruct.LSIState = RCC_LSI_OFF;
oscinitstruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
oscinitstruct.PLL.PLLState = RCC_PLL_ON;
oscinitstruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
oscinitstruct.PLL.PLLMUL = RCC_PLL_MUL9; //8Mhz crystal * 9 = 72Mhz HSE freq

if (HAL_RCC_OscConfig(&oscinitstruct) != HAL_OK) { /* Initialization Error */
while (1)
;
}
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks
dividers */
clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;
clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2; //PCLK1 must be 36Mhz max, so HSE (72Mhz) should be divided by 2

if (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2) != HAL_OK) { /* Initialization Error */
while (1)
;
}

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);


__HAL_RCC_GPIOA_CLK_ENABLE()
;
__HAL_RCC_GPIOB_CLK_ENABLE()
;
__HAL_RCC_TIM1_CLK_ENABLE()
;
__HAL_RCC_TIM3_CLK_ENABLE()
;
__HAL_RCC_I2C1_CLK_ENABLE()
;

}

void RTC_Init(void) {

__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE)
;

hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
HAL_RTC_Init(&hrtc);

HAL_RTCEx_SetSecond_IT(&hrtc);

}

int main(void) {

HAL_Init();

SystemClock_Config();

InitializeGPIO();
InitializePWMs();
InitializeI2C();
InitializeLightSersor();
RTC_Init();
InitializeInterrupts();

HAL_TIM_PWM_Start(&s_Timer1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&s_Timer1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&s_Timer1, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&s_Timer1, TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&s_Timer3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&s_Timer3, TIM_CHANNEL_3);


for (;;) {

};
}

Есть варик, что проблема в питании. Воспроизвести проблему при использовании программатора (питать от него) не получилось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 17:05 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
А вот пробовать снимать счёт с кастомного output не пробовал.
Может таки качнуть часами ногу тампера, и глянуть ослом что там происходит?

Может делители уехали из-за ХЗ чего.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 17:42 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3999
Откуда: КЧР, поселок Нижний Архыз
Вот подозревал сразу, что ТС вместо того, чтобы нормальный код писать, калокубом балуется.
Так оно и вышло...

ТС, ну напиши ты MWE на нормальном CMSIS, чтобы там ни грамма этой калокубовской дряни не было, да и проверь: будет ли RTC так же тупить..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 18:07 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 634
Откуда: GMT+6
st41ker
А для тех, у кого нету куба, что происходит в
Код:
HAL_RTC_Init(&hrtc);
HAL_RTCEx_SetSecond_IT(&hrtc);
?

И пользуйтесь пожалуйста
Код:
[Spoiler=][code] код складывать здесь! [/code][/Spoiler]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 18:34 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 634
Откуда: GMT+6
AlexArt
AlexArt писал(а):
Как бы не менял RTC->PRL.
AlexArt писал(а):
Код:
  //если часы выключены - инициализировать их
  if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN){
    RTC->PRLL  =  0x7FFF;
  }

Может в этом дело?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 18:36 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
HAL врет с настройками даты, проверено. Тут Эдди прав, лучше напрямую в регистры писать.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 18:54 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
Eddy_Em писал(а):
Вот подозревал сразу, что ТС вместо того, чтобы нормальный код писать, калокубом балуется.
Так оно и вышло...

ТС, ну напиши ты MWE на нормальном CMSIS, чтобы там ни грамма этой калокубовской дряни не было, да и проверь: будет ли RTC так же тупить..


Охохохохо. Калокуб.

В Эклипсе с AC6+GCC, etc. работаю, ибо в нём для x86 педалю. Руками пишу. А HAL - рекомендации ST, я первый раз что-то на этом MCU делаю, вот и делаю так, как говорит вендор.
Так что тихонько тут.

Ниже то, что аналогично работает в чистом (читай main, и всё) проекте.

Код:
//------------------------------------------------------------ Инициализация RTC
uint8_t rtc_init(void) {
   uint8_t result = 0;
   RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN; //разрешить тактирование модулей управления питанием и управлением резервной областью
   PWR->CR |= PWR_CR_DBP;         //разрешить доступ к области резервных данных
   if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN) //если часы выключены - инициализируем их
   {
      RCC->BDCR |= RCC_BDCR_BDRST;  //выполнить сброс области резервных данных
      RCC->BDCR &= ~RCC_BDCR_BDRST;
      RCC->BDCR |= RCC_BDCR_RTCSEL_LSE;     //внешний кварц 32768
      RCC->BDCR |= RCC_BDCR_RTCEN;          //подать тактирование
      RTC->CRL |= RTC_CRL_CNF;             //разрешить изменение регистров RTC
      RTC->PRLL = 0x7FFF;                  //настроить входной делитель
      RTC->CRL &= ~RTC_CRL_CNF;            //запретить изменение регистров RTC
      RCC->BDCR |= RCC_BDCR_LSEON;         //включить внешний генератор 32768
      while ((RCC->BDCR & RCC_BDCR_LSEON) != RCC_BDCR_LSEON)
         ; //дождаемся пуска генератора
      result = 1;
   }
   RTC->CRL &= (uint16_t) ~RTC_CRL_RSF;
   while ((RTC->CRL & RTC_CRL_RSF) != RTC_CRL_RSF)
      ;
   if (result) //если часы еще небыли инициализированы...
   {
      rtc_set_cnt(INIT_RTC_VALUE); //устанавливаем стартовое значение
   }
   return result; // result: 0 - часы уже были иницализированы, 1 - инициализация выполнена
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 19:01 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
Kelvin писал(а):
st41ker
А для тех, у кого нету куба, что происходит в
Код:
HAL_RTC_Init(&hrtc);
HAL_RTCEx_SetSecond_IT(&hrtc);
?


Да куб то тут при чём?

Делает оно это:

Код:
/** @defgroup RTCEx_Exported_Functions_Group2 RTC Second functions
* @brief    RTC Second functions
*
@verbatim   
===============================================================================
##### RTC Second functions #####
=============================================================================== 

[..] This section provides functions implementing second interupt handlers

@endverbatim
* @{
*/

/**
* @brief  Sets Interrupt for second
* @param  hrtc: pointer to a RTC_HandleTypeDef structure that contains
*                the configuration information for RTC.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_RTCEx_SetSecond_IT(RTC_HandleTypeDef *hrtc) {
   /* Check input parameters */
   if (hrtc == NULL) {
      return HAL_ERROR;
   }

   /* Process Locked */
   __HAL_LOCK(hrtc);

   hrtc->State = HAL_RTC_STATE_BUSY;

   /* Enable Second interuption */
   __HAL_RTC_SECOND_ENABLE_IT(hrtc, RTC_IT_SEC);

   hrtc->State = HAL_RTC_STATE_READY;

   /* Process Unlocked */
   __HAL_UNLOCK(hrtc);

   return HAL_OK;
}



Код:
@verbatim   
===============================================================================
##### Initialization and de-initialization functions #####
===============================================================================
[..] This section provides functions allowing to initialize and configure the
RTC Prescaler (Asynchronous), disable RTC registers Write protection,
enter and exit the RTC initialization mode,
RTC registers synchronization check and reference clock detection enable.
(#) The RTC Prescaler should be programmed to generate the RTC 1Hz time base.
(#) All RTC registers are Write protected. Writing to the RTC registers
is enabled by setting the CNF bit in the RTC_CRL register.
(#) To read the calendar after wakeup from low power modes (Standby or Stop)
the software must first wait for the RSF bit (Register Synchronized Flag)
in the RTC_CRL register to be set by hardware.
The HAL_RTC_WaitForSynchro() function implements the above software
sequence (RSF clear and RSF check).

@endverbatim
* @{
*/

/**
* @brief  Initializes the RTC peripheral
* @param  hrtc   pointer to a RTC_HandleTypeDef structure that contains
*                the configuration information for RTC.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc) {
   uint32_t prescaler = 0U;
   /* Check input parameters */
   if (hrtc == NULL) {
      return HAL_ERROR;
   }

   /* Check the parameters */
   assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance));
   assert_param(IS_RTC_CALIB_OUTPUT(hrtc->Init.OutPut));
   assert_param(IS_RTC_ASYNCH_PREDIV(hrtc->Init.AsynchPrediv));

   if (hrtc->State == HAL_RTC_STATE_RESET) {
      /* Allocate lock resource and initialize it */
      hrtc->Lock = HAL_UNLOCKED;

      /* Initialize RTC MSP */
      HAL_RTC_MspInit(hrtc);
   }

   /* Set RTC state */
   hrtc->State = HAL_RTC_STATE_BUSY;

   /* Waiting for synchro */
   if (HAL_RTC_WaitForSynchro(hrtc) != HAL_OK) {
      /* Set RTC state */
      hrtc->State = HAL_RTC_STATE_ERROR;

      return HAL_ERROR;
   }

   /* Set Initialization mode */
   if (RTC_EnterInitMode(hrtc) != HAL_OK) {
      /* Set RTC state */
      hrtc->State = HAL_RTC_STATE_ERROR;

      return HAL_ERROR;
   } else {
      /* Clear Flags Bits */
      CLEAR_BIT(hrtc->Instance->CRL,
            (RTC_FLAG_OW | RTC_FLAG_ALRAF | RTC_FLAG_SEC));

      if (hrtc->Init.OutPut != RTC_OUTPUTSOURCE_NONE) {
         /* Disable the selected Tamper pin */
         CLEAR_BIT(BKP->CR, BKP_CR_TPE);
      }

      /* Set the signal which will be routed to RTC Tamper pin*/
      MODIFY_REG(BKP->RTCCR,
            (BKP_RTCCR_CCO | BKP_RTCCR_ASOE | BKP_RTCCR_ASOS),
            hrtc->Init.OutPut);

      if (hrtc->Init.AsynchPrediv != RTC_AUTO_1_SECOND) {
         /* RTC Prescaler provided directly by end-user*/
         prescaler = hrtc->Init.AsynchPrediv;
      } else {
         /* RTC Prescaler will be automatically calculated to get 1 second timebase */
         /* Get the RTCCLK frequency */
         prescaler = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RTC);

         /* Check that RTC clock is enabled*/
         if (prescaler == 0U) {
            /* Should not happen. Frequency is not available*/
            hrtc->State = HAL_RTC_STATE_ERROR;
            return HAL_ERROR;
         } else {
            /* RTC period = RTCCLK/(RTC_PR + 1) */
            prescaler = prescaler - 1U;
         }
      }

      /* Configure the RTC_PRLH / RTC_PRLL */
      MODIFY_REG(hrtc->Instance->PRLH, RTC_PRLH_PRL, (prescaler >> 16U));
      MODIFY_REG(hrtc->Instance->PRLL, RTC_PRLL_PRL,
            (prescaler & RTC_PRLL_PRL));

      /* Wait for synchro */
      if (RTC_ExitInitMode(hrtc) != HAL_OK) {
         hrtc->State = HAL_RTC_STATE_ERROR;

         return HAL_ERROR;
      }

      /* Initialize date to 1st of January 2000 */
      hrtc->DateToUpdate.Year = 0x00U;
      hrtc->DateToUpdate.Month = RTC_MONTH_JANUARY;
      hrtc->DateToUpdate.Date = 0x01U;

      /* Set RTC state */
      hrtc->State = HAL_RTC_STATE_READY;

      return HAL_OK;
   }
}


Файлы драйверов (HAL) качает среда автоматически, но она ничего не генерирует.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 19:03 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
PRC писал(а):
HAL врет с настройками даты, проверено. Тут Эдди прав, лучше напрямую в регистры писать.


Та в сраку дату. Нет там её для 103. И вообще аппаратно её там нет. Составной счётчик и все дела.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 20:39 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3646
Ох, ёлки, сколько буковок. Халовские портянки читать всегда тяжко.
А если кароче, то как только записали настройки текущего времени в РТС, сразу заблокируйте запись. При запуске МК вначале проверяйте состояние работы РТС, и если они уже работают, то ни в коем случае не проводите НИКАКИХ операций с RTC, LSE, их предделителями и не разблокируйте запись бэкапа. Корректирование текущего времени - только по запросу, с разблокированием и последующим блокированием записи бэкапа и RTC.
По электрической схеме убедитесь, что питание от батарейки (Vbat) у вас никак не попадает на основное питание VDD. Так же, если на основном питании установлены очень большие электролиты и напряжение спадает медленно и могут вызываться разного рода дергания туда-сюда. Можно применить внешний супервизор питания для надежного внешнего сброса МК.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 22:32 
Старожил

Зарегистрирован: 13 июл 2016, 11:05
Сообщения: 417
F103? Ничего про него не скажу.
Но в STM32L476 у меня RTC изначально был только из-под Куба. И никогда не было проблем. Ни с чем. Ни с месяцами, ни с годами. 2016 високосный прошел. Было дело на 12 минут за полгода часы убежали. Вероятно с конденсаторами всё же не так что-то (которые 4,7 пФ). Хотя там у людей чего только зимой на улице не было. И морозы и дизель-генератор вместо 220В периодически запускали. Т.е. ежедневные отключения питания там - норма.
В который раз уже слышу гадости про F103. И не только про RTC. В любую периферию ткнись - народ верещит про F103.
Фирма ST просто на него забила давно (судя по всему).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 23:20 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
BusMaster писал(а):
Ох, ёлки, сколько буковок. Халовские портянки читать всегда тяжко.
А если кароче, то как только записали настройки текущего времени в РТС, сразу заблокируйте запись. При запуске МК вначале проверяйте состояние работы РТС, и если они уже работают, то ни в коем случае не проводите НИКАКИХ операций с RTC, LSE, их предделителями и не разблокируйте запись бэкапа. Корректирование текущего времени - только по запросу, с разблокированием и последующим блокированием записи бэкапа и RTC.
По электрической схеме убедитесь, что питание от батарейки (Vbat) у вас никак не попадает на основное питание VDD. Так же, если на основном питании установлены очень большие электролиты и напряжение спадает медленно и могут вызываться разного рода дергания туда-сюда. Можно применить внешний супервизор питания для надежного внешнего сброса МК.


Супервизор... Это фитолампа, блядь! :)
Да. Схема, и ПП доступны всем по ссылке с изиеда, так что можно понять что к чему там.

Спасибо за советы, уважаемый. Накалякаю только инициализацию RTC, и попробую воспроизвести проблему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 23:23 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
serglg писал(а):
F103? Ничего про него не скажу.
Но в STM32L476 у меня RTC изначально был только из-под Куба. И никогда не было проблем. Ни с чем. Ни с месяцами, ни с годами. 2016 високосный прошел. Было дело на 12 минут за полгода часы убежали. Вероятно с конденсаторами всё же не так что-то (которые 4,7 пФ). Хотя там у людей чего только зимой на улице не было. И морозы и дизель-генератор вместо 220В периодически запускали. Т.е. ежедневные отключения питания там - норма.
В который раз уже слышу гадости про F103. И не только про RTC. В любую периферию ткнись - народ верещит про F103.
Фирма ST просто на него забила давно (судя по всему).


Братан, с 103 все начинают 100%. А начинают очень тяжело. Вот и крику. Я так считаю.

Show Мысли вслух


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 11 апр 2019, 23:48 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3646
Серия F1 - самая древняя, потому и далека от идеала. Не сказать, что самая простая, но исторически так сложилось, что знакомство с СТМ32 с нее начинали многие. Потому как поначалу СТ рассылали бесплатно Дискавери с F100RB.
А насчет супервизора питания - напрасно смеетесь. Штука полезная, и если есть проблемы с нарастанием и спадом питания, супервизор, как формирователь сигнала сброса, может здорово помочь.

Для отлавливания проблемы, я бы при запуске МК прочитал значение регистра предделителя RTC, и если оно отличается от рекомендованного 0x7FFF, то зажег бы контрольный светодиод. Поскольку единственное предположение - это сбой в регистре предделителя. Он сбрасывается на 0, из-за чего счет резко ускоряется


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 12 апр 2019, 00:48 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
BusMaster писал(а):
Серия F1 - самая древняя, потому и далека от идеала. Не сказать, что самая простая, но исторически так сложилось, что знакомство с СТМ32 с нее начинали многие. Потому как поначалу СТ рассылали бесплатно Дискавери с F100RB.
А насчет супервизора питания - напрасно смеетесь. Штука полезная, и если есть проблемы с нарастанием и спадом питания, супервизор, как формирователь сигнала сброса, может здорово помочь.

Для отлавливания проблемы, я бы при запуске МК прочитал значение регистра предделителя RTC, и если оно отличается от рекомендованного 0x7FFF, то зажег бы контрольный светодиод. Поскольку единственное предположение - это сбой в регистре предделителя. Он сбрасывается на 0, из-за чего счет резко ускоряется


Вот есть изделие. Прямо на столе лежит. Вы предлагаете добавлять вторую схему, которая будет следить за питанием, и сбрасывать основной MCU?
Или подразумевается программное решение с watchdog, и управлением питания (напомню, всё работает на F103)?

Да, так и сделаю! Я о чтении значения предделителя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 12 апр 2019, 05:19 
Заглядывает иногда

Зарегистрирован: 16 дек 2018, 05:02
Сообщения: 97
F103 при отключении основного питания и переходе на батарейку, не сохраняет дату. Сохраняет только время.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 12 апр 2019, 08:58 
Старожил

Зарегистрирован: 13 июл 2016, 11:05
Сообщения: 417
st41ker писал(а):
serglg писал(а):
F103? Ничего про него не скажу.
Но в STM32L476 у меня RTC изначально был только из-под Куба. И никогда не было проблем. Ни с чем. Ни с месяцами, ни с годами. 2016 високосный прошел. Было дело на 12 минут за полгода часы убежали. Вероятно с конденсаторами всё же не так что-то (которые 4,7 пФ). Хотя там у людей чего только зимой на улице не было. И морозы и дизель-генератор вместо 220В периодически запускали. Т.е. ежедневные отключения питания там - норма.
В который раз уже слышу гадости про F103. И не только про RTC. В любую периферию ткнись - народ верещит про F103.
Фирма ST просто на него забила давно (судя по всему).


Братан, с 103 все начинают 100%. А начинают очень тяжело. Вот и крику. Я так считаю.

Show Мысли вслух

Мне казалось, что все начинают с F030. :-)
Ну я по крайней мере с нее начал.
Там всё примитивно, почти как мой старый 8-битник.
А вот когда понадобился USB Host - ткнулся в L476.
Кстати, почему-то в тот момент старые модели с Host постарался избегнуть (подсознательно).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 счётчик rtc убегает на месяцы.
СообщениеДобавлено: 12 апр 2019, 08:59 
Старожил

Зарегистрирован: 13 июл 2016, 11:05
Сообщения: 417
dimasik1975 писал(а):
F103 при отключении основного питания и переходе на батарейку, не сохраняет дату. Сохраняет только время.


Шедеврально!
:-)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 57 ]  На страницу 1, 2, 3  След.

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


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

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


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

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

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