Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

stm32f4 cmsis delay как сделать задержку для lcd

Пн июл 27, 2020 13:51:41

Кто подскажет как правильно написать задержку для LCD

Re: stm32f4 cmsis delay как сделать задержку для lcd

Пн июл 27, 2020 14:34:36

На конечных автоматах, например.

Re: stm32f4 cmsis delay как сделать задержку для lcd

Пн июл 27, 2020 14:48:01

а программно?

Re: stm32f4 cmsis delay как сделать задержку для lcd

Пн июл 27, 2020 14:58:15

тупо - "пустым" циклом
Код:
volatile int delay = 123;
while(delay) delay--;

менее тупо - на основе аппаратного или программного счетчика "системных тиков".
а совсем правильно (имхо, не утверждаю, что для всех LCD приемлемо) - на основе считывания регистра состояния LCD, т.е. работа не по задержке, а по готовности дисплея.

Re: stm32f4 cmsis delay как сделать задержку для lcd

Пн июл 27, 2020 15:30:02

Чтоб соотвецвовало мили миикросекундам?

Re: stm32f4 cmsis delay как сделать задержку для lcd

Пн июл 27, 2020 16:25:31

а программно?

А что КА — железо?
Миллисекундные задержки очень удобно делать на КА: заводим внутренний счетчик и сравниваем на каждом прогоне с SysTick, который системные миллисекунды считает. Вряд ли у вас один прогон "суперлупа" будет длиться больше 1мс, поэтому получаем точность не хуже 1мс.
А вот микросекунды зачастую прямо на месте и отсчитывают — при помощи вспомогательного таймера или тупыми nop'ами в цикле (правда, в этом случае точность будет паршивой). Обычно такие паузы нужны лишь на инициализации, которая все равно в начале проходит и можно считать, что пользователю пофиг, что в течение пяти секунд устройство вообще ни на что не реагирует..

Но, как уже написали, лучший вариант — читать регистры и принимать решение на основе этого.
Или вернуться к конечным автоматам: экранчикам не нужно точных пауз, достаточно (если нет регистра состояний) выдержать определенную. Вот и проходимся по массиву инициализации плавно: дошли до паузы, внутренний счетчик в нужное значение выставили, и ждем. Потом следующий кусок отправляем. И так далее. При этом нет блокирующих пауз, и железяка вовсю будет работать, пока инициализируется экран.

Re: stm32f4 cmsis delay как сделать задержку для lcd

Пн июл 27, 2020 21:21:35

Делаю через DWT

Код:
void DelayMs(uint32_t nTime)
{
   volatile uint32_t CounterTick = nTime * (SystemCoreClock / 1000);

   SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;      //разрешаем использовать счётчик
      DWT_CYCCNT  = 0;                     //обнуляем значение счётного регистра
      DWT_CONTROL |= DWT_CTRL_CYCCNTENA_Msk;      //запускаем счётчик
      while(DWT_CYCCNT < CounterTick);
      DWT_CONTROL &= ~DWT_CTRL_CYCCNTENA_Msk;      //останавливаем счётчик
}

Re: stm32f4 cmsis delay как сделать задержку для lcd

Вт июл 28, 2020 05:05:13

В реферес мануал его нет где прочитать про него?DWT

Re: stm32f4 cmsis delay как сделать задержку для lcd

Вт июл 28, 2020 08:51:10

https://www.google.ru/search?newwindow= ... ent=psy-ab

Re: stm32f4 cmsis delay как сделать задержку для lcd

Вт июл 28, 2020 21:29:19

сорри, забыл добавить дефайны:
Код:
#define    DWT_CYCCNT    *(volatile unsigned long *)0xE0001004
#define    DWT_CONTROL   *(volatile unsigned long *)0xE0001000
#define    SCB_DEMCR     *(volatile unsigned long *)0xE000EDFC

Re: stm32f4 cmsis delay как сделать задержку для lcd

Сб апр 10, 2021 10:55:11

а на базовом таймере как єто сделать?

Re: stm32f4 cmsis delay как сделать задержку для lcd

Ср апр 14, 2021 07:49:53

а на базовом таймере как єто сделать?

Обычно это делается на любом свободном аппаратном таймере методом вычитывания и обработки значения его счетного регистра. Без использования прерываний. Подробнее про реализацию можно прочитать тут. Максимальный интервал времени для такого таймера определяется периодом перезагрузки его счетного регистра.

Re: stm32f4 cmsis delay как сделать задержку для lcd

Ср апр 14, 2021 07:59:52

Professor Chaos писал(а):Подробнее про реализацию можно прочитать тут.
облагороженная версия ардуиновского millis() и ардуиновского же подхода...

Re: stm32f4 cmsis delay как сделать задержку для lcd

Ср апр 14, 2021 12:07:53

1 вариант:
2 вариант:

Re: stm32f4 cmsis delay как сделать задержку для lcd

Ср апр 14, 2021 22:41:39

Dimon456 писал(а):nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;   
        for (; nCount!=0; nCount--);

Вы строите этот код исходя из предположения, что одна итерация цикла for будет исполняться строго за 1 период тактовой частоты ядра? А если это не так? А это, в общем случае не так, и зависит от настроек оптимизации - тогда что?

Во втором варианте не учитывается событие переполнения счетчика: пусть последнее предыдущее значение 0хFFFFFFFF, текущее прочитанное 0. Сколько прошло времени? А что покажет условие?

Re: stm32f4 cmsis delay как сделать задержку для lcd

Чт апр 15, 2021 13:18:17

Professor Chaos писал(а):Вы строите этот код исходя из предположения,
А вот мне "на.... с глубокой горки", главное работает и ладно, просто из вас ни кто ни чего не предложил, кроме слов конечно.

Делаю так:
Professor Chaos писал(а):Во втором варианте не учитывается событие переполнения счетчика
Да плевать и на это
А событие переполнения у вас произойдет где-то через 4294967295/1000/3600/24 = 49 дней.

Не нравится, делайте на конечных автоматах, там все учитывается, да же размер кода.

Re: stm32f4 cmsis delay как сделать задержку для lcd

Чт апр 15, 2021 19:51:55

а как сделать задержку таймером базовым?

Re: stm32f4 cmsis delay как сделать задержку для lcd

Чт апр 15, 2021 23:02:54

а как сделать задержку таймером базовым?

Что такое базовый таймер? Вы, вообще, какой МК имеете ввиду? У ARM много разных ядер, и куча производителей используют их в своих контроллерах/процессорах. И понятие базового таймера везде разное. В ядре есть системный таймер. Другие таймеры каждый производитель реализует как хочет в качестве периферийных устройств.

Re: stm32f4 cmsis delay как сделать задержку для lcd

Чт апр 15, 2021 23:04:11

есть еще варианты как слова в вопросе переставить :)
или такой ответ сойдет:
Код:
TIM3->PSC = 56-1;      // предварительная
TIM3->ARR = 10-1;      // подготовка
TIM3->EGR = TIM_EGR_UG; // таймера
...
TIM3->CR1 = TIM_CR1_CEN|TIM_CR1_OPM;      // старт таймера
...
if (!(TIM3->CR1&TIM_CR1_CEN)) {...;}      // проверка с выполнением, если оттикал
или заLoopить на тупой опрос бита:
while(TIM3->CR1&TIM_CR1_CEN){};            // висеть если еще тикает

:write:

Re: stm32f4 cmsis delay как сделать задержку для lcd

Чт апр 15, 2021 23:15:31

TIM3->CR1 = TIM_CR1_CEN|TIM_CR1_OPM; и будет один импулс.Этот бит _OPM; один импулс
Ответить