Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

stm32f407 RCC SysTick Keil ASM

Ср фев 16, 2022 23:58:12

:shock:
Черт меня дернул на лыжах покататься.
Решил я попробовать после 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?

Re: stm32f407 RCC SysTick Keil ASM

Чт фев 17, 2022 12:13:51

Штатную частоту контроллера 168 МГц не надо "выжимать", а можно просто включить. Откройте в CubeMX вкладку с тактовыми частотами, установите конфигурацию в наглядном графическом виде и перенесите значение всех делителей в программу.

Где же вы такую траву берёте то? Зачем тут ассемблер? Почему документацию не читаете? И еще много разных вопросов...

Добавлено after 5 hours 31 minute 29 seconds:
СпойлерИзображение
RCC_F407.png
(73.84 KiB) Скачиваний: 48

Re: stm32f407 RCC SysTick Keil ASM

Сб фев 19, 2022 09:35:50

спасибо, удобная программа. :))

Добавлено after 7 hours 56 minutes 4 seconds:
мяу-мяу, что-то я недопопнимау, опытным путем выяснил что мне не преодолеть барьер в 42мГц. Это максимум для APB1. В регистр RCC_CFGR загрузил 0xfc02 что соответствует делению для частоты для APB1 и APB2 на 16. Но оно ни фу-фу. В толмуте к этому регистру таинственная надпись: Access: 0 ≤ wait state ≤ 2, word, half-word and byte access 1 or 2 wait states inserted only if the access occurs during a clock source switch.
Это я должен запрограммировать два такта ожидания или контроллер ждет два такта при переключении источника синхронизации? Попробую через отладчик глянуть что происходит с этим регистром. :sleep:

Re: stm32f407 RCC SysTick Keil ASM

Сб фев 19, 2022 10:01:37

В регистр RCC_CFGR загрузил 0xfc02
Стоп! Перестаньте это делать. Во-первых, вы думаете сейчас все кинутся читать RM на ваш чип, чтобы это расшифровать? Да ну на, у меня более интересные дела найдутся. Во-вторых, вы сами на первом же регистре накосячите. Так что, берём заголовочный файл микроконтроллера и с первой строки кода все имена регистров и бит берём из него. Так и только так!

Re: stm32f407 RCC SysTick Keil ASM

Сб фев 19, 2022 10:03:49

мяу-мяу, что-то я недопопнимау, опытным путем выяснил что мне не преодолеть барьер в 42мГц.

Надеюсь латентность флеша увеличил? (FLASH->ACR)

Re: stm32f407 RCC SysTick Keil ASM

Сб фев 19, 2022 10:12:04

Рановато подcёк :) Там же процесс "дотошного вникания" идёт.

Re: stm32f407 RCC SysTick Keil ASM

Сб фев 19, 2022 11:32:58

После записи в RCC_CFGR 0xfc02 пробую обратно считать содержимое RCC_CFGR, на этом шаге дебагер пишет без остановки :Cannot Acces Memory.
Рою дальше...

Добавлено after 1 hour 4 minutes 23 seconds:
Спасибо все получилось, выставил частоту на 128мгц с латентностью FLASH_ACR_LATENCY[2:0]=2.
В этом же регистре можно задействовать кэш, но это уже другая история. :beer:
Ответить