реклама на сайте
подробности

 
 
> Как сделать программную задержку на STM32, без использования таймеров
Firer
сообщение Feb 10 2012, 12:51
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 7-01-05
Пользователь №: 1 832



Пожалуйста подскажите.
Пишу в FreeRTOS.
Нужно написать библиотеку работы с LCD.
Там нужна задержка около 1мкс.
Как ее сделать?
Может функцию на ассемблере кто подскажет?
Потому что Keil оптимизирует в ничто вот такой код:
i = 100;
while (i --)
;
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Feb 11 2012, 11:38
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jun 28 2012, 07:42
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 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
    }

Go to the top of the page
 
+Quote Post
megajohn
сообщение Aug 6 2013, 12:54
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 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 штук).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 16:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.0147 секунд с 7
ELECTRONIX ©2004-2016