Can't enable PLL properly for STM32F767
Hi,
I'm having a hard time configuring the system clock. It seems that I'm achieving 16MHz, but I want to run at full speed (216MHz). From what I'm seeing, the problem is that the System Clock Switch isn't changing to PLL. If I try to change bits 1:0 in the RCC_CFGR register, the status returns that the HSI is enabled.
RCC_BASE EQU 0x40023800
RCC_CR EQU RCC_BASE ;offset 0x00
RCC_CFGR EQU 0x40023808 ;offset 0x08
RCC_PLLCFGR EQU 0x40023804 ;offset 0x04
RCC_AHB1ENR EQU 0x40023830 ;offset 0x30
GPIOB_BASE EQU 0x40020400
GPIOB_MODER EQU GPIOB_BASE ;offset 0x00
GPIOB_ODR EQU 0x40020414 ;offset 0x14
GPIOB_EN EQU (1 << 1)
MODER0_OUT EQU (1 << 0)
PLLM EQU (4 << 0)
PLLN EQU (216 << 6)
PLLP EQU ((0 << 16) :OR: (0 << 17))
PLLQ EQU (9 << 24)
PLLHSE EQU (1 << 22)
AREA STM32, CODE, READONLY
ENTRY
EXPORT __main
__main
BL ENABLE_CLOCK
BL ENABLE_GPIOB
B CONTINUE
ENABLE_CLOCK
LDR R0, =RCC_CR
LDR R1, [R0]
ORR R1, #(1 << 18) ;HSE BYPASS
STR R1, [R0]
LDR R0, =RCC_CR
ORR R1, #(1 << 16) ;HSE ENABLE
STR R1, [R0]
HSE_READY LDR R0, =RCC_CR ;LOOP UNTIL READY
LDR R1, [R0]
AND R1, #(1 << 17)
MOVS R0, R1
BEQ HSE_READY
LDR R0, =RCC_PLLCFGR ;SET 216MHZ CLOCK
LDR R1, [R0]
ORR R1, #PLLM
ORR R1, #PLLN
ORR R1, #PLLP
ORR R1, #PLLQ
ORR R1, #PLLHSE
STR R1, [R0]
LDR R0, =RCC_CR
LDR R1, [R0]
ORR R1, #(1 << 24) ;PLL ON
STR R1, [R0]
PLL_LOCK LDR R0, =RCC_CR ;LOOP UNTIL READY
LDR R1, [R0]
AND R1, #(1 << 25)
MOVS R0, R1
BEQ PLL_LOCK
LDR R0, =RCC_CFGR
LDR R1, [R0]
ORR R1, #(2 << 0) ;PLL AS SYSCLK
STR R0, [R0]
;SYSCLK_STATUS LDR R0, =RCC_CFGR ;LOOP UNTIL READY
; LDR R1, [R0]
; AND R1, #(2 << 2)
; MOVS R0, R1
; BEQ SYSCLK_STATUS
BX LR
ENABLE_GPIOB
LDR R0, =RCC_AHB1ENR ;EN GPIO CLOCK
LDR R1, [R0]
ORR R1, #GPIOB_EN
STR R1, [R0]
LDR R0, =GPIOB_MODER ;SET OUTPUT
LDR R1, [R0]
ORR R1, #MODER0_OUT
STR R1, [R0]
BX LR
CONTINUE
LDR R1, =GPIOB_ODR ;OUTPUT DATA REGISTER
MOVW R0, #(1 << 0)
BLINK
LDR R2, =16000000
EOR R0, #(1 << 0)
STR R0, [R1]
BL DELAY
B BLINK
DELAY
SUBS R2, R2,#1
BNE DELAY
BX LR
ALIGN
ENDI'm doing the following steps: set HSE to bypass, enable HSE, set PLLM, N, P and Q, enable PLL and finally (but not working) switching the system clock to PLL.
