Forum: Mikrocontroller und Digitale Elektronik STM32CubeIDE STLINK/V2 Debuggen ohne Breakpoints (Semihosting?)


von Christoph K. (chriskuku)


Lesenswert?

Abgesehen von dem Problem, das ich im Moment mit dem STM32CubeIDE 
hinsichtlich des genauen Setzens von Breakpoints in Assembler Source 
habe, suche ich nach einer Möglichkeit, ein (Assembler-)Programm derart 
zu debuggen, daß ich keine Breakpoints setze, sondern an bestimmten 
Stellen Ausgaben mache (in C pflastert man sein Programm mit printfs - 
scaffolding). Hat man ein C-Programm im STM32Cube zu debuggen, kann man, 
glaube ich, die printf umlenken.

Wie das in Assembler geht, versuche ich, herauszubekommen. Ich kann zu 
dem Zeitpunkt noch nicht den UART zum Debuggen benutzen, weil der gerade 
nichts ausspuckt bzw. das genau das Problem ist. Das Programm, das in 
einem Discovery Board läuft, funktioniert nicht im STM32F407-DIYMORE 
board.

Vielleicht kann mir da jemand auf die Sprünge helfen.

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

Noch schlichter als Textausgaben sind LEDs.

von Christoph K. (chriskuku)


Lesenswert?

Klaus W. schrieb:
> Noch schlichter als Textausgaben sind LEDs.

Ja, das ist sicher auch richtig, ist aber nicht meine Frage :)

von Stefan F. (Gast)


Lesenswert?

Christoph K. schrieb:
> Ich kann zu dem Zeitpunkt noch nicht den UART zum Debuggen benutzen,
> weil der gerade nichts ausspuckt

Alternativ kannst du TraceSWO nutzen.

http://stefanfrings.de/stm32/stm32f3.html#traceswo
http://stefanfrings.de/stm32/cube_ide.html#traceswo

Der Quelltext von ITM_SendChar() in CMSIS core ist:
1
/**
2
  \brief   ITM Send Character
3
  \details Transmits a character via the ITM channel 0, and
4
           \li Just returns when no debugger is connected that has booked the output.
5
           \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.
6
  \param [in]     ch  Character to transmit.
7
  \returns            Character to transmit.
8
 */
9
__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
10
{
11
  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */
12
      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */
13
  {
14
    while (ITM->PORT[0U].u32 == 0UL)
15
    {
16
      __NOP();
17
    }
18
    ITM->PORT[0U].u8 = (uint8_t)ch;
19
  }
20
  return (ch);
21
}

Das kannst du bestimmt leicht in Assembler umsetzen.

von Christoph K. (chriskuku)


Lesenswert?

Danke. Sehr schön. Die ITM Console erscheint schon. Port 0 erschien 
schon automatisch. Habe aber "Connect under Reset" eingestellt. Software 
connect ging irgendwie nicht.

Zum Umsetzen in Assembler fehlen mir die Informationen über die 
ITM-Struktur. Ist das in einer Library/Headern, die ich ja nicht haben 
kann, wegen meines blanken Projektes ohne jegliche 
CMSIS-Header/Libraries?

von Stefan F. (Gast)


Lesenswert?

