Занялся переносом программ с STM32F745 на AT32F437 и наткнулся на вещи, не совместимые с документацией.... Также для меня было новостью, что если используешь кварц 25 МГц, то выстроить 288 МГц не получится. А если взять иной кварц, то не получится с CLKOUT выдать 25/50 МГц для работы ETH PHY. Печалька, но придется использовать кварц 16 МГц, разгонять до 288 МГц, а для ETH использовать свой собственный кварц или генератор.
Но дело даже не в этом.
Я вижу, что некоторые ассемблерные команды исполняются где-то за 6-7 нс, но некоторые - аж за 28-36 нс!
Что я сделал.
Я разогнал AT до 288 МГц. Проверил на таймере - действительно, это так: таймер TMR2 проходит ровно за 1 секунду 144000 такта.
Я в С описал PF10 как выход, а в asm использовал команды для быстрой SET/CLR:
; код установки бита
LDR R5, GPIO_DBG_ptr ;; GPIO_DBG_ptr содержит GPIOF_BASE + смещение регистра SCR
LDR R5, [R5] ; Грузим адрес GPIOF->SCR
MOVS R4, #DBG_SET_BSRR ; R4 <= 1<<10
STR R4, [R5] ; Сохраняем 4 команда
; код сброса бита
LDR R5, GPIO_DBG_ptr ; 5 команда
LDR R5, [R5] ; Грузим адрес GPIOF->SCR
MOVS R4, #DBG_CLR_BSRR ; R4 <= 1<<(10+16)
STR R4, [R5] ; Сохраняем 8 команда
Код разместил в FLASH, вся программа целиком (включая эти команды) влезла чуть более чем 16 кБ, загружена начиная с 0x08000000, т.е. она 100% попала в область NWS (WS=0).
Если просто запустить эти 8 команд, то при помощи осциллографа можно поймать импульс длиной аж в 70 нс!
Идем дальше. Если убрать команды 5-6, то импульс резко сокращается до 10 нс.
Опытным путем выяснил, сколько исполняются каждая из команд:
LDR R5, GPIO_DBG_ptr ; 36 нс! (это по сути команда LDR R5, [PC + 60], PC смотрит на Flash NWS (0 WS))
LDR R5, [R5] ; 24 нс!
MOVS R4, #DBG_SET_BSRR ; эта и следующая - около 10 нс.
STR R4, [R5] ;
Получается, что взять значение из периферии дольше, чем туда положить....
Может кто-нибудь в курсе, что можно сделать, чтобы нивелировать такую разницу?
Всем спасибо



