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

 
 
> Как сделать программную задержку на 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
5 страниц V  « < 3 4 5  
Start new topic
Ответов (60 - 66)
Rimsky
сообщение Aug 12 2013, 14:19
Сообщение #61





Группа: Участник
Сообщений: 14
Регистрация: 10-06-12
Пользователь №: 72 261



Цитата(VAI @ Aug 12 2013, 18:03) *
Постом выше megajohn написал, почему Ваши задержки будут кривыми... + к этому, ещё и срабатывание прерываний во время исполнения циклов.

Да, проверил, есть такой косяк. Сделал по другому, может уже и не в тему топика, поскольку заюзал таймер:

Код
#define F_CPU    24000000UL

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM6->CR1 |= TIM_CR1_CEN;


// Процедура формирования линейной задержки
#pragma inline=forced
void __delay_loops(uint16_t loops)
{
    TIM6->CNT = 0x0000;
    while(loops > TIM6->CNT);
}

#define __delay_us( US ) __delay_loops( (uint16_t)(US * (uint16_t)(F_CPU / 1000000UL)) )

#pragma inline=forced
void __delay_ms(uint16_t ms){
    do{     
        __delay_us(1000);
    }
    while(ms--);
};
Go to the top of the page
 
+Quote Post
Kot_dnz
сообщение Sep 28 2014, 10:45
Сообщение #62





Группа: Новичок
Сообщений: 6
Регистрация: 4-07-14
Пользователь №: 82 154



Цитата(Rash @ Aug 7 2013, 09:52) *
на новых мк приходится штриховать условие (//)
Код
if (!(SCB_DEMCR & 0x01000000))

потом расштриховываешь и всё нормально работает при отладке. Правда это на STM32F4/
С чем связано ещё не разбирался

О, а можно с этого места по подробнее.
Подключен stm32f103, из IAR прошиваю через ST-LINK, функция расшифровки ногодрыга реализована через DWT - все работает как ожидалось.
Сбрасываю питание - функция перестает работать. Никакие электролиты и пр на питании не помогают. Остальные функции работают как нужно.
CODE
void DWT_Init(void)
{
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
}

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 * (F_CPU/1000000);
while (DWT_Compare(tp));
}

что я делаю не так?

Цитата(Kot_dnz @ Sep 28 2014, 13:15) *
[code]void DWT_Init(void)
{
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
}


Сорри, нашел - не хватало строки
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
интересное проявление баго-фичи...

Сообщение отредактировал IgorKossak - Sep 28 2014, 18:59
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
etoja
сообщение Oct 2 2014, 15:01
Сообщение #63


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

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Можно ещё выдавать байт в неиспользуемый SPI, UART или дёргать ножки вывода. Эти операции тоже идут долго.
Go to the top of the page
 
+Quote Post
AVR
сообщение Oct 3 2014, 07:00
Сообщение #64


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(Firer @ Feb 10 2012, 16:51) *
Нужно написать библиотеку работы с LCD.
Там нужна задержка около 1мкс.

Я решаю это так (и на STM32 и на MDR32 и на других):
Код
unsigned int delay_ms(unsigned int ms)
{
    volatile unsigned int i, t = 0;
    //for(i = 0; i < (ms*400); i++) t++; // @ 8 MHz
    for(i = 0; i < (ms*5714); i++) t++;
    return t;
}

unsigned int delay_10us(unsigned int us)
{
    volatile unsigned int i, t = 0;
    //for(i = 0; i < (us*4); i++) t++; // @ 8 MHz
    for(i = 0; i < (us*57); i++) t++;
    return t;
}

Сначала мигаю светодиодом на delay_ms(1000) - периоды были несколько секунд - так вычисляю во сколько раз мне нужно меньше чтобы была как можно ближе к одной секунде. Получил число допустим 5714. Ну а 10 мкс - это в 100 раз меньше - 57.

Знаю какие недостатки этого метода, но лично мне нравится и всё работает стабильно sm.gif


--------------------
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Oct 3 2014, 07:27
Сообщение #65


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(AVR @ Oct 3 2014, 11:00) *
Код
    //for(i = 0; i < (ms*[b]400[/b]); i++) t++; // @ 8 MHz
    for(i = 0; i < (ms*[b]5714[/b]); i++) t++;

    //for(i = 0; i < (us*[b]4[/b]); i++) t++; // @ 8 MHz
    for(i = 0; i < (us*[b]57[/b]); i++) t++;

...мне нравится и всё работает стабильно sm.gif


почему бы и нет?
только маленьчкое замечание: цифры я бы вычислял бы в зависимости от дефайна тактовой. Тем более в STM вроде как они объявлены. Тогда писать новые строчки под разную частоту не понадобиться.
И по закону мерфи - меньше кода, меньше багов...

ЗЫ
И ещё бы добавил ифдеф для делителей меньше 1 или 2... Типа вонинг! не допустимо маленький делитель(умножитель - кому как sm.gif ) для данных функций.
Go to the top of the page
 
+Quote Post
menzoda
сообщение Oct 3 2014, 12:49
Сообщение #66


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530



kolobok0, AVR

Для большей точности и повторяемости можно реализовать на ассемблере, получится совсем немного инструкций, можно будет точнее вычислить кол-во тактов на один цикл, не будет плавать из-за смены опций компиляции. Чтобы не мешали прерывания можно их запрещать на время задержки.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 3 2014, 12:56
Сообщение #67


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kolobok0 @ Oct 3 2014, 10:27) *
только маленьчкое замечание:
И настройки оптимизации, а также версию компилятора прибить гвоздями к этому исходнику. Чтобы времянки случайно не уплыли.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 04:18
Рейтинг@Mail.ru


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