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:
- 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).
- 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:
- Inicializar el sistema de tiempo de ejecución C / C ++ (inicialización de variable estática, etc.)
- 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:
- 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.
- 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.
- 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.