Auszug aus CMSIS core für den Cortex M4 Kern:
1
typedef struct
2
{
3
  __OM  union
4
  {
5
    __OM  uint8_t    u8;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit */
6
    __OM  uint16_t   u16;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 16-bit */
7
    __OM  uint32_t   u32;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 32-bit */
8
  }  PORT [32U];                         /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers */
9
        uint32_t RESERVED0[864U];
10
  __IOM uint32_t TER;                    /*!< Offset: 0xE00 (R/W)  ITM Trace Enable Register */
11
        uint32_t RESERVED1[15U];
12
  __IOM uint32_t TPR;                    /*!< Offset: 0xE40 (R/W)  ITM Trace Privilege Register */
13
        uint32_t RESERVED2[15U];
14
  __IOM uint32_t TCR;                    /*!< Offset: 0xE80 (R/W)  ITM Trace Control Register */
15
        uint32_t RESERVED3[29U];
16
  __OM  uint32_t IWR;                    /*!< Offset: 0xEF8 ( /W)  ITM Integration Write Register */
17
  __IM  uint32_t IRR;                    /*!< Offset: 0xEFC (R/ )  ITM Integration Read Register */
18
  __IOM uint32_t IMCR;                   /*!< Offset: 0xF00 (R/W)  ITM Integration Mode Control Register */
19
        uint32_t RESERVED4[43U];
20
  __OM  uint32_t LAR;                    /*!< Offset: 0xFB0 ( /W)  ITM Lock Access Register */
21
  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R/ )  ITM Lock Status Register */
22
        uint32_t RESERVED5[6U];
23
  __IM  uint32_t PID4;                   /*!< Offset: 0xFD0 (R/ )  ITM Peripheral Identification Register #4 */
24
  __IM  uint32_t PID5;                   /*!< Offset: 0xFD4 (R/ )  ITM Peripheral Identification Register #5 */
25
  __IM  uint32_t PID6;                   /*!< Offset: 0xFD8 (R/ )  ITM Peripheral Identification Register #6 */
26
  __IM  uint32_t PID7;                   /*!< Offset: 0xFDC (R/ )  ITM Peripheral Identification Register #7 */
27
  __IM  uint32_t PID0;                   /*!< Offset: 0xFE0 (R/ )  ITM Peripheral Identification Register #0 */
28
  __IM  uint32_t PID1;                   /*!< Offset: 0xFE4 (R/ )  ITM Peripheral Identification Register #1 */
29
  __IM  uint32_t PID2;                   /*!< Offset: 0xFE8 (R/ )  ITM Peripheral Identification Register #2 */
30
  __IM  uint32_t PID3;                   /*!< Offset: 0xFEC (R/ )  ITM Peripheral Identification Register #3 */
31
  __IM  uint32_t CID0;                   /*!< Offset: 0xFF0 (R/ )  ITM Component  Identification Register #0 */
32
  __IM  uint32_t CID1;                   /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */
33
  __IM  uint32_t CID2;                   /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */
34
  __IM  uint32_t CID3;                   /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */
