[开源硬件] DIY个STM32芯片的SWD离线下载器

[复制链接]
15978|8
 楼主| yewu4321 发表于 2019-3-19 10:40 | 显示全部楼层 |阅读模式
DIY个STM32芯片的SWD离线下载器
零三翟邢止胃 发表于 2019-3-19 10:42 | 显示全部楼层
好帖子啊! 不顶,对不起啊!
 楼主| yewu4321 发表于 2019-3-19 10:44 | 显示全部楼层
现在已经打通DP和AP通道,中间的弯路就甭提了,资料都是支离破碎,就连最基础的链路波形上怎么进行收发,都藏有玄机,我正在整理,整理后贡献给大家
dongshan 发表于 2019-3-20 16:13 | 显示全部楼层
mark一下,坐等干货
 楼主| yewu4321 发表于 2019-3-23 13:38 | 显示全部楼层
调试通过的SWD接口函数
 楼主| yewu4321 发表于 2019-3-23 13:38 | 显示全部楼层
/*************************************************
ת»»JTAG ΪSWDµ÷ÊÔ½Ó¿Ú
ÒòΪоƬÉϵçĬÈÏΪJTAGµ÷ÊÔ¿Ú ËùÒÔÐèÒª½øÐнӿڵÄת»»
*************************************************/
void swd_rst(void)
{
        uint16_t i;
        SWDIO1;///SWDIO=1
        SWDCK0;///SWDCK=0
        for(i=0;i<53;i++)
        {
                SWDCK1;///SWDCK=1
                SWDCK0;///SWDCK=0
        }
        swd_tx_data(0x79E70000,16,1);///·¢ËÍ16λÊý0x79e7
        SWDIO1;///SWDIO=1
        for(i=0;i<53;i++)
        {
                SWDCK1;///SWDCK=1
                SWDCK0;///SWDCK=0
        }
        SWDIO0;///SWDIO=0  
        SWDCK1;        SWDCK0;
        SWDCK1;        SWDCK0;
}
/*************************************************
·¢ËÍÖ¸¶¨³¤¶ÈµÄÊý¾Ýµ½SWD×ÜÏßÉÏ
*************************************************/
void swd_tx_data(uint32_t d,uint8_t length,uint8_t MSB)
{
        uint32_t d32=d;
        uint8_t i;
        for(i=0;i<length;i++)
        {
                if(MSB)
                {
                        if(d32&0x80000000) {SWDIO1;}else {SWDIO0;}
                        SWDCK1;SWDCK0;
                        d32=d32<<1;
                }
                else
                {
                        if(d32&0x0001) {SWDIO1;}else {SWDIO0;}
                        SWDCK1;SWDCK0;
                        d32=d32>>1;
                }
        }
}
/*************************************************
½ÓÊÕÖ¸¶¨³¤¶ÈµÄÊý¾Ýµ½SWD×ÜÏßÉÏ
*************************************************/
uint32_t swd_rx_data(uint8_t num)
{
        uint32_t d32;
        uint8_t i;
        for(i=0;i<num;i++)
        {
                SWDCK1;
                if(ReadGpio(SWDIO)) d32=(d32>>1) +0x80000000;
                else                                                                 d32=(d32>>1) ;
                SWDCK0;
        }
        return d32;
}
/*************************************************
Éú²úDPÃüÁî×Ö
*************************************************/
uint8_t swd_cmd(uint8_t AP,uint8_t RD,uint8_t adr)
{
        uint8_t cmd,one;
        cmd=0;
        one=0;
        cmd=1;                                                                                                                                                                                                                ///start
        if(AP){cmd=(cmd<<1)+1;one++;}        else {cmd=(cmd<<1)+0;}                        ///dp/ap 0-dp  1-ap
        if(RD){cmd=(cmd<<1)+1;one++;}        else {cmd=(cmd<<1)+0;}                        ///rw 1-r 0-w
        if(adr&0x01){cmd=(cmd<<1)+1;one++;}        else {cmd=(cmd<<1)+0;}///adr0
        if(adr&0x02){cmd=(cmd<<1)+1;one++;}        else {cmd=(cmd<<1)+0;}///adr1
        if(one&0x01){cmd=(cmd<<1)+1;}                                 else {cmd=(cmd<<1)+0;}///parity
        cmd=(cmd<<1)+0;                                                                                                                                                                                ///stop
        cmd=(cmd<<1)+1;                                                                                                                                                                                ///park
        return cmd;
}
/*************************************************
¶ÁAP»òDP
*************************************************/
uint8_t swd_rd(uint8_t AP,uint8_t adr,uint32_t *d32)
{
        uint8_t ack;
        uint8_t one=0;
        uint32_t cmd,ACK;
        cmd=swd_cmd(AP,1,adr);//////Éú³ÉÃüÁî
        swd_tx_data(cmd<<24,8,1);
        SWDIO1;        ack=0;
        ACK=swd_rx_data(3);        //////////////////½ÓÊÕACK
        if(ACK&0x20000000) ack=(ack<<1)+1;else ack=ack<<1;
        if(ACK&0x40000000) ack=(ack<<1)+1;else ack=ack<<1;
        if(ACK&0x80000000) ack=(ack<<1)+1;else ack=ack<<1;
        sleep_us(5);
        *d32= swd_rx_data(32);                                                                                                                                                        ///RX 32bit
        sleep_us(5);
        SWDIO1;
        SWDCK1;        SWDCK0;                                                                                                                                                                                        ///parity
        SWDCK1;        SWDCK0;                                                                                                                                                                ///////Õâ¸öµØ·½ºÍÎĵµËµÃ÷»¹ÊÇÓгöÈëµÄ
        SWDCK1;        SWDCK0;                                                                                                                                                                ///////Õâ¸öµØ·½ºÍÎĵµËµÃ÷»¹ÊÇÓгöÈëµÄ
        return ack;
}
/*************************************************
дAP»òDP
*************************************************/
uint8_t swd_wr(uint8_t AP,uint8_t adr,uint32_t d32)
{
        uint8_t ack;
        uint32_t cmd,ACK;
        cmd=swd_cmd(AP,0,adr);//////Éú³ÉÃüÁî
        swd_tx_data(cmd<<24,8,1);
        SWDIO1;        ack=0;
        ACK=swd_rx_data(3);        //////////////////½ÓÊÕACK
        if(ACK&0x20000000) ack=(ack<<1)+1;else ack=ack<<1;
        if(ACK&0x40000000) ack=(ack<<1)+1;else ack=ack<<1;
        if(ACK&0x80000000) ack=(ack<<1)+1;else ack=ack<<1;
        SWDCK1;        SWDCK0;////////////¡//Õâ¸öµØ·½ºÍÎĵµËµÃ÷»¹ÊÇÓгöÈëµÄ
        SWDCK1;        SWDCK0;//////////////Õâ¸öµØ·½ºÍÎĵµËµÃ÷»¹ÊÇÓгöÈëµÄ
        sleep_us(5);
        swd_tx_data(d32,32,0);                                                                                                                                                ///32bit
        sleep_us(5);
        if(bit_QiJiaoYan(d32)){SWDIO1;}
        else                                                                        {SWDIO0;}
        SWDCK1;        SWDCK0;                                                                                                                                                                        ///parity
        SWDIO1;
        return ack;
}
XIVN1987 发表于 2019-3-26 18:46 | 显示全部楼层
character 发表于 2020-9-22 08:16 | 显示全部楼层
9999jim 发表于 2021-9-17 15:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部