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(); } }
