基于AT32F425移植DAPLink,已经打通,源码分享。
本帖最后由 muyichuan2012 于 2024-7-5 09:27 编辑AT32F425支持Crystal-less USB,,很适合用来做DAPLink。。所以移植了下,,代码在此:https://github.com/XIVN1987/DAPLink
现在基于HID的SWD调试器功能已经调通了,,基于CDC的虚拟串口通过串口助手往外发数据也没问题,,就是虚拟串口接收不到数据。。
对比了官方的 virtual_comport 例程,,实在找不出区别在哪里,,哪位熟悉AT32 USB的大神帮忙看下,,谢谢。。
--问题已解决,请看6楼。
有的群友反应GitHub访问速度慢,因此有下载一份源码放附件
原理图和 PCB 文件:https://oshwhub.com/xivn1987/daplink
没有晶振,,非常简介。。
安装雅特力官网提供的串口驱动试试 https://www.arterytek.com/download/USB_Tool_Driver/VirtualCOM_DriverInstall_V1.0.31.zip
CDC是免驱的
看起来是AT32F425 USB的0x83端点给上位机的IN包反馈不正确,,前面反馈NAK是正常的,,但是执行 usbd_ept_send(&Otg.dev, CDC_BULK_IN_EP, buff, len); 后 0x83 端点反馈就不正常了,,不知道什么情况下USB会对IN包给出这种反馈。。
本帖最后由 ArterySW 于 2022-12-30 09:10 编辑
问题解决了,,是因为我修改了 usb_conf.h,,从
#define USBD_RX_SIZE 128
#define USBD_EP0_TX_SIZE24
#define USBD_EP1_TX_SIZE20
#define USBD_EP2_TX_SIZE20
#define USBD_EP3_TX_SIZE20
#define USBD_EP4_TX_SIZE20
#define USBD_EP5_TX_SIZE20
#define USBD_EP6_TX_SIZE20
#define USBD_EP7_TX_SIZE20修改成了
#define USBD_RX_SIZE 128
#define USBD_EP0_TX_SIZE64
#define USBD_EP1_TX_SIZE64
#define USBD_EP2_TX_SIZE64
#define USBD_EP3_TX_SIZE64
#define USBD_EP4_TX_SIZE20
#define USBD_EP5_TX_SIZE20
#define USBD_EP6_TX_SIZE20
#define USBD_EP7_TX_SIZE20
我以为这里的大小单位是字节,,原来是字。。
基于 AT32F425F8 的 DAPLink 已调通,,不需要晶振,,电路更简洁,,代码在此:https://github.com/XIVN1987/DAPLink
竟然获得了现金打赏,,感谢老板 直接printf不好用吗? 虚拟串口有问题吗? ingramward 发表于 2023-1-5 12:52
虚拟串口有问题吗?
没问题。。 是不是程序进入了中断,不能执行后续的程序了。 adolphcocker 发表于 2023-1-5 13:49
是不是程序进入了中断,不能执行后续的程序了。
看6楼,,问题解决了。。 官网不是有源代码可以参考的吗 你的虚拟串口是否打开了 ? 下载程序以后,建议重新插拔一下。 这个没有移植过。 大家看6楼,问题已经解决了,已经把电路图和源码分享给大家。 非常棒!!!感谢分享,正好想要研究一下 SWDd_host.c 是干什么的呢 本帖最后由 muyichuan2012 于 2023-5-16 15:21 编辑
wziyi 发表于 2023-2-14 21:11
SWDd_host.c 是干什么的呢
上位机通过 USB 发送命令给 DAPLink,DAPLink 将命令转换成 SWD 波形发送到目标芯片,从而完成对目标芯片的读写控制。。
pyocd 是一个开源的 DAPLink 上位机(库),其最底层的 read_dp()、write_dp()、read_ap()、write_ap() 四个函数就是通过 USB 向 DAPLink 发送需要其通过 SWD 接口发出的数据,从而实现对目标芯片 DP、AP 寄存器的读写,,其他所有高层函数都是通过调用这四个函数实现的
SWD_host.c 就相当于在 DAPLink 主控本地实现的 pyocd(DAPLink 上位机库),,因为是在本地实现的,,因此它就不需要通过 USB 给 DAPLink 发送命令了,,而是直接调用 SWD 的 swd_transfer_retry() 函数,,把需要通过 SWD 接口发出的数据作为参数传递给该函数即可。。当然,它也实现了 swd_read_dp()、swd_write_dp()、swd_read_ap()、swd_write_ap() 四个最关键的底层函数
https://github.com/XIVN1987/MCUProg 通过 pyocd 控制 DAPLink(DAP.c、SW_DP.c)实现对目标芯片在线烧写
https://github.com/XIVN1987/DAPProg 通过 SWD_host.c 控制 DAPLink(DAP.c、SW_DP.c)实现对目标芯片离线烧写