¿Por qué STM32 utiliza un proceso de inicialización de dos etapas? ¿Cuál es el propósito principal de cada etapa?

4

Estoy aprendiendo a usar microcontroladores STM32 usando CubeMX para generar un proyecto. Me he dado cuenta de que CubeMX genera dos etapas básicas de inicialización para casi todos los periféricos:

(A) Dentro del archivo stm32fxxxx_hap_msp.c , define una cantidad de devoluciones de llamada de la forma HAL_XXX_MspInit() .

(B) Dentro de main.c , define una serie de funciones de la forma MX_XXX_Init() .

A veces, una función HAL_XYZ_Init() de un periférico se llama desde (A) como lo hace con el ADC y el RTC. Otras veces, una función HAL_XYZ_Init() de un periférico se llama desde (B) como se hace con GPIO.

Ambos conjuntos de funciones llaman a las macros __HAL_RCC_xxxx extensivamente.

No puedo hacer caras o colas del patrón de uso y ni la guía HAL ni el manual de referencia dan mucha dirección aquí.

Entonces, preguntas:

  1. Sospecho que el formato de devolución de llamada proporcionado por (A) tiene algo que ver con la activación de la uC de los modos de baja potencia, pero no estoy seguro de esto. ¿Es correcto o cuál es el propósito del formato de devolución de llamada HAL_XXX_MspInit ?

  2. Noté que (A) contiene más comentarios de bloque de definición de usuario que indican que mi código cohabita con las funciones generadas por CubeMX. Pero, ¿por qué, por ejemplo, estaría mal mover el código de (B) al espacio de (A) para mantener mi secuencia de inicialización clara y fácil de leer?

pregunta ChalkTalk

1 respuesta

4

Pude responder mi propia pregunta.

Las funciones HAL_XXX_MspInit() son llamadas por sus respectivas funciones HAL_XXX_Init() . Como ejemplo, cuando main() llama a su MX_I2C_Init() , esto prepara una estructura global (definida en main.c) para inicializar el periférico I2C.

La pila de llamadas funciona (aproximadamente, con omisiones):

main() [escrito por CubeMX]
MX_I2C_Init() [escrito por CubeMX]
HAL_I2C_Init() [proporcionado por HAL Drivers, copiado en el árbol fuente del proyecto por CubeMX]
HAL_I2C_MspInit() [vacío versión débil proporcionada por HAL Drivers, reemplazada por CubeMX en system_stm32fxxxx.c ]

Tenga en cuenta que esto significa que puede llamar a las funciones _MspInit() y _MspDeinit() durante el tiempo de ejecución de su código. Puede elegir hacer esto, por ejemplo, para cambiar el estado de los recursos de bajo nivel antes o después de un cambio en los modos de energía.

Esta respuesta (y otros detalles relacionados con el flujo de llamadas HAL) solo se indican en el documento Descripción de controladores HAL y LL , y se confirman mejor al verificar el código fuente de HAL. Este código es un poco más amigable de lo que podría esperar, y se encuentra debajo del árbol de su proyecto bajo HAL_Drivers para cualquier proyecto de CubeMX.

    
respondido por el ChalkTalk

Lea otras preguntas en las etiquetas