Hay Stm32l052 con EEPROM incorporado (2k). Se utilizan 4 canales ADC, el disparador recopila datos cada 40 microsegundos. Los datos del ADC se procesan en la interrupción (determinada por la salida de valores más allá de los límites). Por lo tanto, al usar las bibliotecas Hal estándar durante la grabación en EEPROM, se pierden puntos (velocidad de escritura estándar de 3 milisegundos en datos EEPROM), incluso si escribe un byte desde el búfer circular. ¿Hay alguna forma de hacer que el controlador escriba en la EEPROM de forma asíncrona sin bloquear las interrupciones del ADC?
STM32L052
parece tener un controlador NVM de un solo banco, por lo tanto, un acceso de escritura a cualquier dirección EEPROM bloquearía las lecturas y recuperaciones de datos desde flash.
Funcionaría solo si puede reubicar todo el código relevante, excepto la inicialización, pero incluida la tabla de vectores, en la RAM. Sería todo un desafío hacerlo en 8 kbytes, pero podría funcionar. Olvídese de HAL, tiene demasiada sobrecarga y complejidad.
Recomiendo hacerlo de esta manera:
SCB->ICSR=SCB_ICSR_PENDSVSET
).Esta disposición evitaría que se ejecute cualquier código en flash mientras haya una escritura en EEPROM en curso, pero permite que los controladores de mayor prioridad se ejecuten siempre que no toquen la memoria no volátil.
Para reubicar una función en la RAM
Con gcc, utilícelo __attribute__((section(".data")))
en la declaración de la función. Hágalo recursivamente a cada función que llama. Úselo -ffreestanding
para evitar que gcc genere llamadas a funciones de biblioteca de forma inesperada. La .data
sección se copiará de la memoria flash a la RAM después del reinicio, junto con las variables inicializadas, mediante el código de inicio.
Para reubicar la tabla de vectores
La tabla de vectores del STM32L052
tiene una longitud de 192 bytes (Manual de referencia 12.3 Vectores de interrupción y excepción). Simplemente movería el comienzo de la RAM 192 bytes hacia arriba en el script del enlazador
RAM (xrw) : ORIGIN = 0x200000C0, LENGTH = 8000 /* 8192 - 192 */
copie la tabla de vectores allí y establezca el puntero de la tabla de vectores
memcpy((void*)0x20000000, (void*)0x08000000, 192);
SCB->VTOR = 0x20000000;
antes de que se habilite cualquier interrupción.
Usando STM32L072
en su lugar, sería posible dejar que el programa se ejecute desde el Banco 1, y colocar los datos de la EEPROM en el Banco 2 , no interferirían entre sí. Por supuesto, aún se necesitarían 3 ms (o 6 ms si no está vacío) para escribir una palabra de 32 bits† en la EEPROM, intentar escribir más datos antes de que se complete la primera escritura bloquearía la ejecución del programa hasta que se complete la primera. Consulte el manual de referencia para el diseño del banco (3.3.1 Organización NVM)
† AFAIK Los datos de la EEPROM se escriben en unidades de 32 bits, escribir 1 o 2 bytes a la vez lleva tanto tiempo como escribir una palabra completa de 4 bytes.
chris stratton
siguió a Mónica a Codidact
Jon