Probablemente sea un error estúpido, pero no puedo entender lo que está pasando.
Tengo una placa Discovery con STM32L100RC .
El oscilador HSI se ejecuta a 16 MHz y se selecciona como la fuente del reloj del sistema, por lo que todo debería estar funcionando a 16 MHz. El llamador AHB está inhabilitado.
Según la hoja de datos, el reloj está dividido por 8 antes de ser enviado a systick.
Tengo la recarga de SysTick configurada como 0xFFFFFF
(lo que me daría 1 Hz si SysTick estuviera a 16 MHz). Y yo estoy recibiendo una interrupción de SysTick de 1 Hz.
El problema es que eso significa que el reloj principal funciona a 128 MHz, ciertamente no.
¿Qué explicaría la frecuencia de SysTick que estoy obteniendo?
¿Está mal la hoja de datos?
Para completar, el código utilizado para configurar los relojes:
ALIGN
RCC_CNF
PUSH {LR}
; FLASH timing config
LDR R0, =FLASH_ACR
LDR R1, [R0]
ORR R1, R1, #FLASH_ACR_ACC64
STR R1, [R0]
LDR R1, [R0]
ORR R1, R1, #(FLASH_ACR_PRFTEN :OR: FLASH_ACR_LATENCY)
STR R1, [R0]
; Enable HSI
LDR R0, =RCC_CR
LDR R1, [R0]
ORR R1, R1, #RCC_CR_HSION
STR R1, [R0]
; Wait for HSIRDY
ALIGN
NO_HSI_RDY LDR R1, [R0]
TST R1, #RCC_CR_HSIRDY
BEQ NO_HSI_RDY
; Select HSI as clock source
LDR R0, =RCC_CFGR
LDR R1, [R0]
BIC R1, R1, #RCC_CFGR_SW
ORR R1, R1, #RCC_CFGR_SW_HSI
STR R1, [R0]
POP {PC}
Y mi código de configuración de SysTick:
; Configure SysTick
LDR R0, =SysTick_CSR
LDR R1, [R0]
; use internal clock & enable counting
ORR R1, R1, #(SysTick_CSR_ENABLE :OR: SysTick_CSR_CLKSOURCE)
STR R1, [R0]
; Configure the reload register
LDR R1, =0xFFFFFF
LDR R0, =SysTick_RELOAD
STR R1, [R0]
; Enable SysTick interrupt
LDR R0, =SysTick_CSR
LDR R1, [R0]
ORR R1, R1, #(SysTick_CSR_TICKINT)
STR R1, [R0]
En el controlador de interrupciones, solo estoy alternando un LED.