Форум РадиоКот https://radiokot.ru/forum/ |
|
stm32f4 cmsis delay как сделать задержку для lcd https://radiokot.ru/forum/viewtopic.php?f=59&t=171971 |
Страница 1 из 2 |
Автор: | ivan dimir [ Пн июл 27, 2020 13:51:41 ] |
Заголовок сообщения: | stm32f4 cmsis delay как сделать задержку для lcd |
Кто подскажет как правильно написать задержку для LCD |
Автор: | Eddy_Em [ Пн июл 27, 2020 14:34:36 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
На конечных автоматах, например. |
Автор: | ivan dimir [ Пн июл 27, 2020 14:48:01 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
а программно? |
Автор: | ARV [ Пн июл 27, 2020 14:58:15 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
тупо - "пустым" циклом Код: volatile int delay = 123; while(delay) delay--; менее тупо - на основе аппаратного или программного счетчика "системных тиков". а совсем правильно (имхо, не утверждаю, что для всех LCD приемлемо) - на основе считывания регистра состояния LCD, т.е. работа не по задержке, а по готовности дисплея. |
Автор: | ivan dimir [ Пн июл 27, 2020 15:30:02 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
Чтоб соотвецвовало мили миикросекундам? |
Автор: | Eddy_Em [ Пн июл 27, 2020 16:25:31 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
а программно? А что КА — железо? Миллисекундные задержки очень удобно делать на КА: заводим внутренний счетчик и сравниваем на каждом прогоне с SysTick, который системные миллисекунды считает. Вряд ли у вас один прогон "суперлупа" будет длиться больше 1мс, поэтому получаем точность не хуже 1мс. А вот микросекунды зачастую прямо на месте и отсчитывают — при помощи вспомогательного таймера или тупыми nop'ами в цикле (правда, в этом случае точность будет паршивой). Обычно такие паузы нужны лишь на инициализации, которая все равно в начале проходит и можно считать, что пользователю пофиг, что в течение пяти секунд устройство вообще ни на что не реагирует.. Но, как уже написали, лучший вариант — читать регистры и принимать решение на основе этого. Или вернуться к конечным автоматам: экранчикам не нужно точных пауз, достаточно (если нет регистра состояний) выдержать определенную. Вот и проходимся по массиву инициализации плавно: дошли до паузы, внутренний счетчик в нужное значение выставили, и ждем. Потом следующий кусок отправляем. И так далее. При этом нет блокирующих пауз, и железяка вовсю будет работать, пока инициализируется экран. |
Автор: | lizard66 [ Пн июл 27, 2020 21:21:35 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
Делаю через 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; //останавливаем счётчик } |
Автор: | ivan dimir [ Вт июл 28, 2020 05:05:13 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
В реферес мануал его нет где прочитать про него?DWT |
Автор: | 240265 [ Вт июл 28, 2020 08:51:10 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
https://www.google.ru/search?newwindow= ... ent=psy-ab |
Автор: | lizard66 [ Вт июл 28, 2020 21:29:19 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
сорри, забыл добавить дефайны: Код: #define DWT_CYCCNT *(volatile unsigned long *)0xE0001004
#define DWT_CONTROL *(volatile unsigned long *)0xE0001000 #define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC |
Автор: | ivan dimir [ Сб апр 10, 2021 10:55:11 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
а на базовом таймере как єто сделать? |
Автор: | Professor Chaos [ Ср апр 14, 2021 07:49:53 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
а на базовом таймере как єто сделать? Обычно это делается на любом свободном аппаратном таймере методом вычитывания и обработки значения его счетного регистра. Без использования прерываний. Подробнее про реализацию можно прочитать тут. Максимальный интервал времени для такого таймера определяется периодом перезагрузки его счетного регистра. |
Автор: | ARV [ Ср апр 14, 2021 07:59:52 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
Professor Chaos писал(а): Подробнее про реализацию можно прочитать тут. облагороженная версия ардуиновского millis() и ардуиновского же подхода...
|
Автор: | Dimon456 [ Ср апр 14, 2021 12:07:53 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
1 вариант: СпойлерКод: void Delay(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--); } Спойлерверсия ардуиновского millis()Код: // Конфигурируем и запуск системного таймера // для генерации каждую 1 мс. SysTick->LOAD = 48000000UL/1000 - 1; // Загрузка значения в 1 ms SysTick->VAL = 48000000UL/1000 - 1; // Устанавливаем текущее значение SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; volatile uint32_t currentMillis = 0; //Обработчик прерывания системного таймера void SysTick_Handler(void) { currentMillis++; } uint32_t millis (void) { return currentMillis; } uint32_t previousMillis = 0; if((millis() - previousMillis) > 500){ previousMillis = millis(); //делаем что-то } |
Автор: | Professor Chaos [ Ср апр 14, 2021 22:41:39 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
Dimon456 писал(а): nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms; for (; nCount!=0; nCount--); Вы строите этот код исходя из предположения, что одна итерация цикла for будет исполняться строго за 1 период тактовой частоты ядра? А если это не так? А это, в общем случае не так, и зависит от настроек оптимизации - тогда что? Во втором варианте не учитывается событие переполнения счетчика: пусть последнее предыдущее значение 0хFFFFFFFF, текущее прочитанное 0. Сколько прошло времени? А что покажет условие? |
Автор: | Dimon456 [ Чт апр 15, 2021 13:18:17 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
Professor Chaos писал(а): Вы строите этот код исходя из предположения, А вот мне "на.... с глубокой горки", главное работает и ладно, просто из вас ни кто ни чего не предложил, кроме слов конечно.Делаю так: Спойлер-OsКод: while(1) и вот это строчку{ GPIOA->ODR |= GPIO_Pin_2; Delay(100); // Delay(1); Delay(10); GPIOA->ODR &= ~GPIO_Pin_2; } Код: RCC_Clocks.HCLK_Frequency/10000 добиваю или убираю нулями.А смотреть по осциллографу, или частотомеру Professor Chaos писал(а): Во втором варианте не учитывается событие переполнения счетчика Да плевать и на этоСпойлерКод: if((millis() - previousMillis) > 500){ previousMillis = millis(); blink = !blink; } LCDI2C_setCursor (10,0); if (blink) LCDI2C_write(0x22); else LCDI2C_write(0x20); Не нравится, делайте на конечных автоматах, там все учитывается, да же размер кода. |
Автор: | ivan dimir [ Чт апр 15, 2021 19:51:55 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
а как сделать задержку таймером базовым? |
Автор: | Professor Chaos [ Чт апр 15, 2021 23:02:54 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
а как сделать задержку таймером базовым? Что такое базовый таймер? Вы, вообще, какой МК имеете ввиду? У ARM много разных ядер, и куча производителей используют их в своих контроллерах/процессорах. И понятие базового таймера везде разное. В ядре есть системный таймер. Другие таймеры каждый производитель реализует как хочет в качестве периферийных устройств. |
Автор: | a797945 [ Чт апр 15, 2021 23:04:11 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
есть еще варианты как слова в вопросе переставить ![]() или такой ответ сойдет: Код: 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){}; // висеть если еще тикает ![]() |
Автор: | ivan dimir [ Чт апр 15, 2021 23:15:31 ] |
Заголовок сообщения: | Re: stm32f4 cmsis delay как сделать задержку для lcd |
TIM3->CR1 = TIM_CR1_CEN|TIM_CR1_OPM; и будет один импулс.Этот бит _OPM; один импулс |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |