Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2021-дек-06 23:12

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 22 сообщения ]  На страницу 1 2 »
Автор Сообщение
 Заголовок сообщения: Работа с SysTick Timer
СообщениеДобавлено: 2010-янв-11 17:22 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 590
Запустил SysTick Timer. Результаты такие: при задании в регистре CTRL разряда .3 CLKSOURCE=1 таймер считает и генерирует прерывание, а вот при CLKSOURCE=0 таймер не считает. Регистр CALIB в окне памяти всегда читается как 0. Код выдернут из рабочего проекта для STM32 и "адаптирован".
#define __HCLK	32000000UL
#define __SYSTICK_CTRL_VAL        0x00000002
#define __SYSTICK_PERIOD          0x00000001

#if (__SYSTICK_CTRL_VAL & 0x04)
  #define __SYSTICKCLK    (__HCLK)
#else
  #define __SYSTICKCLK    (__HCLK/8)
#endif

#define SYSTICK_CSR_ENABLE    ((unsigned long)0x00000001)
#define SYSTICK_CSR_COUNTFLAG ((unsigned long)0x00010000)

void SysTickSetup(void) 
{
  SysTick->LOAD  = __SYSTICK_PERIOD*__SYSTICKCLK/1000)-1; 
                                                                 // set  reload register
  SysTick->CTRL  = __SYSTICK_CTRL_VAL;  // set clock source and 
                                                                 //Interrupt enable

  SysTick->VAL   =  0;                                          // clear  the counter
  SysTick->CTRL |= SYSTICK_CSR_ENABLE;          // enable the counter
}
В таком виде таймер не считает, а вот если ручками взвести CLKSOURCE, то начинает считать и вырабатывать прерывание.
Источник тактирования СPU - PLL с умножением на 4 от штатного HSE


Вернуться к началу
 Заголовок сообщения: Re: Работа с SysTick Timer
СообщениеДобавлено: 2010-янв-11 17:35 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1318
Откуда: АО "ПКК Миландр"
ЧумА писал(а):
Запустил SysTick Timer. Результаты такие: при задании в регистре CTRL разряда .3 CLKSOURCE=1 таймер считает и генерирует прерывание, а вот при CLKSOURCE=0 таймер не считает. Регистр CALIB в окне памяти всегда читается как 0. Код выдернут из рабочего проекта для STM32 и "адаптирован".
#define __HCLK	32000000UL
#define __SYSTICK_CTRL_VAL        0x00000002
#define __SYSTICK_PERIOD          0x00000001

#if (__SYSTICK_CTRL_VAL & 0x04)
  #define __SYSTICKCLK    (__HCLK)
#else
  #define __SYSTICKCLK    (__HCLK/8)
#endif

#define SYSTICK_CSR_ENABLE    ((unsigned long)0x00000001)
#define SYSTICK_CSR_COUNTFLAG ((unsigned long)0x00010000)

void SysTickSetup(void) 
{
  SysTick->LOAD  = __SYSTICK_PERIOD*__SYSTICKCLK/1000)-1; 
                                                                 // set  reload register
  SysTick->CTRL  = __SYSTICK_CTRL_VAL;  // set clock source and 
                                                                 //Interrupt enable

  SysTick->VAL   =  0;                                          // clear  the counter
  SysTick->CTRL |= SYSTICK_CSR_ENABLE;          // enable the counter
}
В таком виде таймер не считает, а вот если ручками взвести CLKSOURCE, то начинает считать и вырабатывать прерывание.
Источник тактирования СPU - PLL с умножением на 4 от штатного HSE
CLKSOURCE - в IP блоке управляет откуда брать частоту для SYSticka, 0 - внешняя, 1 - внутренняя. У нас сделана только внутренняя, т.е. работает только с 1.

Сейчас посмотрел перевод, его надо будет несколько модифицировать под наш МК.


Вернуться к началу
 Заголовок сообщения: Я тут почесал репу...
СообщениеДобавлено: 2010-янв-11 17:37 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 590
А откуда он берется, этот HCLC/8 ? Его и нет на структурной схеме, т.е. "трудности перевода"?


Вернуться к началу
 Заголовок сообщения: Re: Я тут почесал репу...
СообщениеДобавлено: 2010-янв-11 18:04 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1318
Откуда: АО "ПКК Миландр"
ЧумА писал(а):
А откуда он берется, этот HCLC/8 ? Его и нет на структурной схеме, т.е. "трудности перевода"?
Да, трудности перевода.


Вернуться к началу
 Заголовок сообщения: Примерчик для SysTick
СообщениеДобавлено: 2010-янв-12 10:24 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 590
Поскольку в 1986_map.h про SysTick ничего нет, прилагаю примерчик под "Кайло"


Вложения:
SysTick1986.zip [1.34 КБ]
892 скачивания
Вернуться к началу
 Заголовок сообщения: Приоритет прерывания SysTick
СообщениеДобавлено: 2011-янв-14 13:21 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 590
Можно ли сменить приоритет прерывания SysTick в 1986ВЕ? Сам спросил- сам ответил, виноват, плохо учил мат. часть, сменить можно.


