Черт меня дернул на лыжах покататься.
Решил я попробовать после Atmega328p освоить Cortex.
По моему разработчики явно перемудрили. Таких сложностей я не ожидал.
Пробую разогнать stm32f407 на китайской плате, используя Keil ассемблер.
Видимо я слишком дотошный, если есть возможность вникнуть в детали, меня сразу тянет туда как магнитом.
Вот текст:
AREA A0
RCC_AHB1ENR DCD 0x40023830
RCC_CR DCD 0x40023800
RCC_PLLCFGR DCD 0x40023804
RCC_CFGR DCD 0x40023808
HSE_ON DCD 0x42000000+(0x23800*0x20)+4*16
HSI_ON DCD 0x42000000+(0x23800*0x20)
PLL_SRC DCD 0x42000000+(0x23804*0x20)+4*22
PLL_ON DCD 0x42000000+(0x23800*0x20)+4*24
GPIOA_MODER DCD 0x40020000
GPIOA_ODR DCD 0x40020014
ODR_bit6 DCD 0x42000000+(0x20014*0x20)+4*6
GPIOA_BSRR DCD 0x40020018
RCC_AHB1ENR_BB DCD 0x42000000+(0x23830*0x20)
STK_CTRL DCD 0xE000E010
STK_LOAD DCD 0xE000E014
AREA A1, CODE
LDR.W R0,HSE_ON ; RCCconfigBegin
MOVS R1,#1
STRB R1,[R0]
ADD R0,#4
NOHSE LDR R1,[R0]
CBNZ R1,HSE_STABLE
B NOHSE
HSE_STABLE LDR.W r0,PLL_SRC
MOVS R1,#1
STRB R1,[R0]
LDR.W r0,RCC_PLLCFGR
MOV R1,#0X1008 ; PLLP=0(/2) PLLN=64 PLLM=8
STRH R1,[R0] ; Fsys=8*(64/8/2)=32MHz
LDR.W R0,PLL_ON
MOVS R1,#1
STRB R1,[R0]
ADD R0,#4
NOPLL LDR R1,[R0]
CBNZ R1,PLL_STABLE
B NOPLL
PLL_STABLE LDR.W r0,RCC_CFGR
MOVS r1,#2
STR r1,[r0] ; RCCconfigEnd
LDR.W R0,RCC_AHB1ENR_BB
MOVS r1,#1
STRB r1,[r0]
LDR.W r0,GPIOA_MODER
MOV R1,#0x5000
STRH R1,[R0]
LDR.W R0,STK_LOAD
MVN r1,#0xFF000000 ; Bits 23:0 RELOAD value
STR r1,[r0]
LDR R0,STK_CTRL
MOVS r1,#7 ; Bit2 CLKSOURCE|Bit1 TICKINT|Bit0 ENABLE
STRB r1,[r0]
loop wfe
B loop
Tick LDR r0,ODR_bit6
LDRB r1,[r0]
CBZ r1,setA6
MOVS r1,#0 ; 0
STRB r1,[r0]
ADD r0,#4
MOVS R1,#1
STRB R1,[R0]
B clrA6
setA6 MOVS r1,#1
STRB r1,[r0]
ADD r0,#4
MOVS R1,#0 ; 0
STRB R1,[R0]
clrA6 BX LR
END
Тут нет только таблицы векторов.
И так эта штучка смогла выдать 32 МГц. По моему неплохо, но в даташите 168 указано.
Сначала включил внешний резонатор. Контроллер еще продолжает работать от внутреннего.
Затем настраиваю модуль ФАПЧ(PLL). Источник синхронизации для ФАПЧ, множитель и два делителя.
Теперь можно выбрать источник системной частоты, я выбрал PLL.
В общем чтобы покороче, я взял минимальное значение множителя и уменьшал делитель на сколько это возможно.
Частоту замерял секундомером по миганию светодиодов. Таймер генерирует исключение каждые 65536*256 циклов.
Каждую секунду два исключения (два переключения светодиодов). что соответствует 32МГц.
Удавалось кому ни-будь выжать 64?