35
} ITM_Type;
36
37
/* ITM Trace Privilege Register Definitions */
38
#define ITM_TPR_PRIVMASK_Pos                0U                                            /*!< ITM TPR: PRIVMASK Position */
39
#define ITM_TPR_PRIVMASK_Msk               (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/)     /*!< ITM TPR: PRIVMASK Mask */
40
41
/* ITM Trace Control Register Definitions */
42
#define ITM_TCR_BUSY_Pos                   23U                                            /*!< ITM TCR: BUSY Position */
43
#define ITM_TCR_BUSY_Msk                   (1UL << ITM_TCR_BUSY_Pos)                      /*!< ITM TCR: BUSY Mask */
44
45
#define ITM_TCR_TraceBusID_Pos             16U                                            /*!< ITM TCR: ATBID Position */
46
#define ITM_TCR_TraceBusID_Msk             (0x7FUL << ITM_TCR_TraceBusID_Pos)             /*!< ITM TCR: ATBID Mask */
47
48
#define ITM_TCR_GTSFREQ_Pos                10U                                            /*!< ITM TCR: Global timestamp frequency Position */
49
#define ITM_TCR_GTSFREQ_Msk                (3UL << ITM_TCR_GTSFREQ_Pos)                   /*!< ITM TCR: Global timestamp frequency Mask */
50
51
#define ITM_TCR_TSPrescale_Pos              8U                                            /*!< ITM TCR: TSPrescale Position */
52
#define ITM_TCR_TSPrescale_Msk             (3UL << ITM_TCR_TSPrescale_Pos)                /*!< ITM TCR: TSPrescale Mask */
53
54
#define ITM_TCR_SWOENA_Pos                  4U                                            /*!< ITM TCR: SWOENA Position */
55
#define ITM_TCR_SWOENA_Msk                 (1UL << ITM_TCR_SWOENA_Pos)                    /*!< ITM TCR: SWOENA Mask */
56
57
#define ITM_TCR_DWTENA_Pos                  3U                                            /*!< ITM TCR: DWTENA Position */
58
#define ITM_TCR_DWTENA_Msk                 (1UL << ITM_TCR_DWTENA_Pos)                    /*!< ITM TCR: DWTENA Mask */
59
60
#define ITM_TCR_SYNCENA_Pos                 2U                                            /*!< ITM TCR: SYNCENA Position */
61
#define ITM_TCR_SYNCENA_Msk                (1UL << ITM_TCR_SYNCENA_Pos)                   /*!< ITM TCR: SYNCENA Mask */
62
63
#define ITM_TCR_TSENA_Pos                   1U                                            /*!< ITM TCR: TSENA Position */
64
#define ITM_TCR_TSENA_Msk                  (1UL << ITM_TCR_TSENA_Pos)                     /*!< ITM TCR: TSENA Mask */
65
66
#define ITM_TCR_ITMENA_Pos                  0U                                            /*!< ITM TCR: ITM Enable bit Position */
67
#define ITM_TCR_ITMENA_Msk                 (1UL /*<< ITM_TCR_ITMENA_Pos*/)                /*!< ITM TCR: ITM Enable bit Mask */
68
69
/* ITM Integration Write Register Definitions */
70
#define ITM_IWR_ATVALIDM_Pos                0U                                            /*!< ITM IWR: ATVALIDM Position */
71
#define ITM_IWR_ATVALIDM_Msk               (1UL /*<< ITM_IWR_ATVALIDM_Pos*/)              /*!< ITM IWR: ATVALIDM Mask */
72
73
/* ITM Integration Read Register Definitions */
74
#define ITM_IRR_ATREADYM_Pos                0U                                            /*!< ITM IRR: ATREADYM Position */
75
#define ITM_IRR_ATREADYM_Msk               (1UL /*<< ITM_IRR_ATREADYM_Pos*/)              /*!< ITM IRR: ATREADYM Mask */
76
77
/* ITM Integration Mode Control Register Definitions */
78
#define ITM_IMCR_INTEGRATION_Pos            0U                                            /*!< ITM IMCR: INTEGRATION Position */
79
#define ITM_IMCR_INTEGRATION_Msk           (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/)          /*!< ITM IMCR: INTEGRATION Mask */
80
81
/* ITM Lock Status Register Definitions */
82
#define ITM_LSR_ByteAcc_Pos                 2U                                            /*!< ITM LSR: ByteAcc Position */
83
#define ITM_LSR_ByteAcc_Msk                (1UL << ITM_LSR_ByteAcc_Pos)                   /*!< ITM LSR: ByteAcc Mask */
84
85
#define ITM_LSR_Access_Pos                  1U                                            /*!< ITM LSR: Access Position */
86
#define ITM_LSR_Access_Msk                 (1UL << ITM_LSR_Access_Pos)                    /*!< ITM LSR: Access Mask */
87
88
#define ITM_LSR_Present_Pos                 0U                                            /*!< ITM LSR: Present Position */
89
#define ITM_LSR_Present_Msk                (1UL /*<< ITM_LSR_Present_Pos*/)               /*!< ITM LSR: Present Mask */
90
91
/* Memory mapping of Core Hardware */
92
#define ITM_BASE            (0xE0000000UL)                            /*!< ITM Base Address */
93
#define ITM                 ((ITM_Type       *)     ITM_BASE      )   /*!< ITM configuration struct */

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.