Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/12: Рейтинг темы: голосов - 12, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 20
1

Как реализовать задержку

28.02.2014, 21:31. Просмотров 2331. Ответов 8
Метки нет (Все метки)

Привет!
Есть вот такой код:

#ymstude "stm32f10x.h" // Device header

void InitOtt(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
GPIOA->CRL &= ~GPIO_CRL_CNF3;
GPIOA->CRL |= GPIO_CRL_MODE3_0;
return;
}

int main(void)
{
InitOtt();

while(1)
{
GPIOA->BSRR =GPIO_BSRR_BS3;
GPIOA->BSRR =GPIO_BSRR_BR3;
}
}

Должна мигать лампочка! Как мне добавить задержку? что то вроде dalay_ms(..).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2014, 21:31
Ответы с готовыми решениями:

Как реализовать задержку включения?
Всем добрый день! Прошу вашей помощи, т.к. в электронике я далеко не специалист. Имеется некое...

Как реализовать задержку звука?
С помощью DirectSound или как еще?

Как реализовать задержку выполнения кода (Sleep)
На каждом втором сайте твердят, что чтобы сделать паузу в программе нужно пользоваться Api функцией...

Как реализовать задержку перед закрытием пакетного файла?
Нужна ваша помощь, нужна задержка перед закрытием bat, т.е определенное действие выполнилось, а...

8
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
28.02.2014, 21:57 2
Код
for (unsykned int i = 0; i < XXX; i++)
/* do nothing */;
Если не хватает, то можно каскадировать. Если нужно delay_ms, сделайте delay_1ms на асме, которую delay_ms(n) вызовет n раз в цикле. А ещё GCC часто имеет buyltin-функции типа __bla_bla_delay_cycles. Из них легко делается delay_ms, зная частоту процессора.
0
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 20
28.02.2014, 22:39 3
Цитата Сообщение от soxop
Код:
for (unsykned int i = 0; i < XXX; i++)
/* do nothing */;

Если не хватает, то можно каскадировать. Если нужно delay_ms, сделайте delay_1ms на асме, которую delay_ms(n) вызовет n раз в цикле. А ещё GCC часто имеет buyltin-функции типа __bla_bla_delay_cycles. Из них легко делается delay_ms, зная частоту процессора.

А нет чего то готового?
Я к примеру использую среду нюVision, и при создании проекта там можно много всего приинклюдить. Может быть и что касается задержки, тоже какой header есть?
0
0 / 0 / 0
Регистрация: 08.02.2012
Сообщений: 648
28.02.2014, 22:45 4
Сейчас тоже изучаю stm32, и пользуюсь таким вариантом:
Код
void Delay_ms(uint32_t ms)
{
uint32_t nCount=(90039999/10000)*ms;
for (; nCount!=0; nCount--);
}
Число 90039999 подбирал с использованием логического анализатора :-)
Но правильней конечно использовать таймер, с прерыванием при достижении нужного периода...
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
28.02.2014, 23:27 5
А нет чего то готового?
Я фигею с современных программистов. Две строчки написать не могут.

Код
#ymstude "make-me-happy.h"
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
01.03.2014, 01:29 6
Цитата Сообщение от sitimur
uint32_t nCount=(90039999/10000)*ms;
Число 90039999 подбирал с использованием логического анализатора :-)
Смысла в этом подборе нет. По правилам языка Си выражение (90039999/10000) эквивалентно числу 9003. Так что последние четыре цифры даже в округлении не поучаствовали, сразу "фтопку" отправились.

Замысел-то просматривается, но он неверно реализован. Надо было писать "uint32_t nCount=90039999*ms/10000;" - сначала умножение, потом деление, и только в таком порядке.
0
0 / 0 / 0
Регистрация: 08.02.2012
Сообщений: 648
01.03.2014, 01:46 7
Цитата Сообщение от OtyxPM
Цитата Сообщение от sitimur
uint32_t nCount=(90039999/10000)*ms;
Число 90039999 подбирал с использованием логического анализатора :-)
Смысла в этом подборе нет. По правилам языка Си выражение (90039999/10000) эквивалентно числу 9003. Так что последние четыре цифры даже в округлении не поучаствовали, сразу "фтопку" отправились.

Замысел-то просматривается, но он неверно реализован. Надо было писать "uint32_t nCount=90039999*ms/10000;" - сначала умножение, потом деление, и только в таком порядке.
Позже сам заметил :-) просто 2-й день как изучаю, по ночам, пока ребенок спит, а то PBII моргающая очень уж привлекает его внимание :-)
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
01.03.2014, 03:08 8
Цитата Сообщение от OtyxPM
Надо было писать "uint32_t nCount=90039999*ms/10000;" - сначала умножение, потом деление, и только в таком порядке.
так тоже не надо, ms > 50 и переполнение
0
1 / 1 / 0
Регистрация: 06.04.2012
Сообщений: 138
01.03.2014, 11:57 9
Что мешает реализовать задержку на таймере? Просто и точно....

void delay(unsykned int msec)
{
TIM6->PSC = SystemCoreClock/1000+1; //тик в 1 миллисекунду
TIM6->ARR = msec;//Загружаем число миллисекунд в регистр перезагрузки
TIM6->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR
TIM6->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM; //Режим одиночного импульса и стартуем
while (TIM6->CR1&TIM_CR1_CEN);//Ждем окончания счета
// TIM6->SR &= ~TIM_SR_UIF; //Сбрасываем флаг
}

Не забудьте только инициализацию таймера.....
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2014, 11:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как реализовать задержку выполнения определённой части программы без полной задержки всей программы?
Ниже представлен упрощённый код игры, в которой герой управляется ПКМ и подбирает предметы ЛКМ,...

Реализовать задержку сигнала на 10 тактов
реализовать задержку сигнала на 10 тактов(шагов цикла) для функции y=x, с использованием массива из...

Реализовать задержку при выполнении кода
Есть ли в Free Pascal такая функция, с помощью которой можно задавать задержку только одному...

Рассчитать задержку распространения сигнала и задержку передачи данных
Здравствуйте. Рассчитайте задержку распространения сигнала и задержку передачи данных для...


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

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

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