<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>IAP on Rancho&#39;s Notes</title>
    <link>https://fan-pengfei.top/tags/iap/</link>
    <description>Recent content in IAP on Rancho&#39;s Notes</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 19 Aug 2021 05:08:52 +0000</lastBuildDate>
    <atom:link href="https://fan-pengfei.top/tags/iap/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Stm32蓝牙串口下载</title>
      <link>https://fan-pengfei.top/posts/stm32%E8%93%9D%E7%89%99%E4%B8%B2%E5%8F%A3%E4%B8%8B%E8%BD%BD/</link>
      <pubDate>Thu, 19 Aug 2021 05:08:52 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/stm32%E8%93%9D%E7%89%99%E4%B8%B2%E5%8F%A3%E4%B8%8B%E8%BD%BD/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;之前准备电赛的时候，需要用到无线调试器，先是上淘宝看了一下，基本都是大几百，所以想着自己自制一个，直接搞DAP无线调试器有点难，所以就用手头现有的蓝牙模块搞了一个串口无线下载器，调试的话就靠printf打印了；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;也做了好几个版本，最初的版本主要有两个大的问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1、没有程序校验过程，不能保证单片机收到的APP程序是完整且正确的；
2、没有错误解决机制，一旦APP程序错误或者程序跑飞，就必须手动按下复位键进行复位；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;为解决以上两个问题，采取了以下措施&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1、对APP程序加入CRC校验；
2、加入看门狗，解决程序跑飞问题；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;以下是关于这个项目的具体介绍&#34;&gt;以下是关于这个项目的具体介绍：&lt;/h2&gt;
&lt;h3 id=&#34;一app程序部分&#34;&gt;一、APP程序部分&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;首先要有一个APP程序，与一般的程序相比，APP程序有两个地方需要进行配置：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;分别如下图所示：&lt;/p&gt;
&lt;p&gt;1、在system_stm32f4xx.c中进行修改：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/stm32%E8%93%9D%E7%89%99%E4%B8%B2%E5%8F%A3%E4%B8%8B%E8%BD%BD/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;2、在小锤子那里进行修改：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/stm32%E8%93%9D%E7%89%99%E4%B8%B2%E5%8F%A3%E4%B8%8B%E8%BD%BD/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;3、修改完毕后，进行正常的编译即可；&lt;/p&gt;
&lt;h3 id=&#34;二bin文件的处理&#34;&gt;二、BIN文件的处理&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;最初的版本并没有加入crc校验，所以经常会出错，导致程序经常跑飞，所以加入了crc32校验；经检验，效果那是非常的好；
为什么是采用bin文件而不是使用更容易得到的hex文件呢？
原因很简单：因为写入单片机flash的程序实际就是bin文件，hex文件需要转换才能写进flash中；
以上操作只是得到了hex文件，而我们需要的是bin文件，以下是对hex文件的处理过程：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1、第一步呢，当然是得到最初的bin文件；而Keil默认情况下编译成功后生成的是Hex文件，而不是bin文件，所以要将Hex文件转换为bin文件，当然是有现成的Hex转bin的程序的，但是比较麻烦，可以用Keil自带的功能完成编译后自动生成bin文件的过程，具体的方法请自行百度；&lt;/p&gt;
&lt;p&gt;这是我的配置，仅供参考：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;D:\Keil_v5\ARM\ARMCC\bin\fromelf.exe —bin -o fromelf —bin -o “$L@L.bin” “#L”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2、然后是对bin文件进行处理，也就是crc32校验码的生成以及插入该校验码到bin文件中，我用的是python脚本的方式，代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# -*- coding:utf-8 -*-&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; binascii
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; sys
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;crc2hex&lt;/span&gt;(crc):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        t&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;crc &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        crc &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%02X%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; (t, res)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; res
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputfile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;E:\IAP\APP\Project\OBJ\STM32F407.bin&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#实际存放的bin文件路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;isfile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;isfile(inputfile);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(inputfile);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(inputfile, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r+b&amp;#34;&lt;/span&gt;)  &lt;span style=&#34;color:#75715e&#34;&gt;#直接打开一个文件，如果文件不存在则创建文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;filesize &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;getsize(inputfile)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ZI app firmware size:&amp;#34;&lt;/span&gt;, filesize, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bytes.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#计算bin文件的CRC，首先清空CRC32区域的4个byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;seek(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x1c&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&lt;span style=&#34;color:#75715e&#34;&gt;#从bin文件开始，偏移地址为0x1c的地方存放bin的CRC32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clear4bytes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;00000000&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c4 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;binascii&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;unhexlify(clear4bytes)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(c4)  &lt;span style=&#34;color:#75715e&#34;&gt;#将CRC32存放的区域4bytes清零&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;seek(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&lt;span style=&#34;color:#75715e&#34;&gt;#从0开始读取整个bin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;file_content &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read()&lt;span style=&#34;color:#75715e&#34;&gt;#读整个文件内容到 file_content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; binascii&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;crc32(file_content)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;CRC32:&amp;#39;&lt;/span&gt;, hex(crc))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;seek(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x1c&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&lt;span style=&#34;color:#75715e&#34;&gt;#从bin文件开始，偏移地址为0x1c的地方存放bin的CRC32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#存放计算CRC32四个字节&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crcstr_2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; crc2hex(crc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;r&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;binascii&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;unhexlify(crcstr_2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(r)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sys&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;exit(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&lt;span style=&#34;color:#75715e&#34;&gt;##正常退出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;代码我就不多解释了，应该还是挺容易看懂的；&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
