1. 使用的是技小新的版本(试了好几个版本就技小新的版本可以识别到)
2. 下载安装5.23a版本的MDK,如果是更高版本的MDK也可以下载MDKCM512a.EXE
3. 修改DAP_Config.h中的配置,参考任何一款的配置,具体根据JLINKOB使用到的SWCLK、SWDIO、UART对应PIN配置
4. 增加软复位功能(仅对Cortex-M有效,参考https://github.com/RadioOperator/STM32F103C8T6_CMSIS-DAP_SWO中的代码),在CMSIS_DAP.c中增加:
//-----Soft reset + Hard reset-------------------------------------------------
#define PIN_SWCLK_SET PIN_SWCLK_TCK_SET
#define PIN_SWCLK_CLR PIN_SWCLK_TCK_CLR
#define RST_CLOCK_CYCLE() \
PIN_SWCLK_CLR(); \
PIN_DELAY(); \
PIN_SWCLK_SET(); \
PIN_DELAY()
#define RST_WRITE_BIT(bit) \
PIN_SWDIO_OUT(bit); \
PIN_SWCLK_CLR(); \
PIN_DELAY(); \
PIN_SWCLK_SET(); \
PIN_DELAY()
#define RST_READ_BIT(bit) \
PIN_SWCLK_CLR(); \
PIN_DELAY(); \
bit = PIN_SWDIO_IN(); \
PIN_SWCLK_SET(); \
PIN_DELAY()
#define PIN_DELAY() PIN_DELAY_SLOW(DAP_Data.clock_delay)
uint8_t RST_Transfer(uint32_t request, uint32_t data)
{
uint32_t ack; \
uint32_t bit; \
uint32_t val; \
uint32_t parity; \
uint32_t n; \
\
/* Packet Request */ \
parity = 0U; \
RST_WRITE_BIT(1U); /* Start Bit */ \
bit = request >> 0; \
RST_WRITE_BIT(bit); /* APnDP Bit */ \
parity += bit; \
bit = request >> 1; \
RST_WRITE_BIT(bit); /* RnW Bit */ \
parity += bit; \
bit = request >> 2; \
RST_WRITE_BIT(bit); /* A2 Bit */ \
parity += bit; \
bit = request >> 3; \
RST_WRITE_BIT(bit); /* A3 Bit */ \
parity += bit; \
RST_WRITE_BIT(parity); /* Parity Bit */ \
RST_WRITE_BIT(0U); /* Stop Bit */ \
RST_WRITE_BIT(1U); /* Park Bit */ \
\
/* Turnaround */ \
PIN_SWDIO_OUT_DISABLE(); \
for (n = DAP_Data.swd_conf.turnaround; n; n--) { \
RST_CLOCK_CYCLE(); \
} \
\
/* Acknowledge response */ \
RST_READ_BIT(bit); \
ack = bit << 0; \
RST_READ_BIT(bit); \
ack |= bit << 1; \
RST_READ_BIT(bit); \
ack |= bit << 2; \
\
/* Data transfer */ \
/* Turnaround */ \
for (n = DAP_Data.swd_conf.turnaround; n; n--) { \
RST_CLOCK_CYCLE(); \
} \
PIN_SWDIO_OUT_ENABLE(); \
/* Write data */ \
val = data; \
parity = 0U; \
for (n = 32U; n; n--) { \
RST_WRITE_BIT(val); /* Write WDATA[0:31] */ \
parity += val; \
val >>= 1; \
} \
RST_WRITE_BIT(parity); /* Write Parity Bit */ \
PIN_SWDIO_OUT_ENABLE(); \
PIN_SWDIO_OUT(1U); \
return ((uint8_t)ack); \
}
修改函数PIN_nRESET_OUT
void PIN_nRESET_OUT(uint8_t bit)
{
uint32_t i;
//soft-reset for Cortex-M
RST_Transfer(0x00000CC5, 0xE000ED0C); //set AIRCR address
for (i=0; i<100; i++);
RST_Transfer(0x00000CDD, 0x05FA0007); //set RESET data
for (i=0; i<100; i++);
RST_Transfer(0x00000CC5, 0xE000ED0C); //repeat
for (i=0; i<100; i++);
RST_Transfer(0x00000CDD, 0x05FA0007);
if (bit & 1)
{
PIN_nRESET_HIGH();
}
else
{
PIN_nRESET_LOW();
}
}