scifi 1 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба #include "stm32l011xx.h" void systick_init(void) { SysTick->CTRL &= SysTick_CTRL_ENABLE_Msk; // stop SysTick timer SysTick->LOAD = 0x00FFFFFF; SysTick->VAL = 0x00FFFFFF; SysTick->CTRL = SysTick_CTRL_ENABLE_Msk; // start SysTick timer } int systick_ticks(void) { return SysTick->VAL; } int systick_diff(unsigned int from, unsigned int to) { return ((from << 8) - (to << 8)) >> 8; } void systick_delay(int ticks) { int start = systick_ticks(); while (systick_diff(start, systick_ticks()) < ticks) ; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MX_Master 1 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба Переполнение значения таймера учитывается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба 11 минут назад, MX_Master сказал: Переполнение значения таймера учитывается? А Вы не видите сдвигов на 8? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба /*!***************************************************************************** @brief Time delay @param VALUE = number of ns, us, ms, s @param UNIT = one from defined time units @note Max delay is (2 ^ 32) / SYSCLK * 4 = 143.165 s */ #define _ns_ 1ULL #define _us_ 1000ULL #define _ms_ 1000000ULL #define _ss_ 1000000000ULL #define DELAY(VALUE, UNIT) \ FourClocks_delay( ( ((VALUE * UNIT * SYSCLK + 2E9) / 4E9) > 1 ) ? \ ((VALUE * UNIT * SYSCLK + 2E9) / 4E9) : 1 ) /*!***************************************************************************** @brief Delay @details Задержка в 4-тактовых интервалах @note Выполняется на 1 такт меньше заданного */ #pragma push #pragma O3 __forceinline void FourClocks_delay(uint32_t FourClocks) { __asm { Loop: SUBS FourClocks, FourClocks, #1 BNE Loop } } #pragma pop Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 6 марта, 2019 Опубликовано 6 марта, 2019 (изменено) · Жалоба 10 часов назад, uriy сказал: Если не секрет для чего вы применяете микросекундные задержки? Не приопмню чтобы у меня возникала в них потребность Значит никогда не работали с интерфейсами, подобными 1Wire... 20 часов назад, MX_Master сказал: Если нужна незатейливая busy waiting задержка, можно ваще без таймеров. Замерить количество выполненных __NOP за микросекунду. Можно и такты посчитать. И юзать это число для для расчёта любой другой задержки. Конечно можно, если требуемая точность плюс\минус лапоть, а если используются прерывания, да еще и несколько и вложенные - о точности можно забыть вообще. Изменено 6 марта, 2019 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба 8 часов назад, mantech сказал: Значит никогда не работали с интерфейсами, подобными 1Wire... 1-wire легко делается на прерываниях таймера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба int systick_diff(unsigned int from, unsigned int to) { return ((from << 8) - (to << 8)) >> 8; } void systick_delay(int ticks) { int start = systick_ticks(); while (systick_diff(start, systick_ticks()) < ticks) ; } Немного "подкую блоху": void systick_delay(uint ticks) { uint start = systick_ticks() << 8; for (ticks <<= 8; start - (systick_ticks() << 8) < ticks; ); } Так будет чуток оптимальнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба 6 часов назад, jcxz сказал: 1-wire легко делается на прерываниях таймера. Согласен, так и делал. Спросили, где используются такие задержки.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба 7 hours ago, jcxz said: Так будет чуток оптимальнее. "Оптимальная задержка" - это спорная философская категория Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба Все равно ваши задержки блокируют ход программы. Можно было использовать типа bool delay_ready(void) { return (start - (systick_ticks() << 8) >= ticks); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба 7 часов назад, mantech сказал: Согласен, так и делал. Спросили, где используются такие задержки.. Реализация на таймере лишена "таких" задержек - все тайминги формируются аппаратно, и CPU на них не спотыкается. Сейчас прикручиваю LCD1602 (HD44780) к STM32F405 в 4-битном режиме. Контроллер дисплея довольно тормознутый при выполнении некоторых команд, и аппаратно не могу ничего придумать, а делать 1мс таймер - слишком жирно. Про NOPы вообще молчу. Кто как выкручивался с HD44780 на быстрых процах? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба 13 минут назад, adnega сказал: Реализация на таймере лишена "таких" задержек - все тайминги формируются аппаратно, и CPU на них не спотыкается. Сейчас прикручиваю LCD1602 (HD44780) к STM32F405 в 4-битном режиме. Контроллер дисплея довольно тормознутый при выполнении некоторых команд, и аппаратно не могу ничего придумать, а делать 1мс таймер - слишком жирно. Про NOPы вообще молчу. Кто как выкручивался с HD44780 на быстрых процах? Вытесняющая RTOS? Выделяем низкоприоритетную задачу вывода на экран, в ней все и рисуем, даже с простыми "блокирующими" задержками ничего страшного не произойдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба 33 минуты назад, adnega сказал: Про NOPы вообще молчу. Кто как выкручивался с HD44780 на быстрых процах? А что там? параллельная шина? Глянул - ой, блин, а нафига такое использовать? Можно-ж нормальный графический на SPI посадить. Да и не выкручиваемся мы - берём МК с подходящей периферией и делаем как надо. А кто сначала выбирает МК, а потом уже думает как к нему прикрутить какое-то железо - вот тот действительно всё время выкручивается. PS: Ну и вообще - DMA+GPIO никто не отменял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба 1 minute ago, Arlleex said: Вытесняющая RTOS? Когда-то, давным давно при слове RTOS у 99,99% программеров случался неизлечимый butthert с очень тяжелыми и продолжительными холиварами. Разумеет, в те античные времена знали лишь про кооперативную, поскольку вытесняющую в принципе негде было запустить (верховодили в те времена PIC и AVR). Но сейчас эти же рассуждения на тему пользовать/не пользовать RTOS звучат как минимум наивно. Практически в каждом проекте проще оставить, чем избежать использование RTOS. Поэтому без оси остаются реально примитивные проекты на крохотных камнях. Только потомственные ардуинщики могут со мной не согласиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба 17 минут назад, Arlleex сказал: Вытесняющая RTOS? Выделяем низкоприоритетную задачу вывода на экран, в ней все и рисуем, даже с простыми "блокирующими" задержками ничего страшного не произойдет. ...пока в проекте нет задачи, требущей иногда массивной обработки данных. Которую логично бы тоже посадить на самый низкий приоритет, чтобы всё фоновое время забирала в те моменты, когда ей это потребуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться