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 Гц. Всё равно непонятно, откуда берётся такое значение.
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
Доброго дня! тема давно закрыта, у меня сейчас тоже возникла проблема с 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 Актуальность репозитория: 16 мая 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 Актуальность репозитория: 16 мая 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения