Сила в умении комбинировать ASM + C/C++
или C/C++ + ASM
и сразу пример:
Код из первого сообщения темы - Провел тест. OLED дисплей 128x64 на чипе SSD1306 подключен через I2C, соплями, без пайки и работает с частотой 271+ FPS
Глубоко не полезу - одна функция __reset
...
uint32_t const __Vector_Table [] __attribute__ ((section ("RESET")))={
(uint32_t) &__Vector_Table [2], //Top of stack
(uint32_t) &__reset, //Reset handler
0x20005000,
PERIPH_BB_BASE+((uint32_t)&RCC->CR-PERIPH_BASE)*32+RCC_CR_HSION_Pos*4,
PERIPH_BB_BASE+((uint32_t)&FLASH->ACR-PERIPH_BASE)*32+POS(FLASH_ACR_LATENCY_1)*4,
(uint32_t)&RCC->CFGR,
RCC_CFGR_PLLMULL9|RCC_CFGR_PLLSRC|RCC_CFGR_PPRE1_DIV2,
PERIPH_BB_BASE+((uint32_t)&RCC->CFGR-PERIPH_BASE)*32+POS(RCC_CFGR_SW_1)*4
};
...
void __attribute__ ((naked)) __reset(void){
__asm volatile(
"POP {r1-r6,r8,r9,r10} \n\t"
"MOV sp,r1 \n\t"
"MOVS r1,1 \n\t"
"STR r1,[r2,%0] \n\t" //HSE On
"STR r1,[r3] \n\t" //FLASH LATENCY = 2
"wait_HSERDY: \n\t"
"LDR r0,[r2,%1] \n\t"
"MOVS r0,r0 \n\t"
"BEQ wait_HSERDY \n\t"
"STR r5,[r4] \n\t" //PLL MULL = 9
"STR r1,[r2,%2] \n\t" //PLL On
"wait_PLLRDY: \n\t"
"LDR r0,[r2,%3] \n\t"
"MOVS r0,r0 \n\t"
"BEQ wait_PLLRDY \n\t"
"STR r1,[r6] \n\t" //PLL selected as system clock
"wait_PLL: \n\t"
"LDR r0,[r6,%4] \n\t"
"MOVS r0,r0 \n\t"
"BEQ wait_PLL \n\t"
"STR r7,[r2] \n\t" //HSI Off
"STR r9,[r8,4] \n\t"
"STR r10,[r8] \n\t"
"B __main \n\t"
:
: "X" ((RCC_CR_HSEON_Pos-RCC_CR_HSION_Pos)*4),
"X" ((RCC_CR_HSERDY_Pos-RCC_CR_HSION_Pos)*4),
"X" ((RCC_CR_PLLON_Pos-RCC_CR_HSION_Pos)*4),
"X" ((RCC_CR_PLLRDY_Pos-RCC_CR_HSION_Pos)*4),
"X" ((POS(RCC_CFGR_SWS_1)-POS(RCC_CFGR_SW_1))*4)
:
);
}
Первый же POP заполнит кучу регистров данными из “таблицы векторов” и с этими данными (в основном через bit-banding) STM32 запустится на 72 МГц …
Считанные байты кода и процессор готов к main …
Какого размера код под STM32 порождает запуск на 72 МГц (void Set_SysClock72Mhz(void)) и пустой main у вас ?
На чём этот код ??? C/C++ + ASM …