Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/42: Рейтинг темы: голосов - 42, средняя оценка - 4.81
pkm
0 / 0 / 0
Регистрация: 26.11.2015
1

Функции задержки времени

25.09.2011, 23:37. Просмотров 7790. Ответов 9
Метки нет (Все метки)

Какие функции задержки времени вы используете? Мои потуги в использовании задержек какието неудачные, к примеру использую код:
Код
void Delay_ms(uint32_t ms)
{
volatile uint32_t nCount;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq (&RCC_Clocks);

nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
for (; nCount!=0; nCount--);
}
задержки от 10 мс. четкие, далее чем меньше задержка тем больше погрешность. HCLK_Frequency стандартная при старте мк 2 МГц. задержки проверяю логическим анализатором.

Покажите адекватный код на микросекундные задержки, принципе частоты мк в 2 МГц должно хватать на обработку вычисления столь малой задержки, или я ошибаюсь?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2011, 23:37
Ответы с готовыми решениями:

задержки на таймере
Решил пересесть на stm8, сначала было мутновато, но вроде понемногу въезжаю. Как оказалось, в...

Задачи и задержки
Работаю с FriiRTOS и RTX. Возник вопрос. запускаются 2 задачи с одинаковым приоритетом. Обе...

FreeRTOS и длительность задержки
Заранее извиняюсь за глупые вопросы:) Суть проблемы: приспичило мне освоить RTOS. Поднимать начал...

AT89C51. Организация задержки
Доброго времени суток. Возникла задача организовать задержку 3 секунды с помощью 16ти разрядного...

Какие есть функции для задержки времени?
Привет всем. Кто нибудь знает аналогичные функции time.sleep() в python То есть чтобы какое то...

9
ShypKyttir
0 / 0 / 0
Регистрация: 11.06.2011
Сообщений: 322
26.09.2011, 00:47 2
Цитата Сообщение от pkm
...задержки от 10 мс. четкие, далее чем меньше задержка тем больше погрешность.
... ну так Вы же на С пишете, значит задержка зависит и от того, что наваял компилятор. При использовании ассемблера точность получалась до десятых долей микросекунды (при частоте 8..24 МНz)
0
miyvir
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
26.09.2011, 00:53 3
Код
inline void DelayLoop(uint32_t delayLoops)
{
__asm__ __volatile__
(
"1: \n"
" CBZ %[delayLoops], 2f \n"
" SUB %[delayLoops], %[delayLoops], #1 \n"
" B 1b \n"
"2: \n"
: [delayLoops] "+r"(delayLoops)
);
}
Для arm-gcc. Гарантировано 3 такта на один цикл.
0
ShypKyttir
0 / 0 / 0
Регистрация: 11.06.2011
Сообщений: 322
26.09.2011, 01:07 4
Цитата Сообщение от miyvir
Для arm-gcc....
.... хороший gcc - __asm__ __volatile__ :)
0
26.09.2011, 01:07
pkm
0 / 0 / 0
Регистрация: 26.11.2015
26.09.2011, 16:32 5
Цитата Сообщение от ShypKyttir
Цитата Сообщение от pkm
При использовании ассемблера точность получалась до десятых долей микросекунды (при частоте 8..24 МНz)
ну вот может стоит поднять частоту, у меня внешнего кварца нет( придется запаять и тогда тестить буду.
0
riptyti
0 / 0 / 0
Регистрация: 06.08.2011
Сообщений: 534
27.09.2011, 03:03 6
у меня работает такое (цикл проходит за 3 такта):
Код
inline void _delay_loops(U32 loops) __attribute__ ((always_inline));
inline void _delay_loops(U32 loops) {
asm volatile (
"1: \n"
" SUBS %[loops], %[loops], #1 \n"
" BNE 1b \n"
: [loops] "+r"(loops)
);
}

#define _delay_us( US ) _delay_loops( (U32)((double)US * F_CPU / 3000000.0) )
#define _delay_ms( MS ) _delay_loops( (U32)((double)MS * F_CPU / 3000.0) )
#define _delay_s( S )   _delay_loops( (U32)((double)S  * F_CPU / 3.0) )
Перед использованием нужно определить константу F_CPU, и скорректировать при ненулевом такте доступа к flash.
0
Izhyk
0 / 0 / 0
Регистрация: 06.09.2011
Сообщений: 35
28.09.2011, 15:35 7
А я использую SysTick.

Код
(в инициализациях)
SysTick_Config(SystemCoreClock / SYSTICK_PRESCALE / 1000);

(в обработчиках)
uint16_t systysk_prescale_count = 0;
void SysTick_Homdler(void)
{
systysk_prescale_count++;
if(systysk_prescale_count < SYSTICK_PRESCALE)
return;
systysk_prescale_count = 0;

...

Delay_SysTickHomdler();
}

(ну и сама задержка)
volatile uint16_t delay_counter = 0;

void Delay(uint16_t time)
{
delay_counter = time;
while(delay_counter != 0);
}

void Delay_SysTickHomdler() // вызывается из SysTick_Homdler
{
if(delay_counter > 0)
{
delay_counter--;
}
}
Получаю ровно 1мс * timi.
0
Kyrotor
0 / 0 / 0
Регистрация: 29.01.2012
Сообщений: 22
22.02.2012, 00:31 8
Цитата Сообщение от miyvir
Код:
inline void DelayLoop(uint32_t delayLoops)
{
__asm__ __volatile__
(
"1: \n"
" CBZ %[delayLoops], 2f \n"
" SUB %[delayLoops], %[delayLoops], #1 \n"
" B 1b \n"
"2: \n"
: [delayLoops] "+r"(delayLoops)
);
}
Для arm-gcc. Гарантировано 3 такта на один цикл.
А для кейла такое можно сделать?
0
svs39
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
22.02.2012, 11:03 9
Цитата Сообщение от pkm
Какие функции задержки времени вы используете?
время не задержишь...
0
komtrottir
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 500
22.02.2012, 12:31 10
Цитата Сообщение от svs39
Цитата Сообщение от pkm
Какие функции задержки времени вы используете?
время не задержишь...
Философ, однако.
0
22.02.2012, 12:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2012, 12:31

Функция задержки времени
Здравствуйте! Пишу программу на Visual Studio C++, и возник вопрос. Как сделать допустим вывод...

Организация задержки операций по времени
Есть необходимость отправлять запросы с пятисекундным интервалом. Как организовать этот интервал?...

Установка времени задержки сигнала
Доброго времени суток! Столкнулся с задачей определения времени задержки сигнала в Симулинке. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru