I regularly use the SWD CLK and DIO pins as outputs for debugging markers.
The code is below, for GCC.
Do not use the OR Assignment operator '|=' indiscriminately, despite NXP showing it in examples far to often. At best it wastes code space and at worse you don't get what you expect for the register.
/* Change bit to match your hardware, if needed: */
#define SWD_CLK_bp (0UL)
#define SWD_DIO_bp (3UL)
#define ATTR_NO_INSTRUMENT_FUNCTION __attribute__( ( no_instrument_function ) )
/* ---- */
#define SWD_CLK_bm (1UL << SWD_CLK_bp)
static inline ATTR_NO_INSTRUMENT_FUNCTION void SWD_CLK_ASSERT( void )
{
GPIOA_PSOR = SWD_CLK_bm;
}
static inline ATTR_NO_INSTRUMENT_FUNCTION void SWD_CLK_DEASSERT( void )
{
GPIOA_PCOR = SWD_CLK_bm;
}
static inline ATTR_NO_INSTRUMENT_FUNCTION void SWD_CLK_TOGGLE( void )
{
GPIOA_PTOR = SWD_CLK_bm;
}
static inline ATTR_NO_INSTRUMENT_FUNCTION uint8_t SWD_CLK_ASSERTED( void )
{
return( 0U != (GPIOA_PDIR & SWD_CLK_bm) );
}
static inline ATTR_NO_INSTRUMENT_FUNCTION uint8_t SWD_CLK_DEASSERTED( void )
{
return( 0U == (GPIOA_PDIR & SWD_CLK_bm) );
}
static inline ATTR_NO_INSTRUMENT_FUNCTION void SWD_CLK_INIT( void )
{
PORTA_PCR0 = PORT_PCR_MUX( 1U );
GPIOA_PCOR = SWD_CLK_bm;
GPIOA_PDDR |= SWD_CLK_bm;
}
/* ---- */
#define SWD_DIO_bm (1UL << SWD_DIO_bp)
static inline ATTR_NO_INSTRUMENT_FUNCTION void SWD_DIO_ASSERT( void )
{
GPIOA_PSOR = SWD_DIO_bm;
}
static inline ATTR_NO_INSTRUMENT_FUNCTION void SWD_DIO_DEASSERT( void )
{
GPIOA_PCOR = SWD_DIO_bm;
}
static inline ATTR_NO_INSTRUMENT_FUNCTION void SWD_DIO_TOGGLE( void )
{
GPIOA_PTOR = SWD_DIO_bm;
}
static inline ATTR_NO_INSTRUMENT_FUNCTION uint8_t SWD_DIO_ASSERTED( void )
{
return( 0U != (GPIOA_PDIR & SWD_DIO_bm) );
}
static inline ATTR_NO_INSTRUMENT_FUNCTION uint8_t SWD_DIO_DEASSERTED( void )
{
return( 0U == (GPIOA_PDIR & SWD_DIO_bm) );
}
static inline ATTR_NO_INSTRUMENT_FUNCTION void SWD_DIO_INIT( void )
{
PORTA_PCR3 = PORT_PCR_MUX( 1U );
GPIOA_PCOR = SWD_DIO_bm;
GPIOA_PDDR |= SWD_DIO_bm;
}
int main( void )
{
SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;
SWD_CLK_INIT();
SWD_DIO_INIT();
SWD_DIO_TOGGLE(); /* Make DIO and CLK toggle out of phase */
for(;;)
{
SWD_CLK_TOGGLE();
SWD_DIO_TOGGLE();
}
}