|
|||||||
Время создания: 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 может в разные моменты с разной скоростью считываться. А то, что размещено в ОЗУ считывается стабильно быстро. |
|||||||
Так же в этом разделе:
|
|||||||
![]() |
|||||||
|
|||||||
|