STM32F103C8 работает с максимальной тактовой частотой 72 МГц. Таким образом, 36 МГц - это максимальная частота, которая может быть сгенерирована на GPIO, поскольку для установки и очистки вывода требуется отдельный тактовый цикл. Эта частота может быть достигнута только с помощью таймера.
Если вы попробуете то же самое с кодом, вам понадобится как минимум три инструкции: два хранилища и одна ветвь. Для выполнения этих инструкций требуется около 6 тактов и, следовательно, максимальная частота составит около 12 МГц.
Чтобы добиться этого в программном обеспечении, ваш код должен выглядеть примерно так:
while (1) {
GPIOA->ODR = 1 << 8;
GPIOA->ODR = 0;
}
Код ассемблера не требуется, поскольку компилятор подберет оптимальный код. Это будет выглядеть так:
ldr r3, .L3
movs r1, #128
movs r2, #0
.L2:
str r1, [r3]
str r2, [r3]
b .L2
.L3:
.word 1207959572
Обновление
Я проверил его на устройстве реального мира и получаю частоту 8 МГц. Моя оценка заключалась в том, что для этих трех инструкций необходимо 6 тактов, но, похоже, требуется 9 циклов.
Сгенерированный код более или менее соответствует ожидаемому:
7a: 60d9 str r1, [ r3, # 12] 7 c: 60da str r2, [r3, # 12] 7e: e7f c bn 7a
Область действия ясно показывает, что все три инструкции занимают одинаковое количество времени.