Не пойму, как тактируется systick

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Карась
Открыл глаза
Сообщения: 67
Зарегистрирован: Ср май 28, 2008 14:33:11
Откуда: Россия, Саров
Контактная информация:

Не пойму, как тактируется systick

Сообщение Карась »

Всем привет!
Ребята, объясните, пожалуйста, мне тупому: откуда берётся тактирование таймера systick у STM32F407 (плата Discovery)?

Вот код:

Код: Выделить всё

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

#define LED GPIO_Pin_14
#define TEST GPIO_Pin_7

void initGPIO(void)
{
    GPIO_InitTypeDef port;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOC, ENABLE);
    port.GPIO_Pin = LED;
    port.GPIO_Mode = GPIO_Mode_OUT;
    port.GPIO_OType = GPIO_OType_PP;
    port.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &port);
    port.GPIO_Pin = TEST;
    GPIO_Init(GPIOC, &port);
}

void SysTick_Handler(void)
{
    static uint32_t count = 0;

     count++;
     
     if (count == 200) {
         GPIO_ToggleBits(GPIOD, LED);
         count = 0;
     }
   
     GPIO_ToggleBits(GPIOC, TEST);
}

int main()
{
    if(SysTick_Config(1000000))
        for (;;);

    initGPIO();
   
    for (;;);
}



Здесь в обработчике прерывания я мигаю светодиодом на PD14, но на это можно не смотреть - это так, для красоты.
Интересное в последней строке обработчика. Здесь я дёргаю PC7 и вот что получается: Цепляю на PC7 осциллограф и вижу импульсы длительностью 22.5 МСек, то есть частота переключения PC7 равна 44.4 Гц, стало быть, с учётом величины, передаваемой в функцию SysTick_Config, получается, что на вход systick-а поступает частота 44.4 МГц. Вопрос: откуда такая величина берётся? Или я что-то не так понял?
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Не пойму, как тактируется systick

Сообщение IfoR »

По умолчанию systick тактируется от частоты шины AHB (SYSCLK), поделённой на 8. Но тактирование можно переключить напрямую от шины AHB без деления. Данный функционал устанавливается в регистре STK_CTRL 2-й бит (CLKSOURCE). Наверное, таким кодом можно переключиться на тактирование от системной частоты:

Код: Выделить всё

STK->CTRL |= CLKSOURCE;

Должно быть, в драйвере есть свои функции для конфигурирования systick (ну не люблю я их, потому не знаю).

За подробностями можно посмотреть документацию на ядро Cortex M4:
http://www.st.com/web/en/resource/techn ... 046982.pdf

P.S. Кстати, при расчёте на 180 МГц тактовой частоты, частота вызова прерывания в таком случае составляет 22,5 Гц (полупериод выходного сигнала 44,4 мс), что в два раза меньше измеренного тобой и одновременно подозрительно равно до наоборот. Не спутаны ли частота с периодом?
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Карась
Открыл глаза
Сообщения: 67
Зарегистрирован: Ср май 28, 2008 14:33:11
Откуда: Россия, Саров
Контактная информация:

Re: Не пойму, как тактируется systick

Сообщение Карась »

Вот что показывает осциллограф:
Изображение

Длительность развёртки 5Мс/дел.
Карась
Открыл глаза
Сообщения: 67
Зарегистрирован: Ср май 28, 2008 14:33:11
Откуда: Россия, Саров
Контактная информация:

Re: Не пойму, как тактируется systick

Сообщение Карась »

Прошу прощения, я напутал: Длительность импульса не 22.5, а примерно 18 мс (не 4 с половиной, а 3 с чем-то клеточки), т.е. частота переключений ноги PC7 получается примерно 28 Гц. Всё равно непонятно, откуда берётся такое значение.
maksimdag0
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Re: Не пойму, как тактируется systick

Сообщение maksimdag0 »

Доброго дня! тема давно закрыта, у меня сейчас тоже возникла проблема с systick.
Когда я так тирую с внутреннего генератора(16мгц), то systick работает нормально, а то есть обработчик исключения systick вызывается каждые 1 ms, и для визуального теста реализовал мигания светодиода в 1 секунду.
Когда я переключения генератор тактирования на кварц, и устанавливаю тоже 16мгц(для теста) то светодиод мигает уже с промежутком в 3 секунды. проверял все. инициализацию регистров systick, меня значениях в них и тд, но все равно так работает. Регистр значение(systick->LOAD) устанавливаю верное значение(15999 для частоты 16мгц). не понимаю почему он себя, кто с таким сталкивался? Вот прям так и кажется что проблема какая-то мелачевая, а найти ее не смог
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: Не пойму, как тактируется systick

Сообщение HardWareMan »

maksimdag0, можно вместо систика просто подёргать ногой в узком цикле и оценить, чему равен SYSCLK, ведь SYSTICK питается от него. Может у вас тактовое дерево настроено не так, может через ПЛЛ пропускаете но не настраиваете.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
maksimdag0
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Re: Не пойму, как тактируется systick

Сообщение maksimdag0 »

HardWareMan писал(а):maksimdag0, можно вместо систика просто подёргать ногой в узком цикле и оценить, чему равен SYSCLK

Если я правильно понял, вы предлагаете сделать дергание ногой в основном цикле while? Если да, разве таким обраом мы сможем осцилографом, на этой ножке, измерить частоту cpu?
Аватара пользователя
Cheeseman
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн июл 31, 2017 10:53:04

Re: Не пойму, как тактируется systick

Сообщение Cheeseman »

Скинь инициализацию свою + что за мк
maksimdag0
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Re: Не пойму, как тактируется systick

Сообщение maksimdag0 »

Микроконтроллер - STM32F407VET6.
Проект создавал в CubMX. Проект почти пустой, подключил только кварц, настроил два вывода на выход и инициализировал таймер 1 и все. Скриншоты инициализации и файл main прикалдываю во вложениях.

Светодиод должен моргать с промежтком в 1 секунду, а моргает с промежутком 3 секунды.

Продублирую функцию main, здесь в тексте:

int main(void)
{
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* 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 секунду.
Инициализацию приложил
Вложения
В это случаи счетчик LOAD равен 24999.png
(65.21 КБ) 62 скачивания
main.c
(7.18 КБ) 72 скачивания
В это случаи счетчик LOAD равен 15999.png
(66.16 КБ) 60 скачиваний
Screenshot_1.png
(27.77 КБ) 48 скачиваний
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Не пойму, как тактируется systick

Сообщение Adrift »

Изенил немного инициализаю, поставил частоту 25Мгц

Для начала у вас кварц точно на 25MHz?
maksimdag0
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Re: Не пойму, как тактируется systick

Сообщение maksimdag0 »

Это начало и конец :D . Кварц на отладочной плате действительно стоит на 8мгц. В этом была причина.
Спасибо))
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: Не пойму, как тактируется systick

Сообщение HardWareMan »

maksimdag0, 25/8=3,125 и есть.
Изображение

PS:
Всем привет!
Ребята, объясните, пожалуйста, мне тупому: откуда берётся тактирование таймера systick у STM32F407 (плата Discovery)?

Ответ одной картинкой:
Изображение
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Ответить

Вернуться в «ARM»