<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="referrer" content="origin-when-cross-origin" />
<meta name="description" content="前言 daplink是个好东西,又便宜又好用,还不担心盗版,但是没有stlink和jlink那样的上位机可以直接下载固件,这就很头疼了。怎么办? 还好通过jtag/sw协议下载固件有很多开源的项目 项目介绍 openOCD 大名鼎鼎的openOCD(上手难度太高了,pass) python写的pyO" />
<meta property="og:description" content="前言 daplink是个好东西,又便宜又好用,还不担心盗版,但是没有stlink和jlink那样的上位机可以直接下载固件,这就很头疼了。怎么办? 还好通过jtag/sw协议下载固件有很多开源的项目 项目介绍 openOCD 大名鼎鼎的openOCD(上手难度太高了,pass) python写的pyO" />
<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>使用daplink下载任意格式固件 - USTHzhanglu - 博客园</title>
<link rel="canonical" href="https://www.cnblogs.com/USTHzhanglu/p/17960327" />
<link id="favicon" rel="shortcut icon" href="https://assets.cnblogs.com/favicon_v3_preview.ico?v=3" />
<link rel="stylesheet" href="/css/blog-common.min.css?v=g-c5Yfdgh3oAoyQibjhmJ6ylVcBcMRHNIG6JkF70hpY" />
<link id="highlighter-theme-prism-vs" type="text/css" rel="stylesheet" href="/css/prismjs/prism-vs.css?v=iw94Vx6XGFo5fy49uNJMV-ufDfBnPBmg30wF42RVSCk" />
<link type="text/css" rel="stylesheet" href="https://www.cnblogs.com/USTHzhanglu/custom.css?v=Y6fPrcDhXQiemHt2WNuAlI3O7Mk=" />
<link id="mobile-style" media="only screen and (max-width: 767px)" type="text/css" rel="stylesheet" href="/skins/SimpleMemory/bundle-simplememory-mobile-pure.min.css?v=F2e9dMGzAUzDRZU-W-4qVsoLMeDjGqD2cUFxFY5EcWc" />
<link type="application/rss+xml" rel="alternate" href="https://www.cnblogs.com/USTHzhanglu/rss" />
<link type="application/rsd+xml" rel="EditURI" href="https://www.cnblogs.com/USTHzhanglu/rsd.xml" />
<link type="application/wlwmanifest+xml" rel="wlwmanifest" href="https://www.cnblogs.com/USTHzhanglu/wlwmanifest.xml" />
<script>
var currentBlogId = 684784;
var currentBlogApp = 'USTHzhanglu';
var isLogined = true;
var isBlogOwner = false;
var skinName = 'SimpleMemory';
var visitorUserId = '8003c9f5-c155-4cd6-c10f-08d94e762654';
var hasCustomScript = true;
window.cb_enable_mathjax = true;
window.mathEngine = 0;
window.codeHighlightEngine = 2;
window.enableCodeLineNumber = false;
window.codeHighlightTheme = 'prism-vs';
window.darkModeCodeHighlightTheme = 'prism-vsc-dark-plus';
window.isDarkCodeHighlightTheme = false;
window.isDarkModeCodeHighlightThemeDark = true;
window.isDisableCodeHighlighter = false;
window.enableCodeThemeTypeFollowSystem = false;
window.enableMacStyleCodeBlock = false;
</script>
<script>
window.currentPostId = 17960327;
window.currentPostDateAdded = '2024-01-12 17:46';
</script>
<script src="https://assets.cnblogs.com/scripts/jquery-3.3.1.min.js"></script>
<script src="https://cdn-www.cnblogs.com/js/blog-common.min.js?v=E8kiz0yWOWB4k5jcScxZT6kREQmnElTu0TN8_HETKio"></script>
<script>updateCustomBlogReferrer();</script>
</head>
<body class="skin-simplememory no-navbar mathjax2">
<a name="top"></a>
<div id="top_nav" class="navbar forpc navbar-custom">
<nav id="nav_main" class="navbar-main">
<ul id="nav_left" class="navbar-list navbar-left">
<li class="navbar-branding">
<a href="https://www.cnblogs.com/" title="开发者的网上家园" role="banner">
<img src="//assets.cnblogs.com/logo.svg" alt="博客园Logo" />
</a>
</li>
<li><a href="https://cnblogs.vip/">会员</a></li>
<li><a href="https://www.cnblogs.com/cmt/p/17974346">周边</a></li>
<li>
<a href="https://news.cnblogs.com/" onclick="countClicks('nav', 'skin-navbar-news')">新闻</a>
</li>
<li>
<a href="https://q.cnblogs.com/" onclick="countClicks('nav', 'skin-navbar-q')">博问</a>
</li>
<li>
<a href="https://ai.hanghang.com/page/4649915" target="_blank">AI培训</a>
</li>
<li><a href="https://market.cnblogs.com" target="_blank">云市场</a></li>
</ul>
<ul id="nav_right" class="navbar-list navbar-right">
<li>
<form id="zzk_search" class="navbar-search dropdown" action="https://zzk.cnblogs.com/s" method="get" role="search">
<input name="w" id="zzk_search_input" placeholder="代码改变世界" type="search" tabindex="3" autocomplete="off" />
<button id="zzk_search_button" onclick="window.navbarSearchManager.triggerActiveOption()">
<img id="search_icon" class="focus-hidden" src="//assets.cnblogs.com/icons/search.svg" alt="搜索" />
<img class="hidden focus-visible" src="//assets.cnblogs.com/icons/enter.svg" alt="搜索" />
</button>
<ul id="navbar_search_options" class="dropdown-menu quick-search-menu">
<li tabindex="0" class="active" onclick="zzkSearch(event, document.getElementById('zzk_search_input').value)">
<div class="keyword-wrapper">
<img src="//assets.cnblogs.com/icons/search.svg" alt="搜索" />
<div class="keyword"></div>
</div>
<span class="search-area">所有博客</span>
</li>
<li tabindex="1" onclick="zzkBlogSearch(event, 'USTHzhanglu', document.getElementById('zzk_search_input').value)">
<div class="keyword-wrapper">
<img src="//assets.cnblogs.com/icons/search.svg" alt="搜索" />
<div class="keyword"></div>
</div>
<span class="search-area">当前博客</span>
</li>
<li tabindex="2" onclick="zzkBlogSearch(event, 'Motor-Control', document.getElementById('zzk_search_input').value)">
<div class="keyword-wrapper">
<img src="//assets.cnblogs.com/icons/search.svg" alt="搜索" />
<div class="keyword"></div>
</div>
<span class="search-area">我的博客</span>
</li>
</ul>
</form>
</li>
<li id="navbar_login_status" class="navbar-list">
<a class="navbar-user-info navbar-blog" href="https://i.cnblogs.com/EditPosts.aspx?opt=1" alt="写随笔" title="写随笔">
<img id="new_post_icon" class="navbar-icon" src="//assets.cnblogs.com/icons/newpost.svg" alt="写随笔" />
</a>
<a id="navblog-myblog-icon" class="navbar-user-info navbar-blog" href="https://passport.cnblogs.com/GetBlogApplyStatus.aspx" alt="我的博客" title="我的博客">
<img id="myblog_icon" class="navbar-icon" src="//assets.cnblogs.com/icons/myblog.svg" alt="我的博客" />
</a>
<a class="navbar-user-info navbar-message navbar-icon-wrapper" href="https://msg.cnblogs.com/" alt="短消息" title="短消息">
<img id="msg_icon" class="navbar-icon" src="//assets.cnblogs.com/icons/message.svg" alt="短消息" />
<span id="msg_count" style="display: none"></span>
</a>
<a id="navbar_lite_mode_indicator" data-current-page="blog" style="display: none" href="javascript:void(0)" alt="简洁模式" title="简洁模式启用,您在访问他人博客时会使用简洁款皮肤展示">
<img class="navbar-icon" src="//assets.cnblogs.com/icons/lite-mode-on.svg" alt="简洁模式" />
</a>
<div id="user_info" class="navbar-user-info dropdown">
<a class="dropdown-button" href="https://home.cnblogs.com/">
<img id="user_icon" class="navbar-avatar" src="//assets.cnblogs.com/icons/avatar-default.svg" alt="用户头像" />
</a>
<div class="dropdown-menu">
<a id="navblog-myblog-text" href="https://passport.cnblogs.com/GetBlogApplyStatus.aspx">我的博客</a>
<a href="https://home.cnblogs.com/">我的园子</a>
<a href="https://account.cnblogs.com/settings/account">账号设置</a>
<a href="javascript:void(0)" id="navbar_lite_mode_toggle" title="简洁模式会使用简洁款皮肤显示所有博客">
简洁模式 <img id="navbar_lite_mode_on" src="/images/lite-mode-check.svg" class="hide" /><span id="navbar_lite_mode_spinner" class="hide">...</span>
</a>
<a href="javascript:void(0)" onclick="account.logout();">退出登录</a>
</div>
</div>
<a class="navbar-anonymous" href="https://account.cnblogs.com/signup">注册</a>
<a class="navbar-anonymous" href="javascript:void(0);" onclick="account.login()">登录</a>
</li>
</ul>
</nav>
</div>
<div id="page_begin_html">
<!--
<embed class="aplayer" style="margin-right: 10%;"
frameborder="no" border="0" marginwidth="0" marginheight="0" width=300 height=240
src="//music.163.com/outchain/player?type=1&id=48418&auto=1&height=430">
-->
</div>
<!--done-->
<div id="home">
<div id="header">
<div id="blogTitle">
<a id="lnkBlogLogo" href="https://www.cnblogs.com/USTHzhanglu/"><img id="blogLogo" src="/skins/custom/images/logo.gif" alt="返回主页" /></a>
<!--done-->
<h1><a id="Header1_HeaderTitle" class="headermaintitle HeaderMainTitle" href="https://www.cnblogs.com/USTHzhanglu">USTHzhanglu</a>
</h1>
<h2></h2>
</div><!--end: blogTitle 博客的标题和副标题 -->
<div id="navigator">
<ul id="navList">
<li><a id="blog_nav_sitehome" class="menu" href="https://www.cnblogs.com/">
博客园</a>
</li>
<li>
<a id="blog_nav_myhome" class="menu" href="https://www.cnblogs.com/USTHzhanglu/">
首页</a>
</li>
<li>
<a id="blog_nav_newpost" class="menu" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">
新随笔</a>
</li>
<li>
<a id="blog_nav_contact" class="menu" href="https://msg.cnblogs.com/send/USTHzhanglu">
联系</a></li>
<li>
<!--<partial name="./Shared/_XmlLink.cshtml" model="Model" /></li>--></li>
<li>
<a id="blog_nav_admin" class="menu" href="https://i.cnblogs.com/">
管理</a>
</li>
</ul>
<div class="blogStats">
<div id="blog_stats_place_holder"><script>loadBlogStats();</script></div>
</div><!--end: blogStats -->
</div><!--end: navigator 博客导航栏 -->
</div><!--end: header 头部 -->
<div id="main">
<div id="mainContent">
<div class="forFlow">
<div id="post_detail">
<!--done-->
<div id="topics">
<div class="post">
<h1 class = "postTitle">
<a id="cb_post_title_url" class="postTitle2 vertical-middle" href="https://www.cnblogs.com/USTHzhanglu/p/17960327">
<span role="heading" aria-level="2">使用daplink下载任意格式固件</span>
</a>
</h1>
<div class="clear"></div>
<div class="postBody">
<div id="cnblogs_post_description" style="display: none">
使用daplink直接下载固件,无需keil
</div>
<div id="cnblogs_post_body" class="blogpost-body cnblogs-markdown">
<h1 id="前言">前言</h1>
<p>daplink是个好东西,又便宜又好用,还不担心盗版,但是没有stlink和jlink那样的上位机可以直接下载固件,这就很头疼了。怎么办?<br>
还好通过jtag/sw协议下载固件有很多开源的项目</p>
<h2 id="项目介绍">项目介绍</h2>
<h3 id="openocd">openOCD</h3>
<p>大名鼎鼎的openOCD(上手难度太高了,pass)</p>
<h3 id="python写的pyocd">python写的<a href="https://github.com/pyocd/pyOCD" target="_blank" rel="noopener">pyOCD</a></h3>
<blockquote>
<p>Open source Python library for programming and debugging Arm Cortex-M microcontrollers</p>
</blockquote>
<p>人生苦短,我用python</p>
<h3 id="rust写的probe-rs">rust写的<a href="https://github.com/probe-rs/probe-rs" target="_blank" rel="noopener">probe-rs</a></h3>
<blockquote>
<p>A debugging toolset and library for debugging embedded ARM and RISC-V targets on a separate host</p>
</blockquote>
<p>考虑下用rust重构项目吗?</p>
<p>pyOCD和probe-rs都可以使用命令行下载,前者有pack包就可以,后者需要用软件将pack包转换成yaml使用。</p>
<p>命令行指令官方有提供,但是用起来还是不够方便,打包成GUI会好很多。</p>
<h2 id="获取gui">获取GUI</h2>
<p>好人当然要做到底,这里奉上对应的GUI项目:</p>
<ol>
<li>
<p><a href="https://github.com/USTHzhanglu/dap_download" target="_blank" rel="noopener">dap-download</a></p>
<blockquote>
<p>一个简单的GUI,为DAP-LINK提供烧录工具,基于tkinter,pygubu和pyocd。</p>
</blockquote>
<p>早期写的GUI,由于pyocd有bug,只能给daplink用</p>
</li>
<li>
<p><a href="https://github.com/USTHzhanglu/probe-rs-gui" target="_blank" rel="noopener">probe-rs-gui</a></p>
<blockquote>
<p>a easy gui for probe-rs, use daplink/stlink/jlink download bin/elf/hex file</p>
</blockquote>
<p>好处是下载快,支持大部分link</p>
</li>
</ol>
<h2 id="上手使用">上手使用</h2>
<p>两个GUI操作方式相同(毕竟长得也完全一样),只是使用的配置文件不同。</p>
<h3 id="dap_download">dap_download</h3>
<p>使用该上位机,需要以下几个文件:</p>
<ol>
<li>pack包</li>
<li>固件,可以是bin/elf/hex</li>
<li>配置文件</li>
</ol>
<p>配置文件介绍:</p>
<pre><code class="language-yaml">target_override: GD32F310G8 #目标芯片型号
pack: #烧录算法所在位置,可以存放多个
./GD32F3x0_DFP.3.0.2.pack
frequency: 10000000 #烧录速率
</code></pre>
<p>yaml文件主要告诉pyocd要烧录的chip型号和对应的pack包在哪,通常把pack包和yaml放在一起即可。</p>
<p>然后在上位机页面,<code>选择bin文件</code>一项,选择要烧录的固件;</p>
<p><code>选择配置文件所在文件夹</code>一项,选择yaml文件所在的文件,点击<code>开始下载</code>即可。</p>
<h3 id="probe-rs-gui">probe-rs-GUI</h3>
<p>使用该上位机,需要以下几个文件:</p>
<ol>
<li>pack包</li>
<li>固件,可以是bin/elf/hex</li>
<li>配置文件</li>
</ol>
<p>配置文件介绍:</p>
<pre><code class="language-yaml">chip: HC32F4A0PGTB
pack_yaml: ./HC32F4A0-Series.yaml
speed: '16000'
base_address: '0x00000000' #just for bin file, default is 0x08000000. negligible
</code></pre>
<p>和dap_download不一样的是,probe-rs需要手动将pack包转成yaml文件,好在官方提供了转换方法 <a href="https://github.com/USTHzhanglu/probe-rs-gui/tree/main/example#yaml" target="_blank" rel="noopener">how to use</a></p>
<p>还有烧录Bin文件时,需要手动指定起始地址</p>
<p>然后在上位机页面,<code>Select Bin</code>一项,选择要烧录的固件;</p>
<p><code>Select Config</code>一项,选择yaml文件(注意不是pack包转换的yaml文件),点击<code>Download</code>即可。</p>
</div>
<div class="clear"></div>
<div id="blog_post_info_block" role="contentinfo">
<div id="blog_post_info"></div>
<div class="clear"></div>
<div id="post_next_prev"></div>
</div>
</div>
<div class="postDesc">posted @
<span id="post-date" data-last-update-days="67.1477056339155" data-date-created="BlogServer.Application.Dto.BlogPost.BlogPostDto" data-date-updated="2024-01-12 17:46">2024-01-12 17:46</span>
<a href="https://www.cnblogs.com/USTHzhanglu">USTHzhanglu</a>
阅读(<span id="post_view_count">86</span>)
评论(<span id="post_comment_count">0</span>)
<a href="https://i.cnblogs.com/EditPosts.aspx?postid=17960327" rel="nofollow">编辑</a>
<a href="javascript:void(0)" onclick="AddToWz(17960327);return false;">收藏</a>
<a href="javascript:void(0)" onclick="reportManager.report({ currentUserId: '8003c9f5-c155-4cd6-c10f-08d94e762654', targetType: 'blogPost', targetId: '17960327', targetLink: 'https://www.cnblogs.com/USTHzhanglu/p/17960327', title: '使用daplink下载任意格式固件' })">举报</a>
</div>
</div>
</div><!--end: topics 文章、评论容器-->
</div>
<script>
var cb_entryId = 17960327, cb_entryCreatedDate = '2024-01-12 17:46', cb_postType = 1, cb_postTitle = '使用daplink下载任意格式固件';
var allowComments = true, cb_blogId = 684784, cb_blogApp = 'USTHzhanglu', cb_blogUserGuid = 'a6f83abb-ac6f-4c63-8051-08d91391c1ab';
mermaidRender.render()
markdown_highlight()
zoomManager.apply("#cnblogs_post_body img:not(.code_img_closed):not(.code_img_opened)");
</script>
<a id="!comments"></a>
<div id="blog-comments-placeholder"></div>
<div id="comment_form" class="commentform">
<a name="commentform"></a>
<div id="divCommentShow"></div>
<div id="comment_nav">
<div class="comment-nav-right">
<span id="span_refresh_tips"></span><a href="javascript:void(0);" onclick="return RefreshCommentList();" id="lnk_RefreshComments" runat="server" clientidmode="Static">刷新评论</a><a href="#" onclick="return RefreshPage();">刷新页面</a><a href="#top">返回顶部</a>
</div>
</div>
<div id="comment_form_container"></div>
<div class="ad_text_commentbox" id="ad_text_under_commentbox"></div>
<div id="cnblogs_ch"></div>
<div id="opt_under_post"></div>
<div id="cnblogs_c1" class="under-post-card">
<a href="https://click.aliyun.com/m/1000390858/" rel="nofollow" target="_blank" onclick="countCreativeClicks('C1-阿里云-年度大降价')">
<img src="https://img2024.cnblogs.com/blog/35695/202402/35695-20240229194456450-851239093.jpg" onload="countCreativeImpressions('C1-阿里云-年度大降价')" alt="" />
<span id="c1_impression" style="display:none"></span>
</a>
</div>
<div id="under_post_card1"></div>
<div id="under_post_card2"></div>
<div id="HistoryToday" class="under-post-card"></div>
<script type="text/javascript">
var commentManager = new blogCommentManager();
commentManager.renderComments(0);
fixPostBody();
window.footnoteTipManager.generateFootnoteTips();
window.tocManager.displayDisableTocTips = false;
window.tocManager.generateToc();
setTimeout(function() { countViews(cb_blogId, cb_entryId); }, 50);
deliverT2();
deliverC1C2();
loadNewsAndKb();
LoadPostCategoriesTags(cb_blogId, cb_entryId);
LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate, cb_postType);
loadOptUnderPost();
GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);
</script>
</div>
</div><!--end: forFlow -->
</div><!--end: mainContent 主体内容容器-->
<div id="sideBar">
<div id="sideBarMain">
<div id="sidebar_news" class="newsItem">
<h3 class="catListTitle">公告</h3>
<div id="blog-news">
<div id="sidebar_news_content">
</div>
</div>
<script>loadBlogNews();</script>
</div>
<div id="sidebar_c3"></div>
<div id="blog-calendar" style="display:none"></div><script>loadBlogDefaultCalendar();</script>
<div id="leftcontentcontainer">
<div id="blog-sidecolumn"></div>
<script>loadBlogSideColumn();</script>
</div>
</div><!--end: sideBarMain -->
</div><!--end: sideBar 侧边栏容器 -->
<div class="clear"></div>
</div><!--end: main -->
<div class="clear"></div>
<div id="footer">
<!--done-->
Copyright © 2024 USTHzhanglu
<br /><span id="poweredby">Powered by .NET 8.0 on Kubernetes</span>
</div><!--end: footer -->
</div><!--end: home 自定义的最大容器 -->
<div id="page_end_html">
<!-- require APlayer -->
<link rel="stylesheet" href="https://cdn.cnblogs.com/npm/aplayer/dist/APlayer.min.css">
<script src="https://cdn.cnblogs.com/npm/aplayer/dist/APlayer.min.js"></script>
<!-- require MetingJS -->
<!-- <script src="https://unpkg.com/meting@2.0.1/dist/Meting.min.js"></script> -->
<script src="https://cdn.cnblogs.com/npm/meting@2.0.1/dist/Meting.min.js"></script>
<meting-js
id="48418"
lrc-type="1"
server="netease"
order="random"
type="album"
fixed="true"
mini="true"
autoplay="true"
volume="0.3"
list-olded="true">
</meting-js>
<!--https://www.cnblogs.com/fby698/p/12663089.html -->
</div>
<input type="hidden" id="antiforgery_token" value="CfDJ8C838EyK0EpKpQQcC9VwxBlQngFv2jZJAClsfzHuMSKzFF9X9uBwvmFizlCNBLlLilihqK1MB9044JhQp3KRg5rDG-FoM1bm763X5o9GP8_kw4mgf7HeLXc04TI7pxL0ScfoIYkNjP43UaxFW65-pcLQaDfW8iSLnt7r5ERvQTeWJxao_LblWNpxrAik5HZHkQ" />
<script async src="https://www.googletagmanager.com/gtag/js?id=G-M95P3TTWJZ"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-M95P3TTWJZ');
</script>
<script defer src="https://hm.baidu.com/hm.js?866c9be12d4a814454792b1fd0fed295"></script>
</body>
</html>