MyTetra Share
Делитесь знаниями!
Функции задержек на заданное количество машинных циклов и миллисекунд для STM32
Время создания: 04.05.2022 09:30
Текстовые метки: stm32, delay, function, задержка, функция, время, машинный цикл, миллисекунды
Раздел: Компьютер - Аппаратное обеспечение - Микроконтроллеры ARM
Запись: xintrea/mytetra_syncro/master/base/16516458287lr5czdh45/text.html на raw.github.com

Иногда в коде для микроконтроллера STM32 необходимо сделать задержку. Часто задержку делают "наобум" с использованием цикла и какого-то вычисления в нем. Но есть готовые решения, которые позволяют делать задержку на заданное количество машинных тактов или на заданное количество миллисекунд.


Функция для задержки на заданное количество машинных тактов:



__attribute__((noinline, section(".ramfunc")))

void delay_cycles(uint32_t cycles)

{

cycles /= 4;


asm volatile (

"1: subs %[cycles], %[cycles], #1 \n"

" nop \n"

" bne 1b \n"

: [cycles] "+l"(cycles)

);

}



Функция, выполняющая задержку в миллисекундах:



__attribute__((noinline, section(".ramfunc")))

static void delay_ms(int ms)

{

uint32_t cycles = ms * F_CPU / 3 / 1000;


asm volatile (

"1: subs %[cycles], %[cycles], #1 \n"

" bne 1b \n"

: [cycles] "+r"(cycles)

);

}



В этой функции происходит деление частоты процессора на


Видно, что код этих функций размещается в ОЗУ (RAM). Это сделано из-за того, что существует мнение, что код из FLASH может в разные моменты с разной скоростью считываться. А то, что размещено в ОЗУ считывается стабильно быстро.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования