¿Cómo se asocian estas direcciones base con estas estructuras en C incrustado?

mirando el enlace de detalles de la pregunta Macros, Direcciones base y funciones de API, hay varias preguntas. Lo intentaré desde abajo

Incluso aquí:

#definir USART1 ((USART_TypeDef *) USART1_BASE) / ** <puntero base USART1 * /

El paso de la estructura como primer parámetro (y la dirección base como segundo parámetro) a la macro solo es relevante cuando llamo a esa macro directamente … ¿sí?

No hay parámetros pasados ​​a esta macro, y la macro no se “llama”. Las macros son reemplazos de texto realizados por el preprocesador, antes de la compilación.

El preprocesador escanea el archivo fuente y reemplaza cada aspecto del token USART1 con, letra por letra (técnicamente, token por token) el texto ((USART_TypeDef *) USART1_BASE) (los comentarios se ((USART_TypeDef *) USART1_BASE) en un pase anterior). Como USART1_BASE también es una macro, se reemplaza letra por letra con su contenido, que era (0x4000C400UL) .

Entonces, cuando su código fuente tiene

USART1-> RUTA

El código fuente real que verá el compilador es:

(USART_TypeDef *) (0x4000C400UL) -> RUTA

Que toma esa dirección fija, la convierte en un puntero a esa estructura y accede a un miembro de esa estructura imaginada a través de ese puntero.

Será útil aprender cómo expandir las macros usted mismo para que pueda leer el mismo código fuente que leerá el compilador: para gcc, clang e intel es la opción -E. Para Visual Studio es la opción /E