núcleos ARM Cortex con periféricos, requisitos básicos

3

He estado leyendo muchas cosas sobre el uso de la cadena de herramientas ARM para crear aplicaciones para diferentes microcontroladores, incluidos los núcleos ARM. En este momento, he estado usando la ruta bastante fácil con Atmel Studio 7 para dispositivos xmega.

Entiendo que Atmel Studio 7 proporciona los archivos de cabecera para sus dispositivos (en mi caso, el ATSAME70Q21.h o el XMEGA64A3U.h para proyectos anteriores) que apunta a todos los periféricos disponibles en el microcontrolador.

Mi pregunta es, ¿cuál es el mínimo requerido de los archivos de encabezado si tengo un microcontrolador ARM basado en la base con sus periféricos? ¿Puedo construir directamente con CMSIS? Pero como CMSIS parece ser solo una API para los procesadores centrales ARM estándar, ¿qué sucede con los periféricos (como UART, I2C, etc.), incluso necesito una definición de archivo de encabezado para un dispositivo en particular? Si construyo sobre CMSIS, ¿significa que podría transferir fácilmente mi proyecto desde un ATSAM de Atmel a un STM32?

Veo estos bloques pero no entiendo bien cómo se juntan:

  • La cadena de herramientas ARM para el cumplimiento
  • Archivos de encabezado específicos del proveedor para definiciones periféricas.
  • CMSIS core
  • implementaciones CMSIS? ¿Dónde están?

Y digamos que no existe una implementación de CMSIS, ¿cuánto estoy jodido? ¿Puedo escribir esto yo mismo en base a la hoja de datos, o es solo una pérdida de tiempo?

Muchas preguntas en este post. Eso demuestra lo mucho que estoy confundido. Me gusta usar Atmel Studio, pero prefiero cuando puedo hacer proyectos desde cero y entender cómo encaja la pieza en lugar de confiar en el código mágico que podría desaparecer en una futura versión del IDE.

    
pregunta Kévin Isabelle

2 respuestas

4

Esta es una buena pregunta. También me confundí cuando comencé a trabajar con microcontroladores basados en ARM. Ciertamente puede escribir código directamente usando la documentación de referencia. Lo hago, y en mi caso, lo encuentro más simple que tratar de usar las bibliotecas.

En el sitio web de ARM encontrará:

La referencia técnica de ARM Cortex-M7: enlace

La referencia de arquitectura ARMv7-M: enlace

Hay una superposición considerable entre los documentos anteriores, me encuentro usando el manual de referencia de arquitectura.

Estos documentos están claramente escritos y encontrará información de referencia sobre los componentes clave que son comunes a todas las implementaciones de Cortex-M7 e implementaciones ARMv7-M (tanto la Cortex-M4 como la Cortex-M7 son implementaciones ARMv7-M). Utilicé los documentos para escribir la parte de mi firmware que se ocupa del procesador ARM, las interrupciones, la protección de la memoria y los cachés.

Usted preguntó acerca de la cadena de herramientas del compilador. ARM publica versiones actuales de la cadena de herramientas GNU para ARM en: enlace

Uso el editor de texto Atom y lo configuré para compilar usando la cadena de herramientas GNU ARM. Eso funciona muy bien.

Para su microcontrolador específico, en este caso la serie Microchip SAM E70, la hoja de datos de Microchip describe todos los periféricos y registros. Puedes programar directamente a eso.

En el caso de los procesadores ST Microelectronics STM32, la hoja de datos de ST Microelectronics describe solo el componente en sí. Un manual de referencia técnica por separado describe los detalles de programación de los periféricos y sus registros asociados.

Cuando comencé, me referí al CMSIS y al código fuente de la biblioteca del proveedor cuando elaboré la secuencia para abrir el microcontrolador. Desde entonces, no me he molestado. Los manuales de referencia son suficientes.

Ciertamente, puede compartir el código fuente para el procesador ARM entre cualquier implementación de Cortex-M7. El Cortex-M7 y el Cortex-M4 están lo suficientemente cerca como para que un solo conjunto de código fuente funcione para ambos. Entonces, con un poco de cuidado, su código para el procesador ARM en sí mismo funcionará en cualquier procesador Cortex-M4 y Cortex-M7.

Es probable que el código del núcleo del procesador ARM sea una parte muy pequeña de su software. La mayor parte de su código específico del microcontrolador se ocupará de los periféricos.

Las implementaciones periféricas de Microchip y ST Microelectronics no son necesariamente similares. Miré la descripción del periférico USART Microchip SAM E70, ya que recientemente he estado implementando el código USART para el ST Microelectronics STM32L4 / 4 +. Los periféricos son muy diferentes, no puedo imaginar que haya un intercambio significativo de códigos entre el firmware para el Microchip SAM E70 y los USARTs de Microelectrónica ST.

Para mí, el código más confuso fue el relacionado con el inicio. Una secuencia de inicio razonable es algo como:

Los primeros pasos tratan con el núcleo del procesador ARM, use los manuales de ARM como referencia:

  1. Inicialice el procesador (habilite las instrucciones de punto flotante, desactive y borre los cachés; el restablecimiento del procesador no borra los cachés, esto debe hacerse en el firmware).
  2. Habilitar componentes del procesador (cachés, MPU, NVIC, etc.)

Los siguientes pasos tratan sobre el tiempo de ejecución de C / C ++ y el diseño de la memoria:

  1. Inicializar el sistema de tiempo de ejecución C / C ++ (inicialización de variable estática, etc.)
  2. Inicializa cualquier asignación de memoria

A partir de este punto, se ejecutará el código C / C ++ estándar.

En los siguientes pasos con los periféricos del microcontrolador, use la documentación de referencia del microcontrolador:

  1. Inicialice los relojes del microcontrolador (componentes específicos). Hasta este punto, el procesador se ha estado ejecutando en cualquier reloj que se use en el reinicio.
  2. Habilita el reloj SysTick del procesador ARM. Este reloj forma parte de la arquitectura ARM (consulte el manual de ARM), pero está cronometrado por el reloj del microcontrolador, por lo que funciona a la velocidad correcta solo después de que los relojes del microcontrolador se hayan inicializado.
  3. Habilite los relojes periféricos del microcontrolador para los periféricos a los que desea acceder.

Ahora puede acceder a cada uno de los periféricos de interés.

Como detalle, el microcontrolador puede ofrecer una salida de reloj (los procesadores STM32 de Microelectrónica ST lo llaman 'RCC MCO'). Para la depuración, me parece útil habilitar este pin específico durante la inicialización del reloj (que en algunos microcontroladores requiere habilitar el reloj periférico GPIO asociado), porque luego puedo usar un osciloscopio para monitorear el reloj que se está usando. Puedo ver que cada reloj llega a la frecuencia correcta. Una vez que los relojes se ejecutan correctamente, todo lo demás es fácil.

    
respondido por el D. Brown
0

Sí, puede agregar definiciones para algunos registros simples 'a mano'. Sin embargo, puede que no tenga sentido para un sistema real ya que puede terminar duplicando una gran cantidad de código.

Aquí está el encabezado de Cortex-M3 Designstart dentro del repositorio mbed. Este es un diseño basado en FPGA con solo un puñado de periféricos. Ya que está bastante simplificado, es una buena referencia para ver cuál es el mínimo requerido.

    
respondido por el Sean Houlihane

Lea otras preguntas en las etiquetas