Instalación de un gestor de arranque en un microcontrolador ARM

Compré esta MCU LPC1788FBD144,551 y esta MCU LPC1313FBD48/01,15 y quiero instalarles un cargador de arranque en ensamblaje que pueda llamar a una función en C. ¿Cómo puedo instalar el cargador de arranque en la MCU ARM? ¿Lo instalaría directamente en la MCU o en un componente separado (si es así, puede mostrarme qué parte en el sitio web de Newark)?

¿Has comprobado que no hay ya uno de fábrica? ¿Bootloader para qué interfaz externa?
@ChrisStratton Quiero crear un gestor de arranque personalizado para el dispositivo.
Eso dice, pero primero tendrá que decidir qué quiere que haga su cargador de arranque e investigar las capacidades de los chips de destino: lo que ya hacen, si admiten el bloqueo parcial de páginas, si tienen suficiente RAM para ejecutar la aplicación cargada allí en lugar de actualizarla (si lo prefiere), etc.

Respuestas (2)

Ambos dispositivos tienen cargadores de arranque en chip que siempre se ejecutarán. Con el LPC17xx, puede escribir un gestor de arranque secundario para ejecutar un código personalizado que se ejecutará directamente después. Simplemente necesita dirigir su IDE para colocar el código en la ubicación 0x00.

En la página de documentación , eche un vistazo a AN11257 y AN11258. Estos discuten la creación de cargadores de arranque secundarios (SBL) para cargar código desde SPI o I2C respectivamente. Esto podría recuperar el código de una PC o un dispositivo de memoria externo.

De AN11257:

En estas MCU, el cargador de arranque principal reside en el bloque de arranque. El cargador de arranque se ejecuta cada vez que se enciende o reinicia la pieza. Puede ejecutar el controlador de comandos del ISP o el código de la aplicación del usuario, que se almacena en el sector 0 de la memoria flash interna.

El SBL en este proyecto se refiere a una aplicación definida por el usuario que proporciona al usuario una opción para actualizar el firmware de la aplicación del usuario o ejecutar el firmware de la aplicación del usuario previamente programado. Se coloca desde la dirección 0x00 para que cuando el cargador de arranque principal ejecute la aplicación del usuario, se ejecute primero.

No pude encontrar documentación similar en el LPC13xx. Pero su cargador de arranque principal tiene un poco más de funcionalidad incorporada. Específicamente la capacidad de cargar nuevos programas a través de UART. Su versión carece de la funcionalidad USB de la que hablan en la Guía del usuario :

El código del gestor de arranque se ejecuta cada vez que se enciende o reinicia la pieza (consulte la Figura 63). El cargador puede ejecutar el controlador de comandos del ISP o el código de la aplicación del usuario, o puede obtener la imagen de inicio como un dispositivo MSC conectado a través de USB. Un nivel BAJO durante el reinicio en el pin PIO0_1 se considera una solicitud de hardware externo para iniciar el controlador de comandos del ISP o la enumeración del dispositivo USB sin verificar primero un código de usuario válido. El estado de PIO0_3 determina si se utilizará la interfaz UART o USB:

• Si la muestra de PIO0_3 es ALTA, el gestor de arranque conecta el LPC134x como un dispositivo USB MSC a un host de PC. El espacio de la memoria flash LPC134x se representa como una unidad en el sistema operativo Windows del host.

• Si PIO0_3 se muestrea como BAJO, el gestor de arranque configura el puerto serie UART y llama al controlador de comandos del ISP.

Observación: en las partes LPC131x (sin USB), el estado del pin PIO0_3 no importa.

Todavía puede ejecutar las primeras instrucciones después de que el cargador de arranque principal actúe como un cargador de arranque secundario personalizado. Solo necesita ubicar ese código en la dirección adecuada. Cómo se hace esto depende en gran medida de su IDE. Consulte la documentación de su IDE sobre cómo controlar adecuadamente la ubicación del código en los sectores deseados.

Si hago esto desde mi mac, ¿cómo podría configurar mi IDE para que establezca la dirección en 0x00? Específicamente con nasm o gcc?
@ Coder404 Deberá crear un archivo de enlace para gcc que coloque el archivo de objeto de su código de cargador de arranque en una sección específica ubicada en una dirección específica. Eche un vistazo al penúltimo ejemplo aquí donde colocan el allarchivo de objeto en la outputasección en la dirección 0x10000. También sugeriría decirle a gcc que imprima un archivo de mapa para asegurarse de que lo hizo bien.
¿Qué tipo de conexión física usaría para instalar el código en la MCU?
@ Coder404 La respuesta corta es: bus serie. Pero cada chip es ligeramente diferente. Consulte el Capítulo 32 del Manual del usuario de LPC17xx y el Capítulo 21 del Manual del usuario de LPC13xx para obtener más detalles.
No instalaría el cargador de arranque ya que ya viene de fábrica. Para comunicarse con el cargador de arranque, necesitará usar una interfaz que admita; deberá ver la documentación del chip específico, pero generalmente se admite algún subconjunto de serie de nivel lógico, SPI o USB.

Diría que todo lo que necesita ya lo proporciona NXP.

Es el mismo principio para todos los microcontroladores LPC1700, así que use la herramienta Flashmagic o llame a las funciones IAP (In Application Programming) para proporcionar su propio gestor de arranque personalizado. Por lo general, debe hacerlo si necesita que el cargador de arranque se ejecute a través de Ethernet o USB, y no a través de RS232. Aún así, tiene sentido llamar a las funciones IAP para la programación Flash y no hacerlo usted mismo.

Consulte este hilo , las respuestas proporcionadas por Zero y Rob68 siempre son de alta calidad directamente al problema.

Descargue la herramienta Flashmagic y estudie su manual de usuario (proporcionado en PDF). Sus dispositivos son compatibles.

Consulte también este enlace donde se discutieron algunos problemas más específicos.