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

Материал из MIK32 микроконтроллер
Нет описания правки
(закомментировал код. добавил подключение UARTa. пронумеровал рисунки (начиная с 3) в HAL_RTC)
 
Строка 21: Строка 21:


== Использование библиотеки HAL_RTC ==
== Использование библиотеки HAL_RTC ==
В сгенерированном проекте в файле main.c должна быть функция RTC_Init, в которой будут заданы настройки для RTC. Выглядит она так:<syntaxhighlight lang="c" line="1">
В сгенерированном проекте в файле main.c должна быть функция RTC_Init, в которой будут заданы настройки для RTC. Выглядит она так:
{{#spoiler:show=Развернуть код|hide=Свернуть код|
<syntaxhighlight lang="c" line="1">
static void RTC_Init(void)
static void RTC_Init(void)
{
{
Строка 68: Строка 70:
     HAL_RTC_Enable(&hrtc);
     HAL_RTC_Enable(&hrtc);
}
}
</syntaxhighlight>Кроме этого в функции SystemClock_Config приведены настройки для тактирования. Убедитесь что в PeriphClkInit.PMClockAPB_M присутствует PM_CLOCK_RTC_M. Сама функция должна выглядеть примерно так:
</syntaxhighlight>
 
}}
Кроме этого в функции SystemClock_Config приведены настройки для тактирования. Убедитесь что в PeriphClkInit.PMClockAPB_M присутствует PM_CLOCK_RTC_M. Сама функция должна выглядеть примерно так:
{{#spoiler:show=Развернуть код|hide=Свернуть код|
<syntaxhighlight lang="c" line="1">
<syntaxhighlight lang="c" line="1">
void SystemClock_Config(void)
void SystemClock_Config(void)
Строка 92: Строка 96:
     HAL_RCC_ClockConfig(&PeriphClkInit);
     HAL_RCC_ClockConfig(&PeriphClkInit);
}
}
</syntaxhighlight>Для демонстрации вывода текста в PeriphClkInit.PMClockAPB_P присутствует PM_CLOCK_UART_0_M. У вас его может не быть так как UART нужно включить отдельно.  
</syntaxhighlight>
}}
Для демонстрации вывода текста в PeriphClkInit.PMClockAPB_P присутствует PM_CLOCK_UART_0_M. У вас его может не быть так как UART нужно включить отдельно. Для этого нужно подключить библиотеки uart_lib и xprintf.
{{#spoiler:show=Развернуть код|hide=Свернуть код|
<syntaxhighlight lang="c" line="1">
#include "mik32_hal_rtc.h"
#include "mik32_hal_rcc.h"


В начале main.c можно видеть объявление структуры с набором настроек для RTC, которую использует функция инициализации RTC_Init.<syntaxhighlight lang="c" line="1">
#include "uart_lib.h"
#include "xprintf.h"
</syntaxhighlight>
}}
Для инициализации UART в функции main, после функции тактирования SystemClock_Config, следует написать:
<syntaxhighlight lang="c" line="1" start="1">
UART_Init(UART_0, 3333, UART_CONTROL1_TE_M | UART_CONTROL1_M_8BIT_M, 0, 0);
</syntaxhighlight>
Скорость UART задается делителем во втором аргументе функции. При такой записи скорость будет 9600 бод.
 
В начале main.c можно видеть объявление структуры с набором настроек для RTC, которую использует функция инициализации RTC_Init.
{{#spoiler:show=Развернуть код|hide=Свернуть код|
<syntaxhighlight lang="c" line="1">
RTC_HandleTypeDef hrtc;
RTC_HandleTypeDef hrtc;
RTC_TimeTypeDef CurrentTime = {0};
RTC_DateTypeDef CurrentDate = {0};


void SystemClock_Config(void);
void SystemClock_Config(void);
static void RTC_Init(void);
static void RTC_Init(void);
</syntaxhighlight>Для запуска RTC нужно после его инициализации воспользоваться функцией HAL_RTC_Enable.
</syntaxhighlight>
}}
Для запуска RTC нужно после его инициализации воспользоваться функцией HAL_RTC_Enable.


В данном примере включен UART, но вывод текста будет виден, если присутствует #define MIK32_RTC_DEBUG в main.c или def_list.h. С помощью функции HAL_RTC_Check можно вывести в UART дату и время RTC.  
С помощью функции HAL_RTC_Check можно вывести в UART дату и время RTC.  


Функция HAL_RTC_GetFlagALRM возвращает значение 1 при срабатывании будильника.  
Функция HAL_RTC_GetFlagALRM возвращает значение 1 при срабатывании будильника.  
Строка 109: Строка 136:
HAL_RTC_AlrmClear - очищает флаг будильника ALRM.
HAL_RTC_AlrmClear - очищает флаг будильника ALRM.


