初级会员

- 积分
- 132
- 金钱
- 132
- 注册时间
- 2018-8-25
- 在线时间
- 33 小时
|
30金钱
本帖最后由 LevenC 于 2018-9-10 17:50 编辑
1.SWD GPIO初始化[mw_shl_code=c,true]void swd_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* 使能GPIO时钟 */
GPIO_InitStructure.GPIO_Pin = (SWD_PIN_SWDIO | SWD_PIN_SWCLK);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 推挽输出 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 最大输出速度为50MHz */
GPIO_Init(GPIOC, &GPIO_InitStructure);
SW_SWCLK_OUT(1U); /* SWCLK输出高电平 */
SW_SWDIO_OUT(0U); /* SWDIO输出低电平 */
}[/mw_shl_code]
2.连接和线路重启
[mw_shl_code=c,true]void swd_line_reset(void)
{
static vu8 cycle = 0;
SW_SWDIO_SET_OUT(); /* SWDIO设置为输出(推挽输出) */
SW_SWDIO_OUT(1U); /* SWDIO输出高电平 */
/* 1. At least 50 clocks with SWDIOTMS HIGH */
for(cycle = 0; cycle < 56; cycle++) {
SW_SWCLK_CYCLE(); /* 时钟周转 */
}
/* 2. At least two Idle cycles*/
dap_data_manage.idle_cycles = 8;
cycle = dap_data_manage.idle_cycles;
if(cycle) {
SW_SWDIO_OUT(0U); /* SWDIO输出低电平 */
for(; cycle; cycle--) {
SW_SWCLK_CYCLE(); /* 时钟周转 */
}
}
}[/mw_shl_code]
3.从JTAG切换到SWD操作
[mw_shl_code=c,true]void jtag_to_swd(void)
{
static vu8 cycle = 0;
SW_SWDIO_SET_OUT();
SW_SWDIO_OUT(1U);
/* 1. At least 50 clocks with SWDIOTMS HIGH */
for(cycle = 0; cycle < 56; cycle++) {
SW_SWCLK_CYCLE();
}
/* 2. JTAG-to-SWD sequence */
swd_send_data(JTAG_TO_SWD_SEQ_LSB); /* SWD首先发送最低有效位((u16)0xE79E) */
/* 3. At least 50 clocks with SWDIOTMS HIGH */
for(cycle = 0; cycle < 56; cycle++) {
SW_SWCLK_CYCLE();
}
SW_SWDIO_OUT(0U);
}[/mw_shl_code]
4.连接和线路重启
5.读IDCODE
[mw_shl_code=c,true]/**
* @brief SWD读写协议操作实现
* @param request: A[3:2] RnW APnDP
* 此处的参数为0x2,IDCODE寄存器0x00,DP为0b0,读为0b1
* data: DATA[31:0]
* @retval ACK[2:0]
*/
u8 swd_read_write_operation(u32 request, u32 *data)
{
static vu8 num = 0; /* 用于调转时钟周期数循环 */
static vu32 ack = 0, bit = 0, parity = 0;
SW_SWDIO_SET_OUT(); /* SWDIO设置为输出(推挽输出) */
/* 主机(Host) Packet Request - 主机进行包请求 */
SW_WRITE_BIT(1U); /* Start Bit */
bit = (request >> 0U) & 1U;
SW_WRITE_BIT(bit); /* APnDP Bit */
parity += bit;
bit = (request >> 1U) & 1U;
SW_WRITE_BIT(bit); /* RnW Bit */
parity += bit;
bit = (request >> 2U) & 1U;
SW_WRITE_BIT(bit); /* A2 Bit */
parity += bit;
bit = (request >> 3U) & 1U;
SW_WRITE_BIT(bit); /* A3 Bit */
parity += bit;
SW_WRITE_BIT(parity & 1U); /* Parity Bit */
SW_WRITE_BIT(0U); /* Stop Bit */
SW_WRITE_BIT(1U); /* Park Bit */
SW_SWDIO_SET_INT(); /* SWDIO设置为输入(浮空输入) */
for(num = dap_data_manage.turnaround; num; num--) {
SW_SWCLK_CYCLE(); /* 主机请求与目标机回应之间有调转周期 */
}
/* 目标机(Target) Acknowledge response - ACK回应 */
SW_READ_BIT(bit);
ack = bit << 0U;
SW_READ_BIT(bit);
ack |= bit << 1U;
SW_READ_BIT(bit);
ack |= bit << 2U;
printf("Target ACK:0x%X\r\n", ack);
/* ACK回应后的数据处理,未写 */
return ack;
}[/mw_shl_code]
|
|