Запуск RTC и настройка будильника: различия между версиями

Материал из MIK32 микроконтроллер
Нет описания правки
Нет описания правки
Строка 21: Строка 21:


== Использование библиотеки HAL_RTC ==
== Использование библиотеки HAL_RTC ==
В сгенерированном проекте в файле main.c должна быть функция OTP_Init, в которой будут заданы настройки для OTP. Выглядит она так:
В сгенерированном проекте в файле main.c должна быть функция RTC_Init, в которой будут заданы настройки для RTC. Выглядит она так:<syntaxhighlight lang="c" line="1">
static void RTC_Init(void)
{
   
    RTC_TimeTypeDef sTime = {0};
    RTC_DateTypeDef sDate = {0};
    RTC_AlarmTypeDef sAlarm = {0};
 
    hrtc.Instance = RTC;
 
    /* Установка даты и времени RTC */
    sTime.Dow = RTC_WEEKDAY_WEDNESDAY;
    sTime.Hours = 14;
    sTime.Minutes = 54;
    sTime.Seconds = 15;
 
    /* Выключение RTC для записи даты и времени */
    HAL_RTC_Disable(&hrtc);
 
    HAL_RTC_SetTime(&hrtc, &sTime);
 
    sDate.Century = 21;
    sDate.Day = 15;
    sDate.Month = RTC_MONTH_FEBRUARY;
    sDate.Year = 23;
 
    HAL_RTC_SetDate(&hrtc, &sDate);
 
    /* Включение будильника. Настройка даты и времени будильника */
    sAlarm.AlarmTime.Dow = RTC_WEEKDAY_WEDNESDAY;
    sAlarm.AlarmTime.Hours = 14;
    sAlarm.AlarmTime.Minutes = 54;
    sAlarm.AlarmTime.Seconds = 20;
 
    sAlarm.AlarmDate.Century = 21;
    sAlarm.AlarmDate.Day = 15;
    sAlarm.AlarmDate.Month = RTC_MONTH_FEBRUARY;
    sAlarm.AlarmDate.Year = 23;
   
    /* Маски сравнения будильника по дате и времени */
    sAlarm.MaskAlarmTime = RTC_TALRM_CDOW_M | RTC_TALRM_CH_M | RTC_TALRM_CM_M | RTC_TALRM_CS_M;
    sAlarm.MaskAlarmDate = RTC_DALRM_CC_M | RTC_DALRM_CD_M | RTC_DALRM_CM_M | RTC_DALRM_CY_M;
 
    HAL_RTC_SetAlarm(&hrtc, &sAlarm);
 
    HAL_RTC_Enable(&hrtc);
}
</syntaxhighlight>

Версия от 12:07, 15 февраля 2023

В примере будут запущен таймер RTC и настроен будильник.

Работа с конфигуратором (В разработке)

Для начала настроем в конфигураторе тактирование mik32, например, от внешнего кварца 32МГц. Затем настроем делители шины. Так как RTC тактируется от шины APB_M_CLK, то зададим делители AHB_DIV и APB_M_DIV. В данном примере оставим делители по умолчанию. В итоге вкладка с тактированием должна выглядеть так:

(Картинка тактирования из конфигуратора. В работе)

Затем перейдем к настройке самого RTC. Для этого откроем вкладку RTC и нажмем включить.

Рисунок 1 - Настройки RTC в конфигураторе

Выберем тактирование от "внешнего осциллятора OSC32K". Во вкладке дата и время RTC нажмем кнопку взять дату с компьютера. Все поля автоматически заполнятся. При заполнении полей вручную следует вводить корректную дату.

Следующая вкладка "регистры RTC". Здесь задаются значения регистров общего назначения REG0-REG15. Они могут использоваться в произвольных целях. Регистры располагаются в батарейном домене и сохраняют свое значение при отключении системного питания и при внешнем сбросе. В данном примере в них ничего записываться не будет.

Рисунок - Настройки будильника RTC в конфигураторе

В самом начале настроек нажмем галочку "включить будильник". После этого появится еще одна вкладка с настройками даты и времени будильника. Запишем все поля будильника как во времени и дате RTC, но секунды напишем на 5 больше.

В итоге настройки RTC в конфигураторе должны выглядеть как на рисунках.

(Объяснение работы с конфигуратором. В разработке)

Нажимаем кнопку сохранения и генерации. В итоге у нас появится проект для PlatformIo. Далее работа идет в visual studio code.

Использование библиотеки HAL_RTC

В сгенерированном проекте в файле main.c должна быть функция RTC_Init, в которой будут заданы настройки для RTC. Выглядит она так:

static void RTC_Init(void)
{
    
    RTC_TimeTypeDef sTime = {0};
    RTC_DateTypeDef sDate = {0};
    RTC_AlarmTypeDef sAlarm = {0};

    hrtc.Instance = RTC;

    /* Установка даты и времени RTC */
    sTime.Dow = RTC_WEEKDAY_WEDNESDAY;
    sTime.Hours = 14;
    sTime.Minutes = 54;
    sTime.Seconds = 15;

    /* Выключение RTC для записи даты и времени */
    HAL_RTC_Disable(&hrtc);

    HAL_RTC_SetTime(&hrtc, &sTime);

    sDate.Century = 21;
    sDate.Day = 15;
    sDate.Month = RTC_MONTH_FEBRUARY;
    sDate.Year = 23;

    HAL_RTC_SetDate(&hrtc, &sDate);

    /* Включение будильника. Настройка даты и времени будильника */
    sAlarm.AlarmTime.Dow = RTC_WEEKDAY_WEDNESDAY;
    sAlarm.AlarmTime.Hours = 14;
    sAlarm.AlarmTime.Minutes = 54;
    sAlarm.AlarmTime.Seconds = 20;

    sAlarm.AlarmDate.Century = 21;
    sAlarm.AlarmDate.Day = 15;
    sAlarm.AlarmDate.Month = RTC_MONTH_FEBRUARY;
    sAlarm.AlarmDate.Year = 23;
    
    /* Маски сравнения будильника по дате и времени */
    sAlarm.MaskAlarmTime = RTC_TALRM_CDOW_M | RTC_TALRM_CH_M | RTC_TALRM_CM_M | RTC_TALRM_CS_M;
    sAlarm.MaskAlarmDate = RTC_DALRM_CC_M | RTC_DALRM_CD_M | RTC_DALRM_CM_M | RTC_DALRM_CY_M;

    HAL_RTC_SetAlarm(&hrtc, &sAlarm);

    HAL_RTC_Enable(&hrtc);
}