Keil uVision MDK-Lite, placa STM32F072B-Discovery y API flash

10

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.

netskink
fuente
No estoy seguro, pero tal vez el lado USB del CMSIS-DAP ha sido apagado. Esa placa tiene una distribución de energía bastante compleja para los componentes de depuración externos. No se puede acceder al objetivo probablemente significa que la conexión (por cable serie) al DAP se ha interrumpido.
Sean Houlihane
¿Estamos hablando del ST-LINK / V2 integrado como depurador?
Bence Kaulics
Si puede compartir una imagen de código, otra persona podría verificar (y descartar problemas de hardware). Solo tengo una placa M7 ...
Sean Houlihane
Bence Kaulics, es el depurador integrado en la placa stm32f072B-disco. Es el depurador ST-Link y no un depurador Keil ULINK2 que es ST-LINK / V2. Tengo uno de esos depuradores conectados por USB Keil pero se conecta a la placa con un cable plano. Estoy usando el conector mini usb ST-Link en la placa y no un conector de cable plano. La placa deriva la energía del conector mini-usb y no una fuente de alimentación separada.
netskink
1
En cuanto al código de muestra. La muestra es proporcionada por el descubrimiento de descubrimiento de STMicro. La ruta del proyecto en el repot ST es Proyectos / STM32F072B-Discovery / Ejemplos / FLASH / FLASH_EraseProgram. Estoy usando el proyecto MDK-ARM en ese directorio. Falla en la línea 108 donde lo hace HAL_FLASHEx_Erase ()
netskink

Respuestas:

7

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.

Sean Houlihane
fuente
Correcto, funciona bien, pero cuando borro un bloque, la conexión USB al depurador se cae. Estaba usando un concentrador USB sin alimentación, así que esto parecía lógico; sin embargo, conectarse directamente a la computadora y usar un concentrador diferente da el mismo resultado.
netskink
Si está ejecutando código mientras realiza el acceso flash, bloqueará el AHB por un tiempo. I imaginando pisar en este escenario podría ser desordenado. stackoverflow.com/questions/3445598 tiene más.
Sean Houlihane