|
Как сделать программную задержку на STM32, без использования таймеров |
|
|
|
 |
Ответов
|
Feb 11 2012, 11:38
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Firer @ Feb 10 2012, 13:51)  Пожалуйста подскажите. Пишу в FreeRTOS. Нужно написать библиотеку работы с LCD. Там нужна задержка около 1мкс. Как ее сделать? Посмотрите DWT счетчик (DWT_CYCCN, описано тут и здесь): присутствует во всех Cortex по стандарту ARM. Это 32-битное слово, которое "тикает" с частотой ядра. Счетчик надо проинициализировать (включить): Код #define DWT_CYCCNT *(volatile uint32_t *)0xE0001004 #define DWT_CONTROL *(volatile uint32_t *)0xE0001000 #define SCB_DEMCR *(volatile uint32_t *)0xE000EDFC
if (!(DWT_CONTROL & 1)) { SCB_DEMCR |= 0x01000000; DWT_CYCCNT = 0; DWT_CONTROL|= 1; // enable the counter } Задержки можно организовывать так: Код uint32_t DWT_Get(void) { return DWT_CYCCNT; } __inline uint8_t DWT_Compare(int32_t tp) { return (((int32_t)DWT_Get() - tp) < 0); }
void DWT_Delay(uint32_t us) // microseconds { int32_t tp = DWT_Get() + us * (SystemCoreClock/1000000)); while (DWT_Compare(tp)); } Безусловно, по причине задержек исполнения самих инструкций абсолютно точно не будет. Однако же, скажем при 72MHz ядра, даже для 1мкс аддитивная составляющая будет небольшой и постоянной.
Сообщение отредактировал KnightIgor - Feb 11 2012, 11:49
|
|
|
|
|
Jun 28 2012, 07:42
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Счетчик надо проинициализировать (включить): - должен подкорректировать, т.к. признаком уже включенного таймера должен служить бит в SCB_DEMCR, а не в DWT_CONTROL - связано с работой под отладчиком. Код #define DWT_CYCCNT *(volatile uint32_t *)0xE0001004 #define DWT_CONTROL *(volatile uint32_t *)0xE0001000 #define SCB_DEMCR *(volatile uint32_t *)0xE000EDFC
if (!(SCB_DEMCR & 0x01000000)) { SCB_DEMCR |= 0x01000000; DWT_CYCCNT = 0; DWT_CONTROL|= 1; // enable the counter }
|
|
|
|
|
Aug 6 2013, 12:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143

|
Цитата(KnightIgor @ Jun 28 2012, 11:42)  Счетчик надо проинициализировать (включить): - должен подкорректировать, т.к. признаком уже включенного таймера должен служить бит в SCB_DEMCR, а не в DWT_CONTROL - связано с работой под отладчиком. Код if (!(SCB_DEMCR & 0x01000000)) { ... } извиняюсь что поднял старый пост. Но у меня так не тикало на LPC1778 - то есть бит DEMCR_TRCENA был установлен, а DWT->CTRL сброшен. Может всё-таки так ? Код if( !( CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk ) || !( DWT->CTRL & DWT_CTRL_CYCCNTENA_Msk ) ) { DWT->CYCCNT = 0; CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; // enable the counter } кстати, кому интересно, расширил разрядность DWT до 64 бит Код //---------------------------------------------------------------------------- u64 core_get_cycles_counter( void ) { TN_INTSAVE_DATA
u64 ret = 0; static u32 cch = 0, ccl_prev = 0; u32 ccl = DWT->CYCCNT; tn_disable_interrupt(); if( ccl_prev > ccl ) cch++; ret = ((u64)cch << 32) + ccl; ccl_prev = ccl; tn_enable_interrupt(); return ret; }
//---------------------------------------------------------------------------- u64 get_sys_mks( void ) { u64 ret = core_get_cycles_counter() / ( F_CPU / 1000000UL ); return ret; }
P.S. в векторе SysTick_Handler системного тика каждую секунду считывает core_get_cycles_counter чтобы DWT->CYCCNT не переполнился более одного раза
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
Сообщений в этой теме
Firer Как сделать программную задержку на STM32 Feb 10 2012, 12:51 Porty используй специально для этого предназначенное клю... Feb 10 2012, 13:11 pitt Цитата(Porty @ Feb 10 2012, 08:11) исполь... Jan 7 2013, 02:02  HHIMERA Цитата(pitt @ Jan 7 2013, 06:02) Никакого... Jan 7 2013, 11:59   pitt Цитата(HHIMERA @ Jan 7 2013, 06:59) Угу..... Jan 27 2013, 00:00    HHIMERA Ну так и не путайте... Jan 27 2013, 09:33 MikeC Попробуйте вставить __no_operation() в тело цикла. Feb 10 2012, 13:13 ChipKiller Цитата("Firer")Может функцию на ассембле... Feb 10 2012, 13:15 Firer C volatile все равно оптимизит.
Вот я тут сам наша... Feb 10 2012, 13:46 demiurg_spb Цитата(Firer @ Feb 10 2012, 16:46) C vola... Feb 10 2012, 17:10 scifi Цитата(Firer @ Feb 10 2012, 17:46) Вопрос... Feb 10 2012, 17:19 Юрий_СВ Цитата(Firer @ Feb 10 2012, 16:46) Вопрос... Feb 10 2012, 17:59 ukpyr Код inline void _delay_loops(U32 loops) {
... Feb 10 2012, 18:10 smk В простых примерах от Keil есть программные задерж... Feb 11 2012, 06:34 smk Вот такое еще работает: DelayMS(2); Feb 11 2012, 07:47 AHTOXA Цитата(KnightIgor @ Feb 11 2012, 17:38) П... Feb 11 2012, 16:05 scifi Действительно, очень интересно. Спасибо за наводку... Feb 11 2012, 18:31 ReAl Очень жаль, что остальные счётчики все 8-битные.
Н... Feb 15 2012, 17:02 Altemir Цитата(ReAl @ Feb 15 2012, 21:02) Очень ж... Feb 16 2012, 05:55 ukpyr не понятно зачем пляски с бубном, выше приводились... Jun 28 2012, 09:01 Влад Р. Цитата(ukpyr @ Jun 28 2012, 12:01) не пон... Jun 28 2012, 11:54 AHTOXA Цитата(ukpyr @ Jun 28 2012, 15:01) не пон... Jun 28 2012, 17:43 Rimsky Цитата(ukpyr @ Jun 28 2012, 18:01) не пон... Aug 12 2013, 02:14  VAI Цитата(Rimsky @ Aug 12 2013, 06:14) Вот к... Aug 12 2013, 09:03   Rimsky Цитата(VAI @ Aug 12 2013, 18:03) Постом в... Aug 12 2013, 14:19 Tahoe С виду все красиво, хотел воспользоваться вышеприв... Jan 6 2013, 16:07 _Артём_ Цитата(Tahoe @ Jan 6 2013, 18:07) С виду ... Jan 6 2013, 16:20  Tahoe Цитата(_Артём_ @ Jan 6 2013, 20:20) А отл... Jan 6 2013, 16:53   _Артём_ Цитата(Tahoe @ Jan 6 2013, 18:53) Логика ... Jan 6 2013, 20:26    Tahoe Цитата(_Артём_ @ Jan 7 2013, 00:26) Но вы... Jan 6 2013, 20:50     KnightIgor Цитата(Tahoe @ Jan 6 2013, 21:50) Напряму... Jan 7 2013, 08:20      _Артём_ Цитата(KnightIgor @ Jan 7 2013, 10:20) Эт... Jan 7 2013, 10:20       KnightIgor Цитата(_Артём_ @ Jan 7 2013, 11:20) Не то... Jan 7 2013, 10:31      Tahoe Цитата(KnightIgor @ Jan 7 2013, 12:20) Ка... Jan 7 2013, 12:38       HHIMERA Цитата(Tahoe @ Jan 7 2013, 15:38) самосто... Jan 7 2013, 12:46        SSerge Цитата(HHIMERA @ Jan 7 2013, 19:46) Смотр... Jan 8 2013, 07:16         HHIMERA Цитата(SSerge @ Jan 8 2013, 11:16) в М0 и... Jan 8 2013, 08:52       KnightIgor Цитата(Tahoe @ Jan 7 2013, 13:38) Итого. ... Jan 27 2013, 10:23        Tahoe Цитата(KnightIgor @ Jan 27 2013, 14:23) Н... Jan 27 2013, 15:05 allsettingsdone Ну а вот я попробывал сделать так:
Код#define F_CP... Jan 31 2013, 12:35 scifi Цитата(allsettingsdone @ Jan 31 2013, 16... Jan 31 2013, 13:13 PoReX Цитата(allsettingsdone @ Jan 31 2013, 16... Jan 31 2013, 13:25 Tahoe Цитата(allsettingsdone @ Jan 31 2013, 16... Jan 31 2013, 14:05 allsettingsdone Так а на чем же остановиться в поиске функции для ... Jan 31 2013, 16:21 Tahoe Цитата(allsettingsdone @ Jan 31 2013, 20... Jan 31 2013, 16:43  HHIMERA Цитата(Tahoe @ Jan 31 2013, 19:43) лишь б... Jan 31 2013, 19:36   Tahoe Цитата(HHIMERA @ Jan 31 2013, 23:36) но в... Jan 31 2013, 20:26  allsettingsdone Цитата(Tahoe @ Jan 31 2013, 18:43) Да на ... Feb 1 2013, 10:08   HHIMERA Цитата(allsettingsdone @ Feb 1 2013, 14:0... Feb 1 2013, 10:27   Tahoe Цитата(allsettingsdone @ Feb 1 2013, 14:0... Feb 1 2013, 12:04 polyname ЦитатаЧто плохого/хорошего скажите про всё это?раб... Feb 1 2013, 12:11 Tahoe Цитата(polyname @ Feb 1 2013, 16:11) а не... Feb 1 2013, 12:24  demiurg_spb Кодvoid dwt_init(void)
{
CoreDebug->D... Apr 22 2013, 16:02 Rash на новых мк приходится штриховать условие (//)
Ко... Aug 7 2013, 06:52 Kot_dnz Цитата(Rash @ Aug 7 2013, 09:52) на новых... Sep 28 2014, 10:45  etoja Можно ещё выдавать байт в неиспользуемый SPI, UART... Oct 2 2014, 15:01 toweroff Тут тоже набрел на решение, которое, как мне кажет... Aug 7 2013, 07:13 megajohn Цитата(toweroff @ Aug 7 2013, 11:13) Тут ... Aug 7 2013, 07:40 ukpyr DMA далеко не всегда используется.
можно добавить... Aug 12 2013, 09:30 MrYuran Цитата(ukpyr @ Aug 12 2013, 12:30) можно ... Aug 12 2013, 09:38 AVR Цитата(Firer @ Feb 10 2012, 16:51) Нужно ... Oct 3 2014, 07:00 kolobok0 Цитата(AVR @ Oct 3 2014, 11:00) Код //for... Oct 3 2014, 07:27  Сергей Борщ Цитата(kolobok0 @ Oct 3 2014, 10:27) толь... Oct 3 2014, 12:56 menzoda kolobok0, AVR
Для большей точности и повторяемост... Oct 3 2014, 12:49
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|