Страница 1 из 1

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

Добавлено: Вс ноя 22, 2015 12:48:38
Карась
Всем привет!
Ребята, объясните, пожалуйста, мне тупому: откуда берётся тактирование таймера 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 МГц. Вопрос: откуда такая величина берётся? Или я что-то не так понял?

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

Добавлено: Вс ноя 22, 2015 14:25:30
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 мс), что в два раза меньше измеренного тобой и одновременно подозрительно равно до наоборот. Не спутаны ли частота с периодом?

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

Добавлено: Пн ноя 23, 2015 09:57:58
Карась
Вот что показывает осциллограф:
Изображение

Длительность развёртки 5Мс/дел.

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

Добавлено: Пт ноя 27, 2015 11:45:27
Карась
Прошу прощения, я напутал: Длительность импульса не 22.5, а примерно 18 мс (не 4 с половиной, а 3 с чем-то клеточки), т.е. частота переключений ноги PC7 получается примерно 28 Гц. Всё равно непонятно, откуда берётся такое значение.

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

Добавлено: Пт дек 27, 2024 20:37:38
maksimdag0
Доброго дня! тема давно закрыта, у меня сейчас тоже возникла проблема с systick.
Когда я так тирую с внутреннего генератора(16мгц), то systick работает нормально, а то есть обработчик исключения systick вызывается каждые 1 ms, и для визуального теста реализовал мигания светодиода в 1 секунду.
Когда я переключения генератор тактирования на кварц, и устанавливаю тоже 16мгц(для теста) то светодиод мигает уже с промежутком в 3 секунды. проверял все. инициализацию регистров systick, меня значениях в них и тд, но все равно так работает. Регистр значение(systick->LOAD) устанавливаю верное значение(15999 для частоты 16мгц). не понимаю почему он себя, кто с таким сталкивался? Вот прям так и кажется что проблема какая-то мелачевая, а найти ее не смог

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

Добавлено: Сб дек 28, 2024 08:19:10
HardWareMan
maksimdag0, можно вместо систика просто подёргать ногой в узком цикле и оценить, чему равен SYSCLK, ведь SYSTICK питается от него. Может у вас тактовое дерево настроено не так, может через ПЛЛ пропускаете но не настраиваете.

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

Добавлено: Сб дек 28, 2024 09:11:38
maksimdag0
HardWareMan писал(а):maksimdag0, можно вместо систика просто подёргать ногой в узком цикле и оценить, чему равен SYSCLK
Если я правильно понял, вы предлагаете сделать дергание ногой в основном цикле while? Если да, разве таким обраом мы сможем осцилографом, на этой ножке, измерить частоту cpu?

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

Добавлено: Сб дек 28, 2024 09:28:49
Cheeseman
Скинь инициализацию свою + что за мк

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

Добавлено: Сб дек 28, 2024 11:31:35
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 секунду.
Инициализацию приложил

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

Добавлено: Сб дек 28, 2024 11:54:09
Adrift
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4665235#p4665235"]Изенил немного инициализаю, поставил частоту 25Мгц[/uquote]
Для начала у вас кварц точно на 25MHz?

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

Добавлено: Сб дек 28, 2024 12:29:28
maksimdag0
Это начало и конец :D . Кварц на отладочной плате действительно стоит на 8мгц. В этом была причина.
Спасибо))

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

Добавлено: Сб дек 28, 2024 12:54:13
HardWareMan
maksimdag0, 25/8=3,125 и есть.
Изображение

PS:
[uquote="Карась",url="/forum/viewtopic.php?p=2554689#p2554689"]Всем привет!
Ребята, объясните, пожалуйста, мне тупому: откуда берётся тактирование таймера systick у STM32F407 (плата Discovery)?[/uquote]
Ответ одной картинкой:
Изображение