Вопрос или проблема
Хотя этот вопрос может показаться тривиальным, я не совсем понимаю результаты своей работы. Я следовал статьям по программированию на «bare metal» и пытался реализовать некоторые основные функции на своей плате Nucleo с STM32H723 без каких-либо внешних библиотек. Я понимаю большую часть, но в одной статье упоминалось, что мне нужно включить SysCfg, чтобы использовать Systick.
static inline void systick_init(uint32_t ticks) {
if ((ticks - 1) > 0xffffff) return; // Таймер Systick - 24 бита
SYSTICK->LOAD = ticks - 1;
SYSTICK->VAL = 0;
SYSTICK->CTRL = BIT(0) | BIT(1) | BIT(2); // Включить Systick
//RCC->APB4ENR |= BIT(1); // ПОЧЕМУ НЕ НУЖНО?
}
Что я наблюдаю, так это то, что мне не нужна последняя строка (закомментированная), в которой упоминается включение SysCfg. Я не трогаю этот регистр ни в какой другой части моего кода, и тем не менее прерывание продолжает работать. Я даже проверил файл startup.s, который Cube сгенерировал для меня, и все, что я там вижу, это инициализация вектора прерываний. Это связано с режимом энергопотребления? SysCfg по умолчанию отключен только в режиме низкого потребления?
Ответ или решение
Конфигурация Systick для STM32
Вопрос конфигурации Systick таймера на плате Nucleo с чипом STM32H723 может показаться незначительным, но понимание его работы очень важно для разработки bare metal приложений. Давайте внимательно разберем все аспекты, связанные с использованием Systick и необходимостью активации SysCfg.
Описание Systick
Systick таймер — это встроенный таймер, предоставляющий удобный способ генерации прерываний с заданным интервалом. Он часто используется для реализации функций, связанных с временными задержками и таймаутами, и легко интегрируется в различную проектную архитектуру.
Код инициализации Systick, который вы предоставили, выглядит следующим образом:
static inline void systick_init(uint32_t ticks) {
if ((ticks - 1) > 0xffffff) return; // Systick таймер 24-битный
SYSTICK->LOAD = ticks - 1;
SYSTICK->VAL = 0;
SYSTICK->CTRL = BIT(0) | BIT(1) | BIT(2); // Включаем Systick
// RCC->APB4ENR |= BIT(1); // ЗАЧЕМ ЭТА СТРОКА НУЖНА?
}
Разбор кода
- Проверка значения ticks: Прежде всего, мы проверяем, чтобы значение ticks было допустимым для 24-битного таймера. Если значение превышает 24 бита, функция завершается.
- Инициализация регистра LOAD: Мы задаем значение, которое будет загружено в Systick на следующий переполнившийся таймер.
- Сброс значения VAL: Устанавливаем текущий таймер в ноль.
- Включение контроллера Systick: С помощью битов в CTRL настраиваем таймер на работу и активацию прерываний.
Вопрос о SysCfg
Вы задаетесь вопросом, почему вам не требуется включать SysCfg и как это связано с работой Systick. Давайте проясним следующие моменты:
-
SysCfg и его необходимость: SysCfg отвечает за конфигурацию панели управления системой, включая различные параметры работы периферийных устройств и режимов низкого энергопотребления. Однако, если вам не нужно изменять конфигурацию, связанную с Systick, то SysCfg может оставаться выключенным, и таймер будет функционировать нормально.
-
Работа прерываний: Если вы инициализируете вектор прерываний в вашем проекте (в том числе и в
startup.s
), то прерывания будут срабатывать без дополнительных активаций, поскольку они уже настроены на использование Systick. -
Состояние питания: Как вы правильно заметили, SysCfg может быть необходим для управления режимами низкого энергопотребления. Однако, для обычной работы с Systick в стандартных режимах это не требуется.
Заключение
Таким образом, вы можете успешно настроить Timert Systick в STM32H723 без необходимости включать SysCfg, если ваша программа не требует специальных условий или конфигураций. Если ваши прерывания работают, а таймер выполняет свою задачу, это свидетельствует о правильной настройке и отсутствии конфликтов в конфигурации.
Советую продолжать исследовать документацию STM32 и далее ориентироваться на примеры кода, чтобы углубить свои знания о возможностях микроконтроллеров и их интеграции в проекты.