Последний раз редактировалось ЧумА 2011-янв-17 09:54, всего редактировалось 1 раз.

Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-янв-15 13:55 
Не в сети

Зарегистрирован: 2010-апр-22 15:57
Сообщения: 109
Откуда: Москва, Зеленоград
про SysTick есть в core_cm3.h )


Вернуться к началу
 Заголовок сообщения: Re: Работа с SysTick Timer
СообщениеДобавлено: 2012-июл-04 13:39 
Не в сети

Зарегистрирован: 2012-июл-04 13:15
Сообщения: 8
Такая проблема: при использовании дебаггера IAR J-Link и среды IAR Embedded Workbench (6.3) не вызывается systick_handler. Но если просто загрузить прошивку в контроллер - всё обрабатывается правильно. Как заставить работать systick в режиме отладки?


Вернуться к началу
 Заголовок сообщения: Re: Работа с SysTick Timer
СообщениеДобавлено: 2012-июл-04 15:55 
Не в сети

Зарегистрирован: 2011-дек-27 08:33
Сообщения: 111
Откуда: АО "ПКК Миландр"
ALeX-L писал(а):
Такая проблема: при использовании дебаггера IAR J-Link и среды IAR Embedded Workbench (6.3) не вызывается systick_handler. Но если просто загрузить прошивку в контроллер - всё обрабатывается правильно. Как заставить работать systick в режиме отладки?
Возможно проблема в том, что IAR Embedded Workbench при программном сбросе (через IDE) по необъяснимым причинам очищает регистр VTOR в котором хранится адрес таблицы векторов прерывания. Самый простой способ обхода - принудительно задать адрес таблицы в самом начале программы:
SCB->VTOR = 0x08000000;


Вернуться к началу
 Заголовок сообщения: Re: Работа с SysTick Timer
СообщениеДобавлено: 2012-июл-05 16:10 
Не в сети

Зарегистрирован: 2012-июл-04 13:15
Сообщения: 8
Так работает. Спасибо.


Вернуться к началу
 Заголовок сообщения: Re: Работа с SysTick Timer
СообщениеДобавлено: 2012-сен-12 15:37 
Не в сети

Зарегистрирован: 2012-июн-13 14:13
Сообщения: 51
Не получается сформировать задержку на системном таймере. Использую вроде стандартные функции:

/* Управление системным таймером */
void SysTickStart(u32 ticks) {
SYS->STRVR = ticks;
SYS->STCSR = mask_SYS_STCSR_ENABLE | mask_SYS_STCSR_TICKINT | mask_SYS_STCSR_CLKSOURCE;
}


void SysTickStop() {
SYS->STCSR &= ~mask_SYS_STCSR_ENABLE;
}


/* Обработчик прерывания SYSTICK */
void SysTick_Handler(void) {
if (TimerCounter)
TimerCounter--;
}


/* Функция задержки (на базе systick) */
void SysTickDelay(u32 ticks) {
if (ticks) {
TimerCounter = ticks;
SysTickStart(ticks);
while (TimerCounter);
SysTickStop();
}
}

но при обращении типа

SysTickDelay(N);

где-то зависает...


Вернуться к началу
 Заголовок сообщения: Re: Работа с SysTick Timer
СообщениеДобавлено: 2012-сен-13 12:18 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 590
Вопрос не вчитываясь в код - TimerCounter объявлен как volatile? Что происходит с SysTick можно посмотреть при работе в "Кайловском" дебагере, он там есть т.к. входит в ядро.


Вернуться к началу
 Заголовок сообщения: Re: Работа с SysTick Timer
СообщениеДобавлено: 2012-сен-13 13:39 
Не в сети

Зарегистрирован: 2012-июн-13 14:13
Сообщения: 51
пробовал и static и volatile - безрезультатно.
в кайловском дебагере многое есть, но системного таймера нет :(

По логике обращения:
SysTickDelay(N);
ожидал выход после N прерываний по таймеру, каждое прерывание где-то через N тактов.
Выхода не происходит.


Вернуться к началу
 Заголовок сообщения: Re: Работа с SysTick Timer
СообщениеДобавлено: 2012-сен-13 15:00 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 590
Вылезаем из танка :). Peripherals\Core Peripherals\System Tick Timer. Причём описание регистров можно и не подгружать, у меня указан голый Cortex-M3. Нужен именно volatile, а не static.


Вернуться к началу
 Заголовок сообщения: Re: Работа с SysTick Timer
СообщениеДобавлено: 2012-сен-13 15:05 
Не в сети

Зарегистрирован: 2012-июн-13 14:13
Сообщения: 51
Выяснил, что если N достаточно велико (где-то поболее 200), то вполне стабильно отрабатывается задержка.
Если N невелико (у меня было 30), задержка зацикливается...
похоже это связано с временем нажатия на кнопку (у меня запуск по кнопке производится).
До конца пока не разобрался, но хоть где копать знаю...


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 22 сообщения ]  На страницу 1 2 »

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB