walker2048 发表于 2023-5-11 10:16

【国民技术N32WB031_STB开发板评测】禁用SWD后的正确解决方案

本帖最后由 walker2048 于 2023-5-11 15:55 编辑

<h3 data-line="2" dir="auto" id="%E5%89%8D%E8%A8%80">前言</h3>

<p data-line="4" dir="auto">在国民技术群里,经常有朋友不小心禁用了SWD调试接口,导致无法连接到芯片的情况。然后也有群友搞不清楚这种情况下如何解决。现在我们来复现一下问题,并尝试解决。</p>

<p data-line="7" dir="auto">现在我打开了N32WB03x的GPIO案例工程,在工程代码里添加了禁用SWD接口的代码(将SWD接口初始化为输出模式)。</p>

<pre>
<code class="language-cpp">/**
* <a href="home.php?mod=space&amp;uid=159083" target="_blank">@brief </a>Main program.
*/
int main(void)
{
    /* Initialize Led1~Led2 as output pushpull mode*/
    LedInit(LED1_PORT, LED1_PIN);
    LedInit(LED2_PORT, LED2_PIN);
       
          /* Disable SWD */
          LedInit(GPIOA, GPIO_PIN_4);
          LedInit(GPIOA, GPIO_PIN_5);
   
    /*Turn on Led1~Led2*/
    LedOn(LED1_PORT, LED1_PIN);
    LedOn(LED2_PORT, LED2_PIN);</code></pre>

<p data-line="27" dir="auto">很好,在烧录程序并重启设备后,再次烧录程序失败了,可以开始了,提示如图。</p>

<p data-line="27" dir="auto"> &nbsp;</p>

<hr data-line="44" dir="auto" />
<h3 data-line="33" dir="auto" id="%E5%B8%B8%E8%A7%84%E5%BC%80%E5%8F%91%E6%9D%BF%E7%A6%81%E7%94%A8swd%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88">常规开发板禁用SWD的解决方案</h3>

<p data-line="3" dir="auto">方案一、例如国民的其他芯片,是带Boot引脚和ISP程序的。这些芯片是可通过配置Boot引脚,在重启时进入ISP下载模式。进入ISP下载模式后,即可使用SWD烧录新的程序,或者用ISP下载工具烧录新的程序进去。</p>

<p data-line="3" dir="auto">方案二、使用OpenOCD配合脚本清空Flash</p>

<ol>
        <li>
        <p>确保你的daplink固件支持JTAG/SWD接口。</p>
        </li>
        <li>
        <p>将JTAG/SWD连接器插入到芯片的JTAG/SWD接口上,并将daplink插入到计算机上。</p>
        </li>
        <li>
        <p>使用OpenOCD等支持JTAG/SWD的调试工具连接到daplink。</p>
        </li>
        <li>
        <p>在连接成功后,使用OpenOCD等调试工具运行以下命令清空flash:</p>
        </li>
</ol>

<pre>
<code>reset halt
flash erase_sector 0 0 last
reset</code></pre>

<p>其中,reset halt用于暂停芯片的执行;flash erase_sector用于擦除芯片的flash存储器,0表示擦除第0个扇区,last表示擦除最后一个扇区;reset用于复位芯片。</p>

<ol start="5">
        <li>执行完上述命令后,你的芯片的flash存储器将被清空。</li>
</ol>

<hr data-line="44" dir="auto" />
<h3 data-line="23" dir="auto" id="n32wb03x%E7%A6%81%E7%94%A8swd%E6%88%96%E8%80%85%E8%BF%9B%E5%85%A5%E7%9D%A1%E7%9C%A0%E7%8A%B6%E6%80%81%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8swd%E7%9A%84%E6%AD%A3%E7%A1%AE%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88">N32WB03x禁用SWD、或者进入睡眠状态无法使用SWD的正确解决方案</h3>

<p data-line="48" dir="auto">在国民技术群里,和官方技术人员沟通后得知,可以通过简单调整keil的debug配置,解决这两种情况下的芯片烧录问题。配置步骤如下(详细步骤看图片):</p>

<ol data-line="50" dir="auto">
        <li data-line="50" dir="auto">将开发板上的RESET-RST跳线用跳线帽连上(daplink的rst引脚和mcu的reset引脚,若不连接无法起作用,实在找不到跳线帽,可以临时把旁边的RX跳线帽拔过来用)</li>
        <li data-line="51" dir="auto">在keil里打开N32WB03x的工程,开始配置</li>
        <li data-line="52" dir="auto">点击Options for Target..图标</li>
        <li data-line="53" dir="auto">在弹出的窗口里点击Debug选项卡</li>
        <li data-line="54" dir="auto">点击Debugger旁边的setting按钮</li>
        <li data-line="55" dir="auto">在弹出的选项框左下角,点击Connect旁边的下拉菜单,选择Under Reset选项</li>
        <li data-line="56" dir="auto">点击各个选项卡的OK按钮保存配置</li>
        <li data-line="57" dir="auto">烧录设备</li>
</ol>

<p> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p>

<p>配置完成后,点击烧录按钮,就可以顺利烧录程序啦。</p>

<p>&nbsp;</p>

<p> &nbsp;其实在keil的帮助文档里搜索reset,可以在34567各种调试器的帮助文档里看到下面这段内容。已经说明了,under Reset选项是用于错误配置SWD引脚时使用该配置。</p>

<pre>
<code>The Connect selection controls what happens when the µVision debugger connects to the target device.

Normal — just stops the CPU at the currently executed instruction after connecting.
with Pre–reset — applies a hardware reset(HW RESET) before connecting to the device.
under Reset — holds the hardware reset(HW RESET) signal active while connecting to the device. You may use this option when the user program mistakenly disables the JTAG/SW interface. </code></pre>

<hr data-line="70" dir="auto" />
<h3 data-line="72" dir="auto" id="%E5%B0%8F%E5%81%8F%E6%96%B9">小偏方</h3>

<p data-line="74" dir="auto">除了上面的办法,其实也有一个办法能烧录(不需要配置keil的debug选项),就是先按住开发板的RESET按钮,然后点击keil的烧录按钮,在0.5秒后松开RESET按钮,就可以顺利烧录啦。本人测试过几次,成功几率50%。其实也就是让keil烧录开始时立即复位mcu。</p>

Jacktang 发表于 2023-5-11 21:51

<p>跟着楼主学N32WB03x禁用SWD、或者进入睡眠状态无法使用SWD的正确解决方案</p>
页: [1]
查看完整版本: 【国民技术N32WB031_STB开发板评测】禁用SWD后的正确解决方案