Функция main может выглядеть примерно так:<syntaxhighlight lang="c" line="1">
Функция main может выглядеть примерно так:
{{#spoiler:show=Развернуть код|hide=Свернуть код|
<syntaxhighlight lang="c" line="1">
int main()
int main()
{
{
     SystemClock_Config();
     SystemClock_Config();
    UART_Init(UART_0, 3333, UART_CONTROL1_TE_M | UART_CONTROL1_M_8BIT_M, 0, 0);


     RTC_Init();
     RTC_Init();
 
   
    HAL_RTC_Enable(&hrtc);
   
     int counter = 1000000;
     int counter = 1000000;
    /* Запустить RTC */
    HAL_RTC_Enable(&hrtc);


     while (1)
     while (1)
Строка 125: Строка 155:
         if (--counter < 0)
         if (--counter < 0)
         {
         {
             #ifdef MIK32_RTC_DEBUG
             CurrentDate = HAL_RTC_CheckDate(&hrtc);
             HAL_RTC_Check(&hrtc);
            xprintf("\n%d век\n", CurrentDate.Century);
             #endif
            xprintf("%d.%d.%d\n", CurrentDate.Day, CurrentDate.Month, CurrentDate.Year);
 
             CurrentTime = HAL_RTC_CheckTime(&hrtc);
             switch (CurrentTime.Dow)
            {
            case 1:
                xprintf("Понедельник\n");
                break;
            case 2:
                xprintf("Вторник\n");
                break;
            case 3:
                xprintf("Среда\n");
                break;
            case 4:
                xprintf("Четверг\n");
                break;
            case 5:
                xprintf("Пятница\n");
                break;
            case 6:
                xprintf("Суббота\n");
                break;
            case 7:
                xprintf("Воскресенье\n");
                break;
            }
            xprintf("%d:%d:%d.%d\n", CurrentTime.Hours, CurrentTime.Minutes, CurrentTime.Seconds, hrtc.Instance->TOS);
 
              
              
             counter = 1000000;
             counter = 1000000;
         }
         }


         if (HAL_RTC_GetFlagALRM(&hrtc))
         if (HAL_RTC_GetAlrmFlag(&hrtc))
         {
         {
            HAL_RTC_AlarmDisable(&hrtc);
              
              
            #ifdef MIK32_RTC_DEBUG
             xprintf("\nAlarm!\n");
             xprintf("\nAlarm!\n");
            #endif
 
              
             HAL_RTC_AlarmDisable(&hrtc);
             HAL_RTC_AlrmClear(&hrtc);
             HAL_RTC_ClearAlrmFlag(&hrtc);
         }
         }
     }
     }
}
}
</syntaxhighlight>
</syntaxhighlight>
[[Файл:Вывод в UART.png|мини|Вывод в UART]]
}}
В данном примере запускается RTC и выводит дату и время в UART. Через 5 секунд должен сработать будильник. При срабатывании будильника в UART отправляется сообщение "Alarm!". После этого будильник должен отключиться, а вывод времени и даты RTC продолжиться. Пример вывода UART изображен на рисунке.
[[Файл:Вывод в UART.png|мини|Рисунок 3 - Вывод в UART]]
В данном примере запускается RTC и выводит дату и время в UART. Через 5 секунд должен сработать будильник. При срабатывании будильника в UART отправляется сообщение "Alarm!". После этого будильник должен отключиться, а вывод времени и даты RTC продолжиться. Пример вывода UART изображен на рисунке 3.

Текущая версия от 09:51, 24 марта 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. Выглядит она так:

Кроме этого в функции SystemClock_Config приведены настройки для тактирования. Убедитесь что в PeriphClkInit.PMClockAPB_M присутствует PM_CLOCK_RTC_M. Сама функция должна выглядеть примерно так:

Для демонстрации вывода текста в PeriphClkInit.PMClockAPB_P присутствует PM_CLOCK_UART_0_M. У вас его может не быть так как UART нужно включить отдельно. Для этого нужно подключить библиотеки uart_lib и xprintf.

Для инициализации UART в функции main, после функции тактирования SystemClock_Config, следует написать:

UART_Init(UART_0, 3333, UART_CONTROL1_TE_M | UART_CONTROL1_M_8BIT_M, 0, 0);

Скорость UART задается делителем во втором аргументе функции. При такой записи скорость будет 9600 бод.

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

Для запуска RTC нужно после его инициализации воспользоваться функцией HAL_RTC_Enable.

С помощью функции HAL_RTC_Check можно вывести в UART дату и время RTC.

Функция HAL_RTC_GetFlagALRM возвращает значение 1 при срабатывании будильника.

HAL_RTC_AlarmDisable - сбрасывает маску сравнения будильника. Дата и время будильника не сравнивается с датой и временем RTC.

HAL_RTC_AlrmClear - очищает флаг будильника ALRM.

Функция main может выглядеть примерно так:

Рисунок 3 - Вывод в UART

В данном примере запускается RTC и выводит дату и время в UART. Через 5 секунд должен сработать будильник. При срабатывании будильника в UART отправляется сообщение "Alarm!". После этого будильник должен отключиться, а вывод времени и даты RTC продолжиться. Пример вывода UART изображен на рисунке 3.