Estoy usando MDK-Lite Versión 5.23 con una placa STMicroelectronics STM32F072B-Disco "Discovery" y estoy tratando de usar el Ejemplo Flash provisto por las muestras Discovery.
He usado esta placa y cadena de herramientas para otros ejemplos y he codificado algunos trabajos de SPI y GPIO. El IDE funciona como un campeón. Sin embargo, para este proyecto en particular, puedo construir el código y ejecutarlo descargando y usando el botón de reinicio. No puedo usar el depurador en el proyecto tan pronto como uso la rutina HAL_FLASHEx_Erase (). Una vez que ejecuto esa rutina, el IDE aparece un cuadro de diálogo que dice "No se puede acceder al objetivo. Cerrar sesión de depuración".
Por lo que vale, sé que no es un error de programación porque si descargo el código y luego lo ejecuto presionando el botón de reinicio, funcionará. He usado este mismo depurador con una placa TI y también fue capaz de programar flash y ejecutar rutinas flash. Estoy bastante seguro de que no estoy borrando la parte de flash donde se almacena el código, por lo que no es eso.
Si paso por encima de esta línea en main.c
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
entonces cae la sesión de depuración. Si, en cambio, entro en la misma línea y luego paso por encima de cada una de las llamadas en la rutina de borrado flash, funcionará y eventualmente saldré de la rutina y puedo depurar el resto del código.
Respuestas:
Mi conjetura es que esta es una fuente de alimentación relacionada en algún nivel. Ya sea el suministro externo o la conmutación a bordo de los rieles de alimentación.
Para aclarar el escenario, la depuración funciona bien después de un reinicio de hardware, pero cuando su objetivo borra un bloque de flash, ¿se cae la conexión de depuración?
A la depuración no le importa que el código se ejecute correctamente: puede estar en estado de bloqueo y detener la depuración aún debería funcionar. Lo único en el lado de la CPU que bloquea la depuración es un acceso AHB bloqueado. Esto significa que el problema es con la interfaz SWD entre el STM32F7 y el chip de interfaz USB-SWD incorporado (también un STM32, supongo). Este dispositivo tiene una conmutación de riel de alimentación a bordo que me confundió la primera vez que usé la placa.
Vale la pena señalar que el borrado flash aumentará el consumo de corriente del dispositivo: ¿su fuente de alimentación externa está a la altura del trabajo y puede usar una alternativa?
Editar: en función de sus comentarios de que pasar por encima del código en cuestión hace que el depurador se bloquee, mientras que un solo paso no lo hace, creo que su problema está relacionado con esta pregunta .
El paso a paso se implementa mediante el uso de un punto de interrupción (y el sondeo para el estado de detención), mientras que el hardware admite el paso único. Esto todavía no explica por qué el depurador parece estar confundido, pero permite que el depurador intente acceder al código (desde flash) mientras el controlador de flash está activo.
En base a estas observaciones, le sugiero que establezca un punto de interrupción después del borrado e intente evitar desencadenar este escenario.
fuente