Перейти к содержанию
    

SAMD21 ASF, некорректная работа Systick timer

День добрый. С STM32 на новой работе пришлось пересаживаться на SAMD21, использую ASF. Запустил проц на 48МГц (как я думаю). Цепочка такая - 12МГц XOSC подается на DPLL, с него на GCLK generator 1, затем на GCLK generator 0.  GCLK generator 1 вывожу на внешний пин и на нем вижу осциллографом 48МГц.

 

/* SYSTEM_CLOCK_SOURCE_DPLL configuration - Digital Phase-Locked Loop */
#  define CONF_CLOCK_DPLL_ENABLE                  true
#  define CONF_CLOCK_DPLL_ON_DEMAND               true
#  define CONF_CLOCK_DPLL_RUN_IN_STANDBY          false
#  define CONF_CLOCK_DPLL_LOCK_BYPASS             false
#  define CONF_CLOCK_DPLL_WAKE_UP_FAST            true//false
#  define CONF_CLOCK_DPLL_LOW_POWER_ENABLE        false

#  define CONF_CLOCK_DPLL_LOCK_TIME               SYSTEM_CLOCK_SOURCE_DPLL_LOCK_TIME_8MS
#  define CONF_CLOCK_DPLL_REFERENCE_CLOCK         SYSTEM_CLOCK_SOURCE_DPLL_REFERENCE_CLOCK_XOSC
#  define CONF_CLOCK_DPLL_FILTER                  SYSTEM_CLOCK_SOURCE_DPLL_FILTER_DEFAULT

#  define CONF_CLOCK_DPLL_REFERENCE_FREQUENCY     12000000
#  define CONF_CLOCK_DPLL_REFERENCE_DIVIDER       6
#  define CONF_CLOCK_DPLL_OUTPUT_FREQUENCY        48000000

/* DPLL GCLK reference configuration */
#  define CONF_CLOCK_DPLL_REFERENCE_GCLK_GENERATOR  GCLK_GENERATOR_1//CONF_CLOCK_DPLL_REFERENCE_CLOCK//GCLK_GENERATOR_1
/* DPLL GCLK lock timer configuration */
#  define CONF_CLOCK_DPLL_LOCK_GCLK_GENERATOR     GCLK_GENERATOR_1

/* Set this to true to configure the GCLK when running clocks_init. If set to
 * false, none of the GCLK generators will be configured in clocks_init(). */
#  define CONF_CLOCK_CONFIGURE_GCLK               true

/* Configure GCLK generator 0 (Main Clock) */
#  define CONF_CLOCK_GCLK_0_ENABLE                true
#  define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY        false
#  define CONF_CLOCK_GCLK_0_CLOCK_SOURCE          GCLK_GENERATOR_1//SYSTEM_CLOCK_SOURCE_DPLL
#  define CONF_CLOCK_GCLK_0_PRESCALER             1
#  define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE         false

/* Configure GCLK generator 1 */
#  define CONF_CLOCK_GCLK_1_ENABLE                true
#  define CONF_CLOCK_GCLK_1_RUN_IN_STANDBY        false
#  define CONF_CLOCK_GCLK_1_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_DPLL//SYSTEM_CLOCK_SOURCE_XOSC
#  define CONF_CLOCK_GCLK_1_PRESCALER             1
#  define CONF_CLOCK_GCLK_1_OUTPUT_ENABLE         true

 

Затем в main инициализирую Systick timer

int main (void)
{
    system_init();
    SysTick_Config(480000);
    system_interrupt_enable(SYSTEM_INTERRUPT_SYSTICK);
    NVIC_EnableIRQ(SysTick_IRQn);

    /* Insert application code here, after the board has been initialized. */
    
    for(;;)
    {
        
       
    }
}

В обработчике инвертирую пин

void SysTick_Handler(void) {
    port_pin_toggle_output_level(PIN_PA01);
}

Ожидаю на осцоллографе увидеть 10Гц, но реально вижу 8,3Гц

Вопрос:

1) Задавая в SysTick_Config(480000); я вообще должен видеть 100Гц, потому как промахнулся на один 0, но реально вижу 8,3Гц

2) Если я задаю в SysTick_Config(400000); то вижу 10 Гц, такое впечатление, что между главным клоком и клоком Systick timer стоит делитель на 12, но его там быть не должно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть очевидность скажу, но Вы регистры систика смотрели? Там точно то, что Вам нужно оказывается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, haker_fox said:

Может быть очевидность скажу, но Вы регистры систика смотрели? Там точно то, что Вам нужно оказывается?

Да, в регистрах систика все норм.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, rat сказал:

