Иногда в коде для микроконтроллера 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 может в разные моменты с разной скоростью считываться. А то, что размещено в ОЗУ считывается стабильно быстро.