STM32L100 SysStick no dividido por 8?

2

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.

    
pregunta MightyPork

1 respuesta

2

De acuerdo, pensé que nadie me respondería aquí, así que probé un poco de experimentación.

Resulta que, a partir de ARMv6, el significado de SysTick_CSR_CLKSOURCE ha cambiado:

  • 0 = reloj del sistema / 8
  • 1 = reloj del sistema

Lo tenía configurado para 1 , lo que explica todo.

Si solo las hojas de datos no fueran tan confusas ...

    
respondido por el MightyPork

Lea otras preguntas en las etiquetas