GCLK generator 1 вывожу на внешний пин и на нем вижу осциллографом 48МГц.

А его зачем? Судя по блок-схеме, правильнее выводить именно с GCLK generator 0, т.к. с него тактируется CPU.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 minutes ago, Arlleex said:

А его зачем? Судя по блок-схеме, правильнее выводить именно с GCLK generator 0, т.к. с него тактируется CPU.

Его вывести мне не удалось, хотя делал все так же, как и для GCLK generator 1, поэтому я не уверен, что главный клок у меня 48МГц

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, Arlleex said:

А что  мешает?

На назначенном пине нет клока, почему, пока не удалось выяснить, причем я перепробовал несколько пинов, GCLK generator 1 выводится, а GCLK generator 0 нет.

12 minutes ago, Arlleex said:

А что  мешает?

    config_pinmux.mux_position = PINMUX_PB15H_GCLK_IO1;
    config_pinmux.direction    = SYSTEM_PINMUX_PIN_DIR_OUTPUT;
    config_pinmux.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
    system_pinmux_pin_set_config(PIN_PB15H_GCLK_IO1, &config_pinmux);
    
    /*config_pinmux.mux_position = PINMUX_PB22H_GCLK_IO0;
    config_pinmux.direction    = SYSTEM_PINMUX_PIN_DIR_OUTPUT;
    config_pinmux.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
    system_pinmux_pin_set_config(PIN_PB22H_GCLK_IO0, &config_pinmux);*/

 

Фрагменты кода для 0 и 1 генераторов, для 1 работает, для 0 (закомментаренный фрагмент) не работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Корпус какой? Наименование МК полностью? Там этих пинов с GCLK_IO0 еще довольно много. PA27, PA28, PA30, например.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, Arlleex said:

Корпус какой? Наименование МК полностью? Там этих пинов с GCLK_IO0 еще довольно много. PA27, PA28, PA30, например.

64. SAMD21J18A. Пробовал на PA27 и PA28. Не заработало. Я впервые работаю с микрочиповскими армами, думал мож, что общеизвестное для тех, кто в теме, сразу и подскажут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По регистрам GCLK проще ориентироваться - возможно, верхний Ваш код никак не влияет на регистры GCLK0, в частности вывод его частоты на GPIO.

Поправил: конечно же, GCLK0, а не GCLK1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, Arlleex said:

По регистрам GCLK проще ориентироваться - возможно, верхний Ваш код никак не влияет на регистры GCLK1, в частности вывод его частоты на GPIO.

Не понял, что Вы хотели сказать. GCLK1 выводится без проблем на PB15. GCLK0 не выводится.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

50 minutes ago, rat said:

На назначенном пине нет клока, почему, пока не удалось выяснить, причем я перепробовал несколько пинов, GCLK generator 1 выводится, а GCLK generator 0 нет.

Возможно у вас генератор GCLK generator 0 не настроен, поэтому и не выводится ничего.

Плюньте на этот ASF и сами все настройте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, dimka76 said:

Возможно у вас генератор GCLK generator 0 не настроен, поэтому и не выводится ничего.

Согласно коду, он настроен. Или возможны косяки ASF?

3 minutes ago, dimka76 said:

Возможно у вас генератор GCLK generator 0 не настроен, поэтому и не выводится ничего.

Плюньте на этот ASF и сами все настройте.

Я сам больше люблю работать с регистрами, но на этом месте работы принято работать на ASF, плюс сроки дичайше ограничены, а для ASF  мне предоставили много примеров. Если в ближайшее время не разберусь, возможно, буду писать на регистрах, но, имхо, для этого потребуется больше времени и риск не уложиться в сроки возрастет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, rat сказал:

Не понял, что Вы хотели сказать. GCLK1 выводится без проблем на PB15. GCLK0 не выводится.

Я хотел сказать, что все эти пляски с ASF и кубоподобием вполне могут указывать на банально кривой код настройки генераторов.
Выведите значения всех регистров модуля GCLK, их там всего 5 штук... Там и будет видно, что и как настроено.

Цитата

...для этого потребуется больше времени и риск не уложиться в сроки возрастет.

За прошедших 2 часа уже несколько раз можно было считать регистры GCLK и сравнить с даташитом - чего там настроено.

Цитата

#  define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE         false

Ну и чего Вы ждете тогда на GPIO от GCLK0?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, Arlleex said:

Я хотел сказать, что все эти пляски с ASF и кубоподобием вполне могут указывать на банальный кривой код настройки генераторов.
Выведите значения всех регистров модуля GCLK, их там всего 5 штук... Там и будет видно, что и как настроено.

 

clk_1.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...