Jump to content

    

Чем заменить 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) ;
}

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
11 минут назад, MX_Master сказал:

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

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

Share this post


Link to post
Share on other sites
/*!*****************************************************************************
  @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

 

Share this post


Link to post
Share on other sites
10 часов назад, uriy сказал:

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

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

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

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

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

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

Edited by mantech

Share this post


Link to post
Share on other sites
8 часов назад, mantech сказал:

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

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

Share this post


Link to post
Share on other sites
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; );
}

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

Share this post


Link to post
Share on other sites
6 часов назад, jcxz сказал:

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

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

Share this post


Link to post
Share on other sites
7 hours ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites

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

bool delay_ready(void)

{

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

}

Share this post


Link to post
Share on other sites
7 часов назад, mantech сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
13 минут назад, adnega сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
33 минуты назад, adnega сказал:

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

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

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

 

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

Share this post


Link to post
Share on other sites
1 minute ago, Arlleex said:

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
17 минут назад, Arlleex сказал:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now