Перейти к содержанию
    

Чем заменить DWT на STM32F030F4 для задержек delay_us и _ms?

#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) ;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, MX_Master сказал:

Переполнение значения таймера учитывается?:blush:

А Вы не видите сдвигов на 8?  :shok:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/*!*****************************************************************************
  @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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, uriy сказал:

Если не секрет для чего вы применяете микросекундные задержки?

Не приопмню чтобы у меня возникала в них потребность

Значит никогда не работали с интерфейсами, подобными 1Wire...

20 часов назад, MX_Master сказал:

Если нужна незатейливая busy waiting задержка, можно ваще без таймеров. Замерить количество выполненных __NOP за микросекунду. Можно и такты посчитать. И юзать это число для для расчёта любой другой задержки.

Конечно можно, если требуемая точность плюс\минус лапоть, а если используются прерывания, да еще и несколько и вложенные - о точности можно забыть вообще.

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, mantech сказал:

Значит никогда не работали с интерфейсами, подобными 1Wire...

1-wire легко делается на прерываниях таймера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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) ;
}

Немного "подкую блоху":  :wink:

void systick_delay(uint ticks)
{
    uint start = systick_ticks() << 8;
    for (ticks <<= 8; start - (systick_ticks() << 8) < ticks; );
}

Так будет чуток оптимальнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, jcxz сказал:

1-wire легко делается на прерываниях таймера.

Согласен, так и делал. Спросили, где используются такие задержки..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, jcxz said:

Так будет чуток оптимальнее.

"Оптимальная задержка" - это спорная философская категория :acute:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все равно ваши задержки блокируют ход программы. Можно было использовать типа

bool delay_ready(void)

{

    return (start - (systick_ticks() << 8) >= ticks);

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, mantech сказал:

Согласен, так и делал. Спросили, где используются такие задержки..

Реализация на таймере лишена "таких" задержек - все тайминги формируются аппаратно, и CPU на них не спотыкается.

Сейчас прикручиваю LCD1602 (HD44780) к STM32F405 в 4-битном режиме.

Контроллер дисплея довольно тормознутый при выполнении некоторых команд, и аппаратно не могу ничего придумать, а делать 1мс таймер - слишком жирно.

Про NOPы вообще молчу. Кто как выкручивался с HD44780 на быстрых процах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, adnega сказал:

Реализация на таймере лишена "таких" задержек - все тайминги формируются аппаратно, и CPU на них не спотыкается.

Сейчас прикручиваю LCD1602 (HD44780) к STM32F405 в 4-битном режиме.

Контроллер дисплея довольно тормознутый при выполнении некоторых команд, и аппаратно не могу ничего придумать, а делать 1мс таймер - слишком жирно.

Про NOPы вообще молчу. Кто как выкручивался с HD44780 на быстрых процах?

Вытесняющая RTOS? Выделяем низкоприоритетную задачу вывода на экран, в ней все и рисуем, даже с простыми "блокирующими" задержками ничего страшного не произойдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 минуты назад, adnega сказал:

Про NOPы вообще молчу. Кто как выкручивался с HD44780 на быстрых процах?

А что там? параллельная шина? Глянул - ой, блин, а нафига такое использовать? Можно-ж нормальный графический на SPI посадить.

Да и не выкручиваемся мы - берём МК с подходящей периферией и делаем как надо. А кто сначала выбирает МК, а потом уже думает как к нему прикрутить какое-то железо - вот тот действительно всё время выкручивается. :unknw:

 

PS: Ну и вообще - DMA+GPIO никто не отменял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, Arlleex said:

Вытесняющая RTOS? 

Когда-то, давным давно при слове RTOS  у 99,99% программеров случался неизлечимый butthert с очень тяжелыми и продолжительными холиварами.

Разумеет, в те античные времена знали лишь про кооперативную, поскольку вытесняющую в принципе негде было запустить (верховодили в те времена PIC и AVR).

Но сейчас эти же рассуждения на тему пользовать/не пользовать RTOS звучат как минимум наивно. Практически в каждом проекте проще оставить, чем избежать использование RTOS.

Поэтому без оси остаются реально примитивные проекты на крохотных камнях. 

Только потомственные ардуинщики могут со мной не согласиться.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, Arlleex сказал:

Вытесняющая RTOS? Выделяем низкоприоритетную задачу вывода на экран, в ней все и рисуем, даже с простыми "блокирующими" задержками ничего страшного не произойдет.

...пока в проекте нет задачи, требущей иногда массивной обработки данных. Которую логично бы тоже посадить на самый низкий приоритет, чтобы всё фоновое время забирала в те моменты, когда ей это потребуется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...