int main() { if(SysTick_Config(1000000)) for (;;);
initGPIO();
for (;;); }
Здесь в обработчике прерывания я мигаю светодиодом на PD14, но на это можно не смотреть - это так, для красоты. Интересное в последней строке обработчика. Здесь я дёргаю PC7 и вот что получается: Цепляю на PC7 осциллограф и вижу импульсы длительностью 22.5 МСек, то есть частота переключения PC7 равна 44.4 Гц, стало быть, с учётом величины, передаваемой в функцию SysTick_Config, получается, что на вход systick-а поступает частота 44.4 МГц. Вопрос: откуда такая величина берётся? Или я что-то не так понял?
По умолчанию systick тактируется от частоты шины AHB (SYSCLK), поделённой на 8. Но тактирование можно переключить напрямую от шины AHB без деления. Данный функционал устанавливается в регистре STK_CTRL 2-й бит (CLKSOURCE). Наверное, таким кодом можно переключиться на тактирование от системной частоты:
Код:
STK->CTRL |= CLKSOURCE;
Должно быть, в драйвере есть свои функции для конфигурирования systick (ну не люблю я их, потому не знаю).
P.S. Кстати, при расчёте на 180 МГц тактовой частоты, частота вызова прерывания в таком случае составляет 22,5 Гц (полупериод выходного сигнала 44,4 мс), что в два раза меньше измеренного тобой и одновременно подозрительно равно до наоборот. Не спутаны ли частота с периодом?
Прошу прощения, я напутал: Длительность импульса не 22.5, а примерно 18 мс (не 4 с половиной, а 3 с чем-то клеточки), т.е. частота переключений ноги PC7 получается примерно 28 Гц. Всё равно непонятно, откуда берётся такое значение.
Доброго дня! тема давно закрыта, у меня сейчас тоже возникла проблема с systick. Когда я так тирую с внутреннего генератора(16мгц), то systick работает нормально, а то есть обработчик исключения systick вызывается каждые 1 ms, и для визуального теста реализовал мигания светодиода в 1 секунду. Когда я переключения генератор тактирования на кварц, и устанавливаю тоже 16мгц(для теста) то светодиод мигает уже с промежутком в 3 секунды. проверял все. инициализацию регистров systick, меня значениях в них и тд, но все равно так работает. Регистр значение(systick->LOAD) устанавливаю верное значение(15999 для частоты 16мгц). не понимаю почему он себя, кто с таким сталкивался? Вот прям так и кажется что проблема какая-то мелачевая, а найти ее не смог
maksimdag0, можно вместо систика просто подёргать ногой в узком цикле и оценить, чему равен SYSCLK, ведь SYSTICK питается от него. Может у вас тактовое дерево настроено не так, может через ПЛЛ пропускаете но не настраиваете.
_________________ Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ Актуальность репозитория: 1 июля 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
maksimdag0, можно вместо систика просто подёргать ногой в узком цикле и оценить, чему равен SYSCLK
Если я правильно понял, вы предлагаете сделать дергание ногой в основном цикле while? Если да, разве таким обраом мы сможем осцилографом, на этой ножке, измерить частоту cpu?
Микроконтроллер - STM32F407VET6. Проект создавал в CubMX. Проект почти пустой, подключил только кварц, настроил два вывода на выход и инициализировал таймер 1 и все. Скриншоты инициализации и файл main прикалдываю во вложениях.
Светодиод должен моргать с промежтком в 1 секунду, а моргает с промежутком 3 секунды.
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */ SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM1_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim1); /* USER CODE END 2 */
/* Infinite loop */ /* USER CODE BEGIN WHILE */
SystemCoreClockUpdate();//проверка текущей тактовой частоты cpu
while (1) { HAL_GPIO_WritePin(GPIOA, LED_1_Pin, GPIO_PIN_RESET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOA, LED_1_Pin, GPIO_PIN_SET); HAL_Delay(1000); /* USER CODE END WHILE */
/* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
Добавлено after 1 minute 29 seconds: Изенил немного инициализаю, поставил частоту 25Мгц, соотвественно и регистр SysTick->LOAD = 24999. Но проблема все равно остается, причем точно такая же, то есть диод мигает каждые 3 секунды, а не 1 секунду. Инициализацию приложил
Всем привет! Ребята, объясните, пожалуйста, мне тупому: откуда берётся тактирование таймера systick у STM32F407 (плата Discovery)?
Ответ одной картинкой:
_________________ Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ Актуальность репозитория: 1 июля 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения