<?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>Rancho&#39;s Notes</title>
    <link>https://fan-pengfei.top/</link>
    <description>Recent content on Rancho&#39;s Notes</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sat, 01 Mar 2025 08:14:58 +0000</lastBuildDate>
    <atom:link href="https://fan-pengfei.top/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>一转四USB转TTL模块</title>
      <link>https://fan-pengfei.top/posts/%E4%B8%80%E8%BD%AC%E5%9B%9Busb%E8%BD%ACttl%E6%A8%A1%E5%9D%97/</link>
      <pubDate>Sat, 01 Mar 2025 08:14:58 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E4%B8%80%E8%BD%AC%E5%9B%9Busb%E8%BD%ACttl%E6%A8%A1%E5%9D%97/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;经常会遇到USB转TTL模块不够用的情况，因此这次直接搞一个一转四的USB转TTL模块，这下总够用了吧；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;原理图&#34;&gt;原理图&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%B8%80%E8%BD%AC%E5%9B%9Busb%E8%BD%ACttl%E6%A8%A1%E5%9D%97/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设计原理图&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;pcb&#34;&gt;PCB&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%B8%80%E8%BD%AC%E5%9B%9Busb%E8%BD%ACttl%E6%A8%A1%E5%9D%97/img-2.png&#34;&gt;
&lt;strong&gt;PCB图&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%B8%80%E8%BD%AC%E5%9B%9Busb%E8%BD%ACttl%E6%A8%A1%E5%9D%97/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PCB仿真图(正面)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%B8%80%E8%BD%AC%E5%9B%9Busb%E8%BD%ACttl%E6%A8%A1%E5%9D%97/img-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PCB仿真图(反面)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;在线bom&#34;&gt;在线BOM&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.fan-pengfei.top/HTML/USB2TTL&#34;&gt;BOM&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;实物图&#34;&gt;实物图&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%B8%80%E8%BD%AC%E5%9B%9Busb%E8%BD%ACttl%E6%A8%A1%E5%9D%97/img-5.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实物图(正面)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%B8%80%E8%BD%AC%E5%9B%9Busb%E8%BD%ACttl%E6%A8%A1%E5%9D%97/img-6.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实物图(反面)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;四个COM口！！！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%B8%80%E8%BD%AC%E5%9B%9Busb%E8%BD%ACttl%E6%A8%A1%E5%9D%97/img-7.jpg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>LOG分级打印</title>
      <link>https://fan-pengfei.top/posts/log%E5%88%86%E7%BA%A7%E6%89%93%E5%8D%B0/</link>
      <pubDate>Sun, 06 Aug 2023 03:46:57 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/log%E5%88%86%E7%BA%A7%E6%89%93%E5%8D%B0/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;这个是关于LOG分级打印的配置，并有时间戳，基于STM32H7和gcc；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;环境&#34;&gt;环境&lt;/h2&gt;
&lt;p&gt;STM32H743IIT6、STM32CubeMX、GCC、MakeFile&lt;/p&gt;
&lt;h2 id=&#34;printf映射&#34;&gt;printf映射&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;usart.c中加入以下代码&lt;/p&gt;
&lt;/blockquote&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;stdio.h&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;&lt;span style=&#34;color:#75715e&#34;&gt;/*# 7- Retarget printf to UART (std library and toolchain dependent) #########*/&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;#if defined(__GNUC__)
&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;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_write&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fd, &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ptr, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; len)
&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:#a6e22e&#34;&gt;HAL_UART_Transmit&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;huart1, (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)ptr, len, HAL_MAX_DELAY);
&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; len;
&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;#elif defined(__ICCARM__)
&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;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;LowLevelIOInterface.h&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;&lt;span style=&#34;color:#66d9ef&#34;&gt;size_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__write&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; handle, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buffer, &lt;span style=&#34;color:#66d9ef&#34;&gt;size_t&lt;/span&gt; size)
&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:#a6e22e&#34;&gt;HAL_UART_Transmit&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;huart1, (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)buffer, size, HAL_MAX_DELAY);
&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; size;
&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;#elif defined(__CC_ARM)
&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;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fputc&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ch, FILE &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;f)
&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:#a6e22e&#34;&gt;HAL_UART_Transmit&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;huart1, (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;ch, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, HAL_MAX_DELAY);
&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; ch;
&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;#endif
&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;#ifdef __GNUC__
&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;#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
&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;#else
&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;#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
&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;#endif &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/* __GNUC__ */&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;
&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;/**
&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; * @brief  Retargets the C library printf function to the USART.
&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; * @param  None
&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; * @retval None
&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; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PUTCHAR_PROTOTYPE
&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:#a6e22e&#34;&gt;HAL_UART_Transmit&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;huart1, (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;ch, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, HAL_MAX_DELAY);
&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; ch;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#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;MakeFile中删除以下配置：&lt;/p&gt;</description>
    </item>
    <item>
      <title>windows11下uboot烧录</title>
      <link>https://fan-pengfei.top/posts/windows11%E4%B8%8Buboot%E7%83%A7%E5%BD%95/</link>
      <pubDate>Sat, 29 Jul 2023 08:11:50 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/windows11%E4%B8%8Buboot%E7%83%A7%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;windows11下如何烧录uboot镜像呢？当然是用windows下的dd命令了；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先下载dd.exe，并将其命名为dd.exe，将其加入系统变量；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;http://www.chrysocome.net/downloads/ddrelease64.exe&#34;&gt;http://www.chrysocome.net/downloads/ddrelease64.exe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;测试如下图所示即安装成功：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/windows11%E4%B8%8Buboot%E7%83%A7%E5%BD%95/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后已有u-boot-sunxi-with-spl.bin，因而插入SD卡，输入以下命令：&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-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dd.exe &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;=.\u-boot-sunxi-with-spl.bin of=d:\temp.img bs=&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt; seek=&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/windows11%E4%B8%8Buboot%E7%83%A7%E5%BD%95/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后使用DiskImager将temp.img镜像烧录进SD卡即可。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;感觉之后生成的各种镜像只要组合成一个大的image就可以。&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>buildroot的OVERRIDE_SRCDIR机制</title>
      <link>https://fan-pengfei.top/posts/buildroot%E7%9A%84override_srcdir%E6%9C%BA%E5%88%B6/</link>
      <pubDate>Wed, 14 Jun 2023 02:58:23 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/buildroot%E7%9A%84override_srcdir%E6%9C%BA%E5%88%B6/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;使用buildroot构建系统的话，如果在output/build中对某个软件包修改的话，一旦使用make clean，就会导致自己做的修改被抹除；为避免这个情况，buildroot是提供了一种机制，也即&lt;code&gt;OVERRIDE_SRCDIR&lt;/code&gt;；
参考：&lt;a href=&#34;https://www.cnblogs.com/pwl999/p/15534966.html&#34;&gt;https://www.cnblogs.com/pwl999/p/15534966.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Buildroot的一般操作是下载tar包、提取、配置、编译和安装该tar包内的软件。源代码提取保存在临时目录&lt;code&gt;output/build/-&lt;/code&gt;目录中，当执行&lt;code&gt;make clean&lt;/code&gt;时，该目录会被完全删除，并在下一次make时重新创建。即使将Git或Subversion等版本管理系统作为软件包源代码的输入，Buildroot也会从中创建一个tar包，然后像对待一般tar包一样工作。&lt;/p&gt;
&lt;p&gt;这种方式非常适合将Buildroot当做集成工具，编译和集成嵌入式Linux系统的所有组件。但是，如果是在开发系统的某些组件的过程中使用Buildroot，这种方式非常不方便：开发者希望对一个软件包的源代码做少许修改，并能够使用Buildroot快速重建系统。
直接修改&lt;code&gt;output/build/-&lt;/code&gt;不是合适的解决方案，因为该目录会在&lt;code&gt;make clean&lt;/code&gt;时删除。&lt;/p&gt;
&lt;p&gt;因此，Buildroot针对该场景提供了一种特殊的机制，即&lt;code&gt;_OVERRIDE_SRCDIR&lt;/code&gt;机制。Buildroot读取一个override文档，该文档允许用户告诉Buildroot某些软件包的源代码位置。&lt;/p&gt;
&lt;p&gt;覆盖文档(override)的默认位置是&lt;code&gt;$(CONFIG_DIR)/local.mk&lt;/code&gt;。由&lt;code&gt;BR2_PACKAGE_OVERRIDE_FILE&lt;/code&gt;配置选项定义。&lt;code&gt;$(CONFIG_DIR)&lt;/code&gt;是Buildroot &lt;code&gt;.config&lt;/code&gt;文档的位置，因此&lt;code&gt;local.mk&lt;/code&gt;默认情况下与&lt;code&gt;.config&lt;/code&gt;文档放在一起，这意味着：这意味着:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Buildroot目录树内构建时位于Buildroot顶层目录中（当O=不使用时）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Buildroot目录树外构建时位于目录树外目录（当O=使用时）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果需要不同于这些默认值的位置，可以通过&lt;code&gt;BR2_PACKAGE_OVERRIDE_FILE&lt;/code&gt;配置选项指定。&lt;/p&gt;
&lt;p&gt;在这个override文档中，Buildroot期望找到以下形式中的行:&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-makefile&#34; data-lang=&#34;makefile&#34;&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;_OVERRIDE_SRCDIR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /path/to/pkg1/sources
&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;_OVERRIDE_SRCDIR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /path/to/pkg2/sources
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如:&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-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LINUX_OVERRIDE_SRCDIR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /home/bob/linux/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BUSYBOX_OVERRIDE_SRCDIR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /home/bob/busybox/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当Buildroot发现给定的软件包存在_OVERRIDE_SRCDIR定义时，它将不再尝试下载、提取和修补软件包，它将直接使用指定目录中可用的源代码，并且make clean时不会涉及该目录。这允许将Buildroot指向您自己的目录，该目录可以由Git、Subversion或其他版本控制系统管理。为此，Buildroot将使用rsync将软件包的源代码从_OVERRIDE_SRCDIR指定的位置复制到&lt;code&gt;output/build/-custom/&lt;/code&gt;目录。&lt;/p&gt;
&lt;p&gt;该机制最好与&lt;code&gt;make -rebuild&lt;/code&gt;和&lt;code&gt;make -reconfigure&lt;/code&gt;结合使用。make&lt;code&gt;-rebuild all&lt;/code&gt;将rsync源代码从&lt;code&gt;_OVERRIDE_SRCDIR&lt;/code&gt;到&lt;code&gt;output/build/-custom&lt;/code&gt;（只有修改过的文档会被复制），并重新启动这个软件包的构建过程。&lt;/p&gt;
&lt;p&gt;在上述Linux软件包的示例中，开发人员可以修改 &lt;code&gt;/home/bob/linux&lt;/code&gt;目录下的源代码，然后运行：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make linux-rebuild all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;并在几秒钟内在&lt;code&gt;output/images&lt;/code&gt;中获得更新后的Linux内核映像。类似地，可以在&lt;code&gt;/home/bob/busybox&lt;/code&gt;和后面对BusyBox源代码进行更改:&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make busybox-rebuild all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;output/images&lt;/code&gt;中的根文档系统映像包含更新后的BusyBox。&lt;/p&gt;
&lt;p&gt;大型项目一般有成百上千的文档，很多文档对于构建时是不需要的，但是会减慢rsync复制源代码的过程。可选的，可以定义&lt;code&gt;_OVERRIDE_SRCDIR_RSYNC_EXCLUSIONS&lt;/code&gt;跳过源代码中的某些文档。例如，当处理webkitgtk软件包时，以下内容将从本地WebKit源代码中排除：&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-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WEBKITGTK_OVERRIDE_SRCDIR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;home&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;bob&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;WebKit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WEBKITGTK_OVERRIDE_SRCDIR_RSYNC_EXCLUSIONS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#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;--exclude JSTests --exclude ManualTests --exclude PerformanceTests \&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;--exclude WebDriverTests --exclude WebKitBuild --exclude WebKitLibraries \&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;--exclude WebKit.xcworkspace --exclude Websites --exclude Examples&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认情况下，Buildroot会跳过VCS信息（例如.git或.svn）的同步。一些软件包在编译过程中会使用VCS信息，例如精确确认提交信息。要取消Buildroot的内置过滤规则，需要重新添加以下目录：&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-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LINUX_OVERRIDE_SRCDIR_RSYNC_EXCLUSIONS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; --include .git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>全志H3开发</title>
      <link>https://fan-pengfei.top/posts/%E5%85%A8%E5%BF%97h3%E5%BC%80%E5%8F%91/</link>
      <pubDate>Mon, 12 Jun 2023 02:34:07 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%85%A8%E5%BF%97h3%E5%BC%80%E5%8F%91/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近买了一块便宜的Linux开发板，是基于全志H3芯片的，想从头到尾跑一下开发流程；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;uboot开发&#34;&gt;Uboot开发&lt;/h1&gt;
&lt;h2 id=&#34;环境搭建&#34;&gt;环境搭建&lt;/h2&gt;
&lt;p&gt;安装好&lt;code&gt;make&lt;/code&gt;、&lt;code&gt;arm-linux-gnueabihf-&lt;/code&gt;等工具。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;66731729411d3b779b15ae939b3edbc&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%85%A8%E5%BF%97h3%E5%BC%80%E5%8F%91/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;9abe75f6eb356759b44633eaf2ab67f&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%85%A8%E5%BF%97h3%E5%BC%80%E5%8F%91/img-2.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;uboot编译&#34;&gt;Uboot编译&lt;/h2&gt;
&lt;p&gt;源码下载：&lt;a href=&#34;https://ftp.denx.de/pub/u-boot/&#34;&gt;https://ftp.denx.de/pub/u-boot/&lt;/a&gt;&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://ftp.denx.de/pub/u-boot/u-boot-2020.04.tar.bz2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;选择&lt;code&gt;u-boot-2020.04.tar.bz2&lt;/code&gt;即可；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用以下命令进行解压操作：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -xvf u-boot-2020.04.tar.bz2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后进行编译选项配置：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd u-boot-2020.04/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make -j4 ARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm CROSS_COMPILE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm-linux-gnueabihf- orangepi_lite_defconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译：&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- V=1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;uboot烧录&#34;&gt;Uboot烧录&lt;/h2&gt;
&lt;p&gt;准备一个micro SD卡（大于8GB）；&lt;/p&gt;
&lt;p&gt;通过读卡器插入电脑；&lt;/p&gt;
&lt;p&gt;安装并打开gparted：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install gparted
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo gparted
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;按照以下方式修改分区配置：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;a79398dcd897eee65a10a1093509cf6&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%85%A8%E5%BF%97h3%E5%BC%80%E5%8F%91/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1937ec428da5753e33a8b837fbf785d&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%85%A8%E5%BF%97h3%E5%BC%80%E5%8F%91/img-4.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;可能会出现&lt;code&gt;/sdb&lt;/code&gt;大小不对的问题，可以先取下读卡器，然后使用&lt;code&gt;sudo rm -rf /dev/sdb&lt;/code&gt;即可，然后再次进行分区即可；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用以下命令进行烧录即可：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dd &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;u-boot-sunxi-with-spl.bin of&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/dev/sdb bs&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt; seek&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;c45e7037f5e9aac71fb62139e471ffe&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%85%A8%E5%BF%97h3%E5%BC%80%E5%8F%91/img-5.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;上电测试&#34;&gt;上电测试&lt;/h2&gt;
&lt;p&gt;将SD卡插入开发板，给开发板上电，打开调试接口接口看到以下输出：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;871bacab875c25527f5ea4da991101a&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%85%A8%E5%BF%97h3%E5%BC%80%E5%8F%91/img-6.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;linux内核开发&#34;&gt;Linux内核开发&lt;/h1&gt;
&lt;h2 id=&#34;源码下载&#34;&gt;源码下载&lt;/h2&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone --depth &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;  --branch orange-pi-5.4  https://ghproxy.com/https://github.com/orangepi-xunlong/linux-orangepi.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd linux-orangepi/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;编译&#34;&gt;编译&lt;/h2&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make sunxi_defconfig ARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm CROSS_COMPILE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm-linux-gnueabihf-
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make -j8 zImage dtbs ARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm CROSS_COMPILE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm-linux-gnueabihf-
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生成的设备树和镜像路径：&lt;/p&gt;</description>
    </item>
    <item>
      <title>我的大学四年</title>
      <link>https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E5%A4%A7%E5%AD%A6%E5%9B%9B%E5%B9%B4/</link>
      <pubDate>Sun, 11 Jun 2023 02:45:00 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E5%A4%A7%E5%AD%A6%E5%9B%9B%E5%B9%B4/</guid>
      <description></description>
    </item>
    <item>
      <title>神奇的Jeff Dean</title>
      <link>https://fan-pengfei.top/posts/%E7%A5%9E%E5%A5%87%E7%9A%84jeff-dean/</link>
      <pubDate>Thu, 18 May 2023 13:29:42 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E7%A5%9E%E5%A5%87%E7%9A%84jeff-dean/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;很有一意思的一段趣闻；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://www.zhihu.com/question/582916722/answer/2951998203&#34;&gt;https://www.zhihu.com/question/582916722/answer/2951998203&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;During his own Google interview, Jeff Dean was asked the implications if P=NP were true. He said, “P = 0 or N = 1.” Then, before the interviewer had even finished laughing, Jeff examined Google’s public certificate and wrote the private key on the whiteboard.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当他被Google面试时，Jeff Dean被问及如果P=NP意味着什么。他说，“P=0 或者 N=1”。然后，在所有的面试官还没笑完之前，Jeff瞄了一眼Google的公共证书然后在白板上写上了对应的私钥。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Compilers don’t warn Jeff Dean. Jeff Dean warns compilers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;编译器从来不给Jeff编译警告，而是Jeff警告编译器。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The rate at which Jeff Dean produces code jumped by a factor of 40 in late 2000 when he upgraded his keyboard to USB 2.0.&lt;/p&gt;</description>
    </item>
    <item>
      <title>C语言实现交换二进制数的任意两位</title>
      <link>https://fan-pengfei.top/posts/c%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0%E4%BA%A4%E6%8D%A2%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%95%B0%E7%9A%84%E4%BB%BB%E6%84%8F%E4%B8%A4%E4%BD%8D/</link>
      <pubDate>Mon, 17 Apr 2023 10:34:30 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/c%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0%E4%BA%A4%E6%8D%A2%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%95%B0%E7%9A%84%E4%BB%BB%E6%84%8F%E4%B8%A4%E4%BD%8D/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近在用LED组成的数码管，由于位号硬件上有所改动，因而需要进行码值位之间的交换；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;以下是一段C语言函数，实现将一个八位的二进制数的任意两位交换：&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&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;/**&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; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;brief   &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;param x &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;param i &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;param j &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;swap_bits&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; j)
&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;// 获取第i位和第j位的值
&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;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; bit_i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; i) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; bit_j &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; j) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;// 如果第i位和第j位的值不同，那么交换它们
&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;if&lt;/span&gt; (bit_i &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; bit_j)
&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;        x &lt;span style=&#34;color:#f92672&#34;&gt;^=&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>基于esp32的手表</title>
      <link>https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Eesp32%E7%9A%84%E6%89%8B%E8%A1%A8/</link>
      <pubDate>Wed, 12 Apr 2023 07:03:56 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Eesp32%E7%9A%84%E6%89%8B%E8%A1%A8/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;这个是小一的第六个正式版本了，这次是用ESP32作为主控的；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;硬件&#34;&gt;硬件&lt;/h2&gt;
&lt;h3 id=&#34;原理图&#34;&gt;原理图&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Eesp32%E7%9A%84%E6%89%8B%E8%A1%A8/img-1.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;pcb&#34;&gt;PCB&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Eesp32%E7%9A%84%E6%89%8B%E8%A1%A8/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Eesp32%E7%9A%84%E6%89%8B%E8%A1%A8/img-3.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;在线bom&#34;&gt;在线BOM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.fan-pengfei.top/HTML/ESP32_LCD&#34;&gt;在线BOM&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;实物图&#34;&gt;实物图&lt;/h3&gt;</description>
    </item>
    <item>
      <title>Kicad生成Gerber文件</title>
      <link>https://fan-pengfei.top/posts/kicad%E7%94%9F%E6%88%90gerber%E6%96%87%E4%BB%B6/</link>
      <pubDate>Wed, 12 Apr 2023 02:16:43 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/kicad%E7%94%9F%E6%88%90gerber%E6%96%87%E4%BB%B6/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;这个是针对嘉立创打样的；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;单击菜单栏【文档】 &amp;raquo; 【绘制】，格式选择【Gerber】，各项设置如下截图所示。&lt;/p&gt;
&lt;p&gt;配置以下选项：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/kicad%E7%94%9F%E6%88%90gerber%E6%96%87%E4%BB%B6/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后点击绘制即可：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/kicad%E7%94%9F%E6%88%90gerber%E6%96%87%E4%BB%B6/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击生成钻孔文件：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/kicad%E7%94%9F%E6%88%90gerber%E6%96%87%E4%BB%B6/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;配置钻孔选项：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/kicad%E7%94%9F%E6%88%90gerber%E6%96%87%E4%BB%B6/img-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后生成钻孔文件和映射文件即可：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/kicad%E7%94%9F%E6%88%90gerber%E6%96%87%E4%BB%B6/img-5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;将生成的文件打包就可以进行打样了；&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>PID进阶教程</title>
      <link>https://fan-pengfei.top/posts/pid%E8%BF%9B%E9%98%B6%E6%95%99%E7%A8%8B/</link>
      <pubDate>Sun, 09 Apr 2023 04:47:04 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/pid%E8%BF%9B%E9%98%B6%E6%95%99%E7%A8%8B/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;PID精进教程；
这篇文章的主要内容是如何改进初学者的PID控制器。文章中提到，初学者的PID控制器设计的目的是不规则地调用。这会导致两个问题：您无法从PID获得一致的行为，因为有时它被频繁调用，有时则没有。您需要进行额外的数学计算，以计算导数和积分，因为它们都依赖于时间的变化。作者提出了一种新的方法，称为“Proportional on Measurement”，可以解决这些问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;任何编写自己的 PID 算法的人都可以看看我是如何做的，并可以从中学到他们需要的东西。&lt;/p&gt;
&lt;p&gt;这将是一个艰难的过程，但我想我找到了一种不太痛苦的方式来解释我的代码。我将从所谓的“初学者的 PID”开始。然后我将逐步改进它，直到我们得到一个高效、健壮的 pid 算法。&lt;/p&gt;
&lt;h2 id=&#34;pid的开始&#34;&gt;PID的开始&lt;/h2&gt;
&lt;p&gt;这是初学PID的人都知道的公式：&lt;/p&gt;
&lt;p&gt;Output=K_pe(t)+K_t\int{e(t)dt}+K_D{\frac{d}{dt}}e(t)
Where:e=Setpoint-Input&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;公式(2)也就是指偏差e等于设定值和当前值的差别；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;根据这个公式，大多数都能写出下面的代码：&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/*working variables*/&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;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; lastTime;
&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;double&lt;/span&gt; Input, Output, Setpoint;
&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;double&lt;/span&gt; errSum, lastErr;
&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;double&lt;/span&gt; kp, ki, kd;
&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Compute&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;/*How long since we last calculated*/&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;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; now &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;millis&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;double&lt;/span&gt; timeChange &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;)(now &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; lastTime);
&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;/*Compute all the working error variables*/&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;double&lt;/span&gt; error &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Setpoint &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; Input;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   errSum &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; (error &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; timeChange);
&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;double&lt;/span&gt; dErr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (error &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; lastErr) &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; timeChange;
&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;/*Compute PID Output*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Output &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; kp &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; error &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; ki &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; errSum &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; kd &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; dErr;
&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;/*Remember some variables for next time*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   lastErr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; error;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   lastTime &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; now;
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SetTunings&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; Kp, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; Ki, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; Kd)
&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;   kp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Kp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   ki &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Ki;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   kd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Kd;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Compute()&lt;/code&gt;被定期或不定期地调用，并且运行良好。不过，这个系列并不是关于“工作得很好”。如果我们要将这段代码变成与工业 PID 控制器相当的东西，我们必须解决一些问题：&lt;/p&gt;</description>
    </item>
    <item>
      <title>基于Arduino的LVGL移植</title>
      <link>https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/</link>
      <pubDate>Fri, 07 Apr 2023 05:47:41 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;这是一篇如何将LVGL移植到Arduino的教程(基于芯片ESP32 Pico D4)；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;软件版本&#34;&gt;软件版本&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;这次实验使用的lvgl版本是8.1.1，要先配置好tft_espi，确保显示正常；如果要使用触摸屏设备，在移植之前要确保能获取到触摸数据；&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;工程配置&#34;&gt;工程配置&lt;/h2&gt;
&lt;h3 id=&#34;库安装&#34;&gt;库安装&lt;/h3&gt;
&lt;p&gt;添加lvgl库 ，最好也添加lv_examples库，自带的例子虽然内容完全一样，但是并不能直接使用；&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;库安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后复制为lv_conf_template.h为lv_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lv_conf.h创建&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后复制为lv_demo_conf_template.h为lv_demo_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lv_demo_conf.h创建&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;配置文件&#34;&gt;配置文件&lt;/h3&gt;
&lt;h4 id=&#34;lv_confh&#34;&gt;lv_conf.h&lt;/h4&gt;
&lt;p&gt;修改这几个地方；&lt;/p&gt;
&lt;p&gt;启动lv_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-4.png&#34;&gt;
&lt;strong&gt;启动lv_conf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;设置色深，一般都是16：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-5.png&#34;&gt;
&lt;strong&gt;设置色深&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;启动自定义时钟，不设置的话只会显示第一帧不动：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-6.png&#34;&gt;
&lt;strong&gt;启动自定义时钟&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;LV_DPI_DEF 注意这里，虽然LVGL的作者说这个没这么重要，但他会严重影响到LVGL的动画效果，你应该进行DPI的手动计算，例如240x280分辨率1.69英寸的屏幕，那么 DPI为：&lt;/p&gt;
&lt;p&gt;LV_DPI_DEF =\frac{\sqrt{240*280} }{1.69} ≈ 153
&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-7.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LV_DPI_DEF配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;也可以使能日志打印：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-8.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使能日志打印&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;lv_demo_confh&#34;&gt;lv_demo_conf.h&lt;/h4&gt;
&lt;p&gt;修改这几个地方；&lt;/p&gt;
&lt;p&gt;启动lv_demo_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-9.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;启动Demo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;配置要运行的Demo：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-10.png&#34;&gt;
&lt;strong&gt;Demo选择&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;自定义显示接口和外部输入接口&#34;&gt;自定义显示接口和外部输入接口&lt;/h2&gt;
&lt;h3 id=&#34;文件添加&#34;&gt;文件添加&lt;/h3&gt;
&lt;p&gt;在src文件夹下添加以下两个文件：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-11.png&#34;&gt;
&lt;strong&gt;自定义接口&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;代码内容&#34;&gt;代码内容&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;my_lv_ports.cpp&lt;/code&gt;&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;my_lv_ports.h&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;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;CST816T.h&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;&lt;span style=&#34;color:#75715e&#34;&gt;// TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TFT_eSPI tft &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TFT_eSPI&lt;/span&gt;();     &lt;span style=&#34;color:#75715e&#34;&gt;/* TFT instance */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CST816T &lt;span style=&#34;color:#a6e22e&#34;&gt;touch&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;19&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;21&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// sda, scl, rst, irq
&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;// /*Read the touchpad*/
&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_touchpad_read&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;lv_indev_drv_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;indev_driver, &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_indev_data_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;data)
&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;bool&lt;/span&gt; FingerNum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;uint8_t&lt;/span&gt; gesture;
&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;uint16_t&lt;/span&gt; touchX, touchY;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    FingerNum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; touch.&lt;span style=&#34;color:#a6e22e&#34;&gt;getTouch&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;touchX, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;touchY, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gesture);
&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;if&lt;/span&gt; (FingerNum)
&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;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;state &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LV_INDEV_STATE_REL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;point.x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; touchX;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;point.y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; touchY;
&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;#if LV_USE_LOG != 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Serial.&lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Touch: x=%d y=%d mode=%d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, touchX, touchY, gesture);
&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;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        FingerNum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;else&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;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;state &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LV_INDEV_STATE_PR;
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/* Display flushing */&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_disp_flush&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;lv_disp_drv_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;disp, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_area_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;area,
&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;lv_color_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;color_p)
&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;uint32_t&lt;/span&gt; w &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;x2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;x1 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;uint32_t&lt;/span&gt; h &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;y2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;y1 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;setSwapBytes&lt;/span&gt;(true);
&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;// tft.pushImageDMA(area-&amp;gt;x1, area-&amp;gt;y1, w, h, (uint16_t *)&amp;amp;color_p-&amp;gt;full);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;pushImage&lt;/span&gt;(area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;x1, area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;y1, w, h, (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;color_p&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;full);
&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;// tft.startWrite();
&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;// tft.setAddrWindow( area-&amp;gt;x1, area-&amp;gt;y1, w, h );
&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;// tft.pushColors( ( uint16_t * )&amp;amp;color_p-&amp;gt;full, w * h, true );
&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;// tft.endWrite();
&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:#a6e22e&#34;&gt;lv_disp_flush_ready&lt;/span&gt;(disp);
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#if LV_USE_LOG != 0
&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_print&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buf)
&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;    Serial.&lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, buf);
&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;#endif
&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:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_disp_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;// 绘图缓冲初始化
&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;//   static lv_disp_draw_buf_t draw_buf;
&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;//   static lv_color_t buf[screenWidth * 10];
&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;//   lv_disp_draw_buf_init(&amp;amp;draw_buf, buf, NULL, screenWidth * 10);
&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:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_disp_draw_buf_t&lt;/span&gt; draw_buf;
&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_color_t&lt;/span&gt; buf_2_1[screenWidth &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;]; &lt;span style=&#34;color:#75715e&#34;&gt;/*A buffer for 10 rows*/&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_color_t&lt;/span&gt; buf_2_2[screenWidth &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;]; &lt;span style=&#34;color:#75715e&#34;&gt;/*An other buffer for 10
&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;    rows*/&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:#a6e22e&#34;&gt;lv_disp_draw_buf_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;draw_buf, buf_2_1, buf_2_2,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          screenWidth &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;/*Initialize
&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;                          the display buffer*/&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;// TFT驱动初始化
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;begin&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;/* TFT init */&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;// tft.initDMA();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;setRotation&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;/* Landscape orientation, flipped */&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;// 设置LVGL显示设备
&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_disp_drv_t&lt;/span&gt; disp_drv;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_disp_drv_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;disp_drv);
&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;/*Change the following line to your display resolution*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.hor_res &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; screenWidth;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.ver_res &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; screenHeight;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.flush_cb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; my_disp_flush;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.draw_buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;draw_buf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_disp_drv_register&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;disp_drv);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    touch.&lt;span style=&#34;color:#a6e22e&#34;&gt;begin&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;// 设置LVGL输入设备（电阻屏）
&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_indev_drv_t&lt;/span&gt; indev_drv;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_indev_drv_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;indev_drv);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    indev_drv.type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LV_INDEV_TYPE_POINTER;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    indev_drv.read_cb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; my_touchpad_read;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_indev_drv_register&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;indev_drv);
&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;// 设置LVGL串口输出设备（调试用）
&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;#if LV_USE_LOG != 0
&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:#a6e22e&#34;&gt;lv_log_register_print_cb&lt;/span&gt;(my_print);
&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;#endif
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;my_lv_ports.h&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>TODO</title>
      <link>https://fan-pengfei.top/posts/todo/</link>
      <pubDate>Tue, 04 Apr 2023 12:29:45 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/todo/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;有空就会做的事；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;记得翻译一下这篇文章&#34;&gt;记得翻译一下这篇文章&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/&#34;&gt;PID精进教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;完成否？&lt;strong&gt;否&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;创建于：2023年4月4日20:32:45
完成于：
备注：&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>ESP32-PICO-D4开发记录</title>
      <link>https://fan-pengfei.top/posts/esp32-pico-d4%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Sat, 01 Apr 2023 07:04:46 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/esp32-pico-d4%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;我这两天又翻出来了之前做的一个ESP32-Pico-D4的板子，之前测是发现会无限重启，结果现在再试，下进去一个新的程序就能用了，这里记录一下开发中遇到的问题；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;pico-d4介绍&#34;&gt;Pico D4介绍&lt;/h2&gt;
&lt;p&gt;这个芯片资源挺多的，最主要的是内嵌了晶振和Flash，在板子布线方面容易了许多；&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/esp32-pico-d4%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;芯片特性&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;原理图设计&#34;&gt;原理图设计&lt;/h2&gt;
&lt;h3 id=&#34;原理图设计参考&#34;&gt;原理图设计参考&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/esp32-pico-d4%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原理图参考&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/esp32-pico-d4%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/img-3.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实物图片&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;重启问题&#34;&gt;重启问题&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ESP32&lt;/code&gt; 启动时会有如下打印:&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中 &lt;code&gt;rst&lt;/code&gt; 简单说明如下:&lt;/p&gt;
&lt;p&gt;PRO
APP
源
复位方式
注释&lt;/p&gt;
&lt;h2 id=&#34;系统复位&#34;&gt;0x01
0x01
芯片上电复位
系统复位&lt;/h2&gt;
&lt;p&gt;0x10
0x10
RWDT 系统复位
系统复位
详见 ESP32 技术参考手册 WDT 章节&lt;/p&gt;
&lt;p&gt;0x0F
0x0F
欠压复位
系统复位
详见 ESP32 技术参考手册 Power Management 章节&lt;/p&gt;
&lt;p&gt;0x03
0x03
软件系统复位
内核复位
配置 RTC_CNTL_SW_SYS_RST 寄存器&lt;/p&gt;
&lt;p&gt;0x05
0x05
Deep Sleep Reset
内核复位
详见 ESP32 技术参考手册 Power Management 章节&lt;/p&gt;
&lt;p&gt;0x07
0x07
MWDT0 全局复位
内核复位
详见 ESP32 技术参考手册 WDT 章节&lt;/p&gt;</description>
    </item>
    <item>
      <title>docker初尝试</title>
      <link>https://fan-pengfei.top/posts/docker%E5%88%9D%E5%B0%9D%E8%AF%95/</link>
      <pubDate>Sun, 19 Mar 2023 02:27:15 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/docker%E5%88%9D%E5%B0%9D%E8%AF%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;docker初体验；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;docker常用命令&#34;&gt;docker常用命令&lt;/h3&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#docker常用命令:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1. 查看容器:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      docker ps
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2. 查看镜像:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      docker images
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3. 删除容器:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      docker rm 容器name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4. 删除镜像:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      docker rmi 镜像id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5. 创建容器:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      docker run --name dockermysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=654321 mysql:5.7.23
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6. 启动容器:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      docker start 容器name #docker start dockermysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;7. 重启容器:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      docker restart dockermysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;8. 停止容器:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      docker stop dockermysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;9. 容器交互:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      docker exec -it dockermysql bash #或 docker attach dockermysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10.退出交互:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Ctrl+P,Ctrl+Q(Ctrl键一直保持按下)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;11.设置开机自启:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      systemctl enable docker
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;12.容器设置自启,update命令:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      docker update --restart=always aeccnginx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;13.启动docker
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      systemctl start docker
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;14.重启docker
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>使用C和C&#43;&#43;进行混合编程</title>
      <link>https://fan-pengfei.top/posts/%E4%BD%BF%E7%94%A8c%E5%92%8Cc&#43;&#43;%E8%BF%9B%E8%A1%8C%E6%B7%B7%E5%90%88%E7%BC%96%E7%A8%8B/</link>
      <pubDate>Tue, 07 Mar 2023 08:53:27 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E4%BD%BF%E7%94%A8c%E5%92%8Cc&#43;&#43;%E8%BF%9B%E8%A1%8C%E6%B7%B7%E5%90%88%E7%BC%96%E7%A8%8B/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;在做毕设过程中，用到了八个相同的传感器，传感器的通信协议都是一样的，固然直接搞八个差不多的文件来驱动传感器是没问题的，但是有一种更简洁的方式，那就是使用C++，来复用通信程序；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://zhuanlan.zhihu.com/p/115068898&#34;&gt;https://zhuanlan.zhihu.com/p/115068898&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;环境说明&#34;&gt;环境说明&lt;/h2&gt;
&lt;p&gt;使用的单片机芯片是STM32F103C6T6；&lt;/p&gt;
&lt;p&gt;Keil编译器版本为AC6；&lt;/p&gt;
&lt;p&gt;Keil的配置如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;9a6b1374da89853d9d500b3792554de&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%BD%BF%E7%94%A8c%E5%92%8Cc++%E8%BF%9B%E8%A1%8C%E6%B7%B7%E5%90%88%E7%BC%96%E7%A8%8B/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;4e46e254a889e95aa63b9372544005a&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%BD%BF%E7%94%A8c%E5%92%8Cc++%E8%BF%9B%E8%A1%8C%E6%B7%B7%E5%90%88%E7%BC%96%E7%A8%8B/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后是将C++源文件配对的头文件改为使用C++编译器进行编译；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;39b78c1a29418c47f0dfe5754d01e79&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%BD%BF%E7%94%A8c%E5%92%8Cc++%E8%BF%9B%E8%A1%8C%E6%B7%B7%E5%90%88%E7%BC%96%E7%A8%8B/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;cfa936edc4b94fe0bf76455e5dd19e2&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%BD%BF%E7%94%A8c%E5%92%8Cc++%E8%BF%9B%E8%A1%8C%E6%B7%B7%E5%90%88%E7%BC%96%E7%A8%8B/img-4.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;源码编写&#34;&gt;源码编写&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;注意把main文件的后缀也改为.cpp，否则会出错；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;头文件&#34;&gt;头文件：&lt;/h3&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-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;&lt;span style=&#34;color:#75715e&#34;&gt; * @Author       : fan-pengfei 2253770787@qq.com
&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; * @Date         : 2023-03-07 13:43:38
&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; * @LastEditors  : fan-pengfei 2253770787@qq.com
&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; * @LastEditTime : 2023-03-07 14:41:29
&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; * @FilePath     : \Core\Inc\ds18b20.h
&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; * @Description  :
&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; * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
&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; */&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;#ifndef __DS18B20_H
&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;#define __DS18B20_H
&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;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;main.h&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;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;tim.h&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;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Class&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:#66d9ef&#34;&gt;private&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    GPIO_TypeDef &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;BSP_DS18B20_PORT;
&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;uint16_t&lt;/span&gt; BSP_DS18B20_PIN;
&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;float&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;Temp_Sum;
&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;uint8_t&lt;/span&gt; LOCATION;
&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;public&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_Class(GPIO_TypeDef &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;BSP_DS18B20_PORT, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; BSP_DS18B20_PIN, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; LOCATION, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;Temp_data);
&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;delay_us&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; us);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    GPIO_PinState &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_IN&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_OUT_1&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_OUT_0&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Mode_OUT_PP&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Mode_IN_NP&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Reset&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Presence&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_ReadBit&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_ReadByte&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_WriteByte&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; dat);
&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_ReadId&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ds18b20_id);
&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_SkipRom&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_MatchRom&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;float&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_GetTemp_SkipRom&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;float&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_GetTemp_MatchRom&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ds18b20_id);
&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Start_Convert&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Get_Data&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; ds18b20_id[&lt;span style=&#34;color:#ae81ff&#34;&gt;64&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;};
&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;extern&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C&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:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User_DS18B20_Init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User_Start_Convert&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User_Get_Data&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;源文件&#34;&gt;源文件：&lt;/h3&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-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;&lt;span style=&#34;color:#75715e&#34;&gt; * @Author       : fan-pengfei 2253770787@qq.com
&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; * @Date         : 2023-03-07 13:43:26
&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; * @LastEditors  : fan-pengfei 2253770787@qq.com
&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; * @LastEditTime : 2023-03-07 16:41:42
&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; * @FilePath     : \Core\Src\ds18b20.cpp
&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; * @Description  :
&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; * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
&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; */&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;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;ds18b20.h&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;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;main.h&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;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;DS18B20_ID.h&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;&lt;span style=&#34;color:#66d9ef&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; Temp_Sum[&lt;span style=&#34;color:#ae81ff&#34;&gt;64&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;void&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;delay_us(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; us)
&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;    tim_delay_us(us);
&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;// uint32_t delay;
&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;// delay = (1600 * us);
&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;// while (delay--)
&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;// {
&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;// }
&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;GPIO_PinState DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_IN(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;HAL_GPIO_ReadPin&lt;/span&gt;(BSP_DS18B20_PORT, BSP_DS18B20_PIN);
&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;void&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_OUT_1(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    HAL_GPIO_WritePin(BSP_DS18B20_PORT, BSP_DS18B20_PIN, GPIO_PIN_SET);
&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;void&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_OUT_0(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    HAL_GPIO_WritePin(BSP_DS18B20_PORT, BSP_DS18B20_PIN, GPIO_PIN_RESET);
&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;/**
&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; * @brief DS18B20 输出模式
&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; */&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;void&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_Mode_OUT_PP(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    GPIO_InitTypeDef GPIO_InitStruct;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    GPIO_InitStruct.Pin &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BSP_DS18B20_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    GPIO_InitStruct.Mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_MODE_OUTPUT_PP;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    GPIO_InitStruct.Speed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_SPEED_FREQ_HIGH;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    HAL_GPIO_Init(BSP_DS18B20_PORT, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;GPIO_InitStruct);
&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;/**
&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; * @brief DS18B20 输入模式
&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; */&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;void&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_Mode_IN_NP(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    GPIO_InitTypeDef GPIO_InitStruct;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    GPIO_InitStruct.Pin &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BSP_DS18B20_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    GPIO_InitStruct.Mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_MODE_INPUT;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    GPIO_InitStruct.Pull &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_NOPULL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    HAL_GPIO_Init(BSP_DS18B20_PORT, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;GPIO_InitStruct);
&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;/**
&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; * @brief 主机给从机发送复位脉冲
&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; */&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;void&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_Reset(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    DS18B20_Mode_OUT_PP(); &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;    DS18B20_OUT_0();       &lt;span style=&#34;color:#75715e&#34;&gt;// 主机至少产生 480us 的低电平复位信号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    delay_us(&lt;span style=&#34;color:#ae81ff&#34;&gt;750&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_OUT_1(); &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;    &lt;span style=&#34;color:#75715e&#34;&gt;// 从机接收到主机的复位信号后，会在 15 ~ 60 us 后给主机发一个存在脉冲
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    delay_us(&lt;span style=&#34;color:#ae81ff&#34;&gt;15&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;/**
&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; * @brief  检测从机给主机返回的存在脉冲
&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; * @return 0：成功		1：失败
&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; */&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;uint8_t&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_Presence(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; pulse_time &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_Mode_IN_NP();                      &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;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (DS18B20_IN() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; (pulse_time &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#66d9ef&#34;&gt;else&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;        pulse_time &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;(DS18B20_IN()) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pulse_time &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;240&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:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#66d9ef&#34;&gt;else&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:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;&lt;span style=&#34;color:#75715e&#34;&gt; * @brief 从DS18B20读取一个bit
&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; */&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;uint8_t&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_ReadBit(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; dat;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_Mode_OUT_PP(); &lt;span style=&#34;color:#75715e&#34;&gt;// 读 0 和读 1 的时间至少要大于 60 us
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_OUT_0();       &lt;span style=&#34;color:#75715e&#34;&gt;// 读时间的起始：必须由主机产生 &amp;gt; 1us &amp;gt; 1;
&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;// 写 0 和写 1 的时间至少要大于60us
&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;if&lt;/span&gt; (testb) &lt;span style=&#34;color:#75715e&#34;&gt;// 当前位写 1
&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;            DS18B20_OUT_0();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            delay_us(&lt;span style=&#34;color:#ae81ff&#34;&gt;5&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;            DS18B20_OUT_1(); &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;            delay_us(&lt;span style=&#34;color:#ae81ff&#34;&gt;65&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:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// 当前位写 0
&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;            DS18B20_OUT_0(); &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;            delay_us(&lt;span style=&#34;color:#ae81ff&#34;&gt;70&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;            DS18B20_OUT_1();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            delay_us(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;        }
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;&lt;span style=&#34;color:#75715e&#34;&gt; * @brief  跳过匹配 DS18B20 ROM
&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; */&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;void&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_SkipRom(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    DS18B20_Reset();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_Presence();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_WriteByte(&lt;span style=&#34;color:#ae81ff&#34;&gt;0XCC&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;/* 跳过 ROM */&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;/**
&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; * @brief  执行匹配 DS18B20 ROM
&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; */&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;void&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_MatchRom(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    DS18B20_Reset();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_Presence();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_WriteByte(&lt;span style=&#34;color:#ae81ff&#34;&gt;0X55&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;/* 匹配 ROM */&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_Class(GPIO_TypeDef &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;BSP_DS18B20_PORT, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; BSP_DS18B20_PIN, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; LOCATION, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;Temp_data)
&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;    DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;BSP_DS18B20_PORT &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BSP_DS18B20_PORT;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;BSP_DS18B20_PIN &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BSP_DS18B20_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;LOCATION &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LOCATION;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;Temp_Sum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Temp_data;
&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;uint8_t&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;Init(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    DS18B20_Mode_OUT_PP();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_OUT_1();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_Reset();
&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; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Presence&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;/**
&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; * 存储的温度是16 位的带符号扩展的二进制补码形式
&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; * 当工作在12位分辨率时，其中5个符号位，7个整数位，4个小数位
&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; *
&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; *         |---------整数----------|-----小数 分辨率 1/(2^4)=0.0625----|
&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; * 低字节  | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) |
&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; *
&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; *
&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; *         |-----符号位：0-&amp;gt;正  1-&amp;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; * 高字节  |  s  |  s  |  s  |  s  |    s   |   2^6  |   2^5  |   2^4  |
&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; *
&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; *
&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; * 温度 = 符号位 + 整数 + 小数*0.0625
&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; */&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;/**
&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; * @brief  在跳过匹配 ROM 情况下获取 DS18B20 温度值
&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; * @param  无
&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; * @retval 温度值
&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; */&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;float&lt;/span&gt; DS18B20_Class&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;DS18B20_GetTemp_SkipRom(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; tpmsb, tplsb;
&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;int16_t&lt;/span&gt; s_tem;
&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;float&lt;/span&gt; f_tem;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_SkipRom();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_WriteByte(&lt;span style=&#34;color:#ae81ff&#34;&gt;0X44&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;    DS18B20_SkipRom();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_WriteByte(&lt;span style=&#34;color:#ae81ff&#34;&gt;0XBE&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;    tplsb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; DS18B20_ReadByte();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tpmsb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; DS18B20_ReadByte();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    s_tem &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tpmsb  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;要注意其中的`&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;`的用法；&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;### Main中调用：
&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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;注意&lt;/span&gt;main文件也是cpp后缀&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;；&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:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;c&lt;span style=&#34;color:#f92672&#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;void&lt;/span&gt; main(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    User_DS18B20_Init();
&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;while&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;        User_Start_Convert();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        HAL_Delay(&lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 更新速率为200ms，等待转换结束
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        User_Get_Data();
&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;int&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;while&lt;/span&gt; (i
&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:#960050;background-color:#1e0010&#34;&gt;使用&lt;/span&gt;C编写
&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:#f92672&#34;&gt;!&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;a011b38ca2d1e989de04f32bb8c0e5](img&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5.&lt;/span&gt;png)
&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:#960050;background-color:#1e0010&#34;&gt;使用&lt;/span&gt;C&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;编写&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:#f92672&#34;&gt;!&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;dbfdf38abe4f0d85cc7f98e4133007](img&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6.&lt;/span&gt;png)
&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:#f92672&#34;&gt;**&lt;/span&gt;C:&lt;span style=&#34;color:#f92672&#34;&gt;**&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;Total RO  Size (Code &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; RO Data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;14016&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;13.69&lt;/span&gt;kB)
&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;Total RW  Size (RW Data &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; ZI Data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2040&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1.99&lt;/span&gt;kB)
&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;Total ROM Size (Code &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; RO Data &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; RW Data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;14464&lt;/span&gt; (  &lt;span style=&#34;color:#ae81ff&#34;&gt;14.13&lt;/span&gt;kB)
&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:#f92672&#34;&gt;**&lt;/span&gt;C&lt;span style=&#34;color:#f92672&#34;&gt;++:**&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;Total RO  Size (Code &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; RO Data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;11780&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;11.50&lt;/span&gt;kB)
&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;Total RW  Size (RW Data &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; ZI Data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2864&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2.80&lt;/span&gt;kB)
&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;Total ROM Size (Code &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; RO Data &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; RW Data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;12220&lt;/span&gt; (  &lt;span style=&#34;color:#ae81ff&#34;&gt;11.93&lt;/span&gt;kB)
&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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;相比较而言&lt;/span&gt;C用的ROM比较多一些&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，&lt;/span&gt;C&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;用的&lt;/span&gt;RAM比较多一些&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;；&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:#f92672&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;可见在某些情况下，使用&lt;/span&gt;C&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;编写代码可以有效缩减代码体积，且代码更易懂；&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;**&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;### microlib
&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:#960050;background-color:#1e0010&#34;&gt;使用&lt;/span&gt;C&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;编译的话，就没法再使用&lt;/span&gt;MicroLIB&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，因为&lt;/span&gt;MicroLIB为非标准的精简库&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，会与标准&lt;/span&gt;C&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;产生冲突；&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;### 中断服务程序
&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:#960050;background-color:#1e0010&#34;&gt;如果中断服务程序是异常的，因为&lt;/span&gt;stm32的中断入口矢量是按C的方式进入的&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，因此需要在整个文档的头部和末尾加上&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;“&lt;/span&gt;C&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;”&lt;/span&gt;{}&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;用大括号把整个代码段扩住，这样中断就可以正常的进入了；&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;### Cubemx
&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;Cubemx在生成头文件中已经加入了&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;：&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:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;c
&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;#ifdef __cplusplus
&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;extern&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C&amp;#34;&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;#endif
&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;#ifdef __cplusplus
&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;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以在不是其生成的文件中要注意&lt;code&gt;extern &amp;quot;C&amp;quot;&lt;/code&gt;的使用；&lt;/p&gt;</description>
    </item>
    <item>
      <title>ROS相关知识</title>
      <link>https://fan-pengfei.top/posts/ros%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/</link>
      <pubDate>Tue, 28 Feb 2023 08:56:52 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/ros%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;做毕设用到了ROS，这里记录ROS相关知识；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;语言基于Python，因为C++短时间学不起来，Python的话还能懂一些；&lt;/p&gt;
&lt;h3 id=&#34;工作空间构建&#34;&gt;工作空间构建&lt;/h3&gt;
&lt;p&gt;创建一个新的文档夹
我们创建一个新的文档夹作为新的工作空间的开始
给每个新的工作空间创建一个新的文档夹是一个好习惯，取上面名字无关紧要，但是最好能从这个名字上看出这个工作空间是干什么的，例如main_ws，(主要工作空间)：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir main_ws
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将功能包放入src也是一个比较好的习惯，我们创建一个工作空间同时创建一个src文档夹，然后进入这个文档夹内：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir main_ws/src
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd main_ws/src
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;与ROS1不同，ROS2的工作空间并不需要init；&lt;/p&gt;
&lt;h3 id=&#34;自定义包&#34;&gt;自定义包&lt;/h3&gt;
&lt;p&gt;如何在ROS2中创建一个功能包呢？我们可以使用这个指令：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ros2 pkg create --build-type
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在ros2命令中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;pkg&lt;/strong&gt;：表示功能包相关的功能；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;create&lt;/strong&gt;：表示创建功能包；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;build-type&lt;/strong&gt;：表示新创建的功能包是C++还是Python的，如果使用C++或者C，那这里就跟ament_cmake，如果使用Python，就跟ament_python；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;package_name&lt;/strong&gt;：新建功能包的名字。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比如在终端中分别创建C++和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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd ~/main_ws/src
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ros2 pkg create --build-type ament_cmake learning_pkg_c               &lt;span style=&#34;color:#75715e&#34;&gt;# C++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ros2 pkg create --build-type ament_python learning_pkg_python &lt;span style=&#34;color:#75715e&#34;&gt;# Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对于Python包：&lt;/p&gt;
&lt;p&gt;只需要进到构建的包文件夹中，进入与上一层文件夹名字相同的包中即可，然后写入源文件；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;c74bd28eec8ebcb6aba8146b743cc0e&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/ros%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后修改package.xml文件：&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-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;from setuptools import setup
&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;package_name = &amp;#39;serial_test&amp;#39;
&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;setup(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name=package_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    version=&amp;#39;0.0.0&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    packages=[package_name],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data_files=[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&amp;#39;share/ament_index/resource_index/packages&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            [&amp;#39;resource/&amp;#39; + package_name]),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&amp;#39;share/&amp;#39; + package_name, [&amp;#39;package.xml&amp;#39;]),
&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;    install_requires=[&amp;#39;setuptools&amp;#39;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    zip_safe=True,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    maintainer=&amp;#39;xioafei&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    maintainer_email=&amp;#39;2253770787@qq.com&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    description=&amp;#39;TODO: Package description&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    license=&amp;#39;TODO: License declaration&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests_require=[&amp;#39;pytest&amp;#39;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    entry_points={
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;#39;console_scripts&amp;#39;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &amp;#39;interface_object_pub  = serial_test.interface_object_pub:main&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        #  &amp;#39;interface_object_sub  = serial_test.interface_object_sub:main&amp;#39;,
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;编译功能包&#34;&gt;编译功能包&lt;/h3&gt;
&lt;p&gt;在创建好的功能包中，我们可以继续完成代码的编写，之后需要编译和配置环境变量，才能正常运行：&lt;/p&gt;</description>
    </item>
    <item>
      <title>在GDB下调试STM32的记录</title>
      <link>https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Mon, 27 Feb 2023 12:04:31 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;基于VSCode使用GDB来调试STM32，我感觉比那个Keil还好用，而且更懂底层原理；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一调试步骤&#34;&gt;一、调试步骤：&lt;/h2&gt;
&lt;h3 id=&#34;准备工作&#34;&gt;准备工作&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;已经熟悉arm gcc工具链；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;已经在win中安装好mingw或者arm-none-eabi-gcc工具；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;具有合适的代码工程和编译脚本，且编译输出elf文档时，已添加&lt;code&gt;-g&lt;/code&gt;选项来生成调试信息；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装jlink调试工具和对应驱动；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;有对应的硬件电路；&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;1启动jlink-gdb-server&#34;&gt;1、启动Jlink GDB Server&lt;/h3&gt;
&lt;p&gt;打开Jlink诸多工具中的Jlink GDB Server并配置好：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;e72631aa1f4bdb02354f118476623df&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;启动：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;42007dbdc5647b8720335665c84428f&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;可以看到本地端口为&lt;strong&gt;2331&lt;/strong&gt;，这个一会会用到；&lt;/p&gt;
&lt;p&gt;然后就可以把这个窗口最小化了；&lt;/p&gt;
&lt;h3 id=&#34;2gdb调试&#34;&gt;2、GDB调试&lt;/h3&gt;
&lt;p&gt;启动GDB程序：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;arm-none-eabi-gdb.exe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;236f0b171cb512aca24824528019feb&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后按enter自动进入调试模式；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;89f35eeb649299594752d95cce23b1c&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;file H743_demo.elf&lt;/code&gt;加载调试文档：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;9a0c8d88bbf7814d61eb0344cfb34dd&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后输入&lt;code&gt;target remote localhost:2331&lt;/code&gt;，连接gdb server，连接成功后，会在Jlink GDB server中显示对应的状态，如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;f79eb5111b0dfb33e8b4f1c1b7aafab&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-6.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;monitor reset&lt;/code&gt;来复位MCU，从而让MCU处于确定的状态：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;4e26bf8c755ae990458b5659fa47de5&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-7.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;load&lt;/code&gt;往MCU中加载调试文档（是加载进flash,而不是ram），也就是常见的烧录过程：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;c6780b35ab50f7e2f5fc5193f69e5ec&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-15.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;break main&lt;/code&gt;设置main断点，让MCU执行到main中停止：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;aa8600b8137d1acda57d85b34589d8c&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-9.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;c&lt;/code&gt;持续运行直至运行到断点处：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;5de1ce9fb6048e1a442a4b876ea36a9&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-10.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;HAL_Init&lt;/strong&gt;();是main函数的第一行代码，停在这里；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;再次输入&lt;code&gt;c&lt;/code&gt;会继续运行；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2ab17a5b734305f89d325e492a6ad32&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-11.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;若要打断持续运行的状态，只需要按下&lt;code&gt;Ctrl+c&lt;/code&gt;即可；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;3需要注意的地方&#34;&gt;3、需要注意的地方&lt;/h3&gt;
&lt;p&gt;每次程序重新编译都要执行一次&lt;code&gt;load&lt;/code&gt;以加载新的elf文档；&lt;/p&gt;
&lt;p&gt;如果不使用命令行，而是使用VSCODE中的调试功能，则也需要在程序更新的时候重新&lt;code&gt;load&lt;/code&gt;一次；&lt;/p&gt;
&lt;h2 id=&#34;二常用命令&#34;&gt;二、常用命令&lt;/h2&gt;
&lt;h3 id=&#34;1p打印&#34;&gt;1、p(打印)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;p+变量名：打印变量值：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;d8c389e160cfaad354a0a486f0a6a72&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-12.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;2s单步运行&#34;&gt;2、s(单步运行)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;s：单步运行；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;d026be12be61623d766adf025ba11e5&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-13.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;并且可以用 &lt;code&gt;breakpoint+行号&lt;/code&gt;进行断点设置；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;3l列出&#34;&gt;3、l(列出)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;列出当前位置前后共5行程序；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;913f3b719d2d60aec6ff628a67ec0bc&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-14.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4watch变量监视&#34;&gt;4、watch(变量监视)&lt;/h3&gt;
&lt;p&gt;Watchpoints 是用来告诉 &lt;strong&gt;GDB&lt;/strong&gt; 停止执行某个程序的标记。Watchpoints 与数据相关联：放置监视点需要指定一个表达式来描述变量、多个变量或内存地址。&lt;/p&gt;</description>
    </item>
    <item>
      <title>基于STM32的CMAKE模板</title>
      <link>https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Estm32%E7%9A%84cmake%E6%A8%A1%E6%9D%BF/</link>
      <pubDate>Mon, 27 Feb 2023 06:23:22 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Estm32%E7%9A%84cmake%E6%A8%A1%E6%9D%BF/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;这是一个基于STM32单片机的模板；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例中的单片机是&lt;strong&gt;STM32H743IIT6&lt;/strong&gt;，调试器使用&lt;strong&gt;JlinkOB&lt;/strong&gt;；&lt;/p&gt;
&lt;p&gt;其中的各个参数可以参考使用&lt;strong&gt;STM32CubeMX&lt;/strong&gt;生成的基于&lt;strong&gt;makefile&lt;/strong&gt;的模板，且后续仍然可以使用&lt;strong&gt;STM32CubeMX&lt;/strong&gt;进行底层代码的构建；&lt;/p&gt;
&lt;p&gt;如果需要进行调试，可以先启动&lt;strong&gt;J-Link GDB Server&lt;/strong&gt;，然后使用VSCode进行调试或者直接使用命令行进行调试；&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-cmake&#34; data-lang=&#34;cmake&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# CMAKE_SYSTEM_NAME: 即你目标机target所在的操作系统名称，比如ARM或者Linux你就需要写&amp;#34;Linux&amp;#34;;
&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;# 如果Windows平台你就写&amp;#34;Windows&amp;#34;,如果你的嵌入式平台没有相关OS你即需要写成&amp;#34;Generic&amp;#34;;
&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;# 只有当CMAKE_SYSTEM_NAME这个变量被设置了，CMake才认为此时正在交叉编译;
&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;# 它会额外设置一个变量CMAKE_CROSSCOMPILING为TRUE;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_SYSTEM_NAME&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;Generic&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;# CMAKE_SYSTEM_NAME和CMAKE_SYSTEM_PROCESSOR是交叉编译的时候必须指定的两个参数;
&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;# 如果在cmake命令行定义了CMAKE_SYSTEM_NAME,就必须也定义CMAKE_SYSTEM_PROCESSOR;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_SYSTEM_PROCESSOR&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;cortex-m7&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;#cmake最低版本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmake_minimum_required(&lt;span style=&#34;color:#e6db74&#34;&gt;VERSION&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;3.1.0&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;#编译工具
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CROSS_COMPILE_PREFIX&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;arm-none-eabi&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;# 顾名思义，即C语言编译器，这里可以将变量设置成完整路径或者文档名;
&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;# 设置成完整路径有一个好处就是CMake会去这个路径下去寻找编译相关的其他工具;
&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;# 比如linker,binutils等，如果你写的文档名带有arm-elf等等前缀;
&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;# CMake会识别到并且去寻找相关的交叉编译器;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_C_COMPILER&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CROSS_COMPILE_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-gcc&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_CXX_COMPILER&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CROSS_COMPILE_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-g++&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_ASM_COMPILER&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CROSS_COMPILE_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-gcc&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_OBJCOPY&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CROSS_COMPILE_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-objcopy&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_OBJDUMP&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CROSS_COMPILE_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-objdump&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_SIZE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CROSS_COMPILE_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-size&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;# CMake中的命令find_program用于查找程序(program)
&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;# 会将查找到的文档路径存在CMakeCache.txt中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;find_program(&lt;span style=&#34;color:#e6db74&#34;&gt;ARM_SIZE_EXECUTABLE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CROSS_COMPILE_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-size&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;find_program(&lt;span style=&#34;color:#e6db74&#34;&gt;ARM_GDB_EXECUTABLE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CROSS_COMPILE_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-gdb&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;find_program(&lt;span style=&#34;color:#e6db74&#34;&gt;ARM_OBJCOPY_EXECUTABLE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CROSS_COMPILE_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-objcopy&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;find_program(&lt;span style=&#34;color:#e6db74&#34;&gt;ARM_OBJDUMP_EXECUTABLE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CROSS_COMPILE_PREFIX&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-objdump&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_TRY_COMPILE_TARGET_TYPE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;STATIC_LIBRARY&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;# search for program/library/include in the build host directories
&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;# 1、CMAKE_FIND_ROOT_PATH_MODE_PROGRAM: 对FIND_PROGRAM()起作用，
&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;# 有三种取值，NEVER,ONLY,BOTH,
&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;#   第一个表示不在你CMAKE_FIND_ROOT_PATH下进行查找，
&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;#   第二个表示只在这个路径下查找，
&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;#   第三个表示先查找这个路径，再查找全局路径，
&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;# 对于这个变量来说，一般都是调用宿主机的程序，所以一般都设置成NEVER
&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;#
&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;# 2、CMAKE_FIND_ROOT_PATH_MODE_LIBRARY: 对FIND_LIBRARY()起作用，
&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;# 表示在链接的时候的库的相关选项，因此这里需要设置成ONLY来保证我们的库是在交叉环境中找的.
&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;#
&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;# 3、CMAKE_FIND_ROOT_PATH_MODE_INCLUDE: 对FIND_PATH()和FIND_FILE()起作用，
&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;# 一般来说也是ONLY,如果你想改变，一般也是在相关的FIND命令中增加option来改变局部设置
&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;# 有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_FIND_ROOT_PATH_MODE_PROGRAM&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;NEVER&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_FIND_ROOT_PATH_MODE_LIBRARY&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;ONLY&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_FIND_ROOT_PATH_MODE_INCLUDE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;ONLY&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_FIND_ROOT_PATH_MODE_PACKAGE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;ONLY&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;#工程名称
&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;# project命令用于指定cmake工程的名称
&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;# 实际上，它还可以指定cmake工程的版本号（VERSION关键字）、
&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;# 简短的描述（DESCRIPTION关键字）、
&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;# 主页URL（HOMEPAGE_URL关键字）、
&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;# 编译工程使用的语言（LANGUAGES关键字）。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;project(&lt;span style=&#34;color:#e6db74&#34;&gt;H743_demo&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;C&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;CXX&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;ASM&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;target&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${PROJECT_NAME}&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;COMPILE_TOOLS&lt;/span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;GCC&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;# Target-specific flags
&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;#型号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;MCU_FAMILY&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;STM32H743xx&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;#布局文档
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;LINKER_SCRIPT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CMAKE_CURRENT_SOURCE_DIR&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/STM32H743IITx_FLASH.ld&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;#内核相关
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CPU&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-mcpu=cortex-m7&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;FPU&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-mfpu=fpv5-d16&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;FLOAT_ABI&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-mfloat-abi=hard&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;#宏定义
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add_definitions(&lt;span style=&#34;color:#e6db74&#34;&gt;-DUSE_HAL_DRIVER&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;-DSTM32H743xx&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;# 构建Release或者Debug版本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;if(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_BUILD_TYPE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;MATCHES&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;Debug&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    set(&lt;span style=&#34;color:#e6db74&#34;&gt;DBG_FLAGS&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-g3 -gdwarf-2 -O0&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;elseif(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_BUILD_TYPE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;MATCHES&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;Release&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    set(&lt;span style=&#34;color:#e6db74&#34;&gt;DBG_FLAGS&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-O3&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;endif()&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;##file语法,前一个参数是固定的 后面一个参数自己定义
&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;##添加文档的时候注意 相对路径和绝对路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;file(&lt;span style=&#34;color:#e6db74&#34;&gt;GLOB_RECURSE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;DRIVE_SRC&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash_ex.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_gpio.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_hsem.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_mdma.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr_ex.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c_ex.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_exti.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c&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:#e6db74&#34;&gt;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c&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:#e6db74&#34;&gt;Core/Src/system_stm32h7xx.c&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:#e6db74&#34;&gt;startup_stm32h743xx.s&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:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;file(&lt;span style=&#34;color:#e6db74&#34;&gt;GLOB_RECURSE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;USER_SRC&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:#e6db74&#34;&gt;Core/Src/main.c&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:#e6db74&#34;&gt;Core/Src/gpio.c&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:#e6db74&#34;&gt;Core/Src/stm32h7xx_it.c&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:#e6db74&#34;&gt;Core/Src/stm32h7xx_hal_msp.c&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:#960050;background-color:#1e0010&#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;# 添加源文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;SOURCE_FILES&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;DRIVE_SRC&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;USER_SRC&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;#添加头文件路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;include_directories(
&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;${&lt;/span&gt;CMAKE_CURRENT_SOURCE_DIR&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/Core/Inc&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;${&lt;/span&gt;CMAKE_CURRENT_SOURCE_DIR&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/Drivers/STM32H7xx_HAL_Driver/Inc&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;${&lt;/span&gt;CMAKE_CURRENT_SOURCE_DIR&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/Drivers/STM32H7xx_HAL_Driver/Inc/Legacy&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;${&lt;/span&gt;CMAKE_CURRENT_SOURCE_DIR&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/Drivers/CMSIS/Device/ST/STM32H7xx/Include&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;${&lt;/span&gt;CMAKE_CURRENT_SOURCE_DIR&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/Drivers/CMSIS/Include&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:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;#芯片特性
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;MCU_FLAGS&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${CPU} -mthumb ${FPU} ${FLOAT_ABI}&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;# compiler: language specific flags CFLAGS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_C_FLAGS&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${MCU_FLAGS} -std=gnu99 -Wall -fdata-sections -ffunction-sections ${DBG_FLAGS} &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;CACHE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;INTERNAL&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C compiler flags&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;#CPP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_CXX_FLAGS&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${MCU_FLAGS} -fno-rtti -fno-exceptions -fno-builtin -Wall -fdata-sections -ffunction-sections ${DBG_FLAGS} &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;CACHE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;INTERNAL&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Cxx compiler flags&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;#ASFLAGS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_ASM_FLAGS&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${MCU_FLAGS} -x assembler-with-cpp ${DBG_FLAGS} &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;CACHE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;INTERNAL&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ASM compiler flags&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;#LDFLAGS -mcpu=cortex-m0plus -mthumb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_EXE_LINKER_FLAGS&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${MCU_FLAGS} --specs=nosys.specs -specs=nano.specs -T${LINKER_SCRIPT} -Wl,-Map=${PROJECT_NAME}.map,--cref -Wl,--gc-sections&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;CACHE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;INTERNAL&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Exe linker flags&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;#要链接的库 对应makefile的 LIBS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;CMAKE_SHARED_LIBRARY_LINK_C_FLAGS&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-lc -lm -lnosys&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;CACHE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;INTERNAL&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Shared linker flags&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;#先定义target 才可以添加define include
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add_executable(&lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;target&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.elf&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;SOURCE_FILES&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;ELF_FILE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;PROJECT_BINARY_DIR&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;target&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.elf&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;HEX_FILE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;PROJECT_BINARY_DIR&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;target&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.hex&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(&lt;span style=&#34;color:#e6db74&#34;&gt;BIN_FILE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;PROJECT_BINARY_DIR&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;target&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.bin&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add_custom_command(&lt;span style=&#34;color:#e6db74&#34;&gt;TARGET&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${target}.elf&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;POST_BUILD&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:#e6db74&#34;&gt;COMMAND&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CMAKE_OBJCOPY&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;-Obinary&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;ELF_FILE&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;BIN_FILE&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;COMMAND&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CMAKE_OBJCOPY&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;-Oihex&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;ELF_FILE&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;HEX_FILE&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;COMMENT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Building ${target}.bin and ${target}.hex&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:#e6db74&#34;&gt;COMMAND&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CMAKE_COMMAND&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;-E&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;copy&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;HEX_FILE&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${CMAKE_CURRENT_BINARY_DIR}/${target}.hex&amp;#34;&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:#e6db74&#34;&gt;COMMAND&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CMAKE_COMMAND&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;-E&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;copy&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;BIN_FILE&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${CMAKE_CURRENT_BINARY_DIR}/${target}.bin&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:#e6db74&#34;&gt;COMMAND&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;CMAKE_SIZE&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;--format=berkeley&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;target&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.elf&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;target&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.hex&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:#e6db74&#34;&gt;COMMENT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Invoking: Cross ARM GNU Print Size&amp;#34;&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:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用方式：&lt;/p&gt;</description>
    </item>
    <item>
      <title>CMAKE学习记录</title>
      <link>https://fan-pengfei.top/posts/cmake%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Sat, 25 Feb 2023 13:27:27 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/cmake%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;CMAKE学习记录；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;新建两个目录：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir ./src
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir ./build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;源文档编写：&lt;code&gt;src/main.cpp&lt;/code&gt;&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-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include
&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;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&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;    std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;cout
&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:#f92672&#34;&gt;!&lt;/span&gt;[b562172f8e925c8150fa45bcbcb7b17](img&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.&lt;/span&gt;png)
&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:#960050;background-color:#1e0010&#34;&gt;然后输入以下命令进行编译和运行：&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:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;bash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;cmake_study.exe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;9e8427360f39e4f01fad94a02d3d160&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/cmake%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/img-2.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32启动代码原理分析</title>
      <link>https://fan-pengfei.top/posts/stm32%E5%90%AF%E5%8A%A8%E4%BB%A3%E7%A0%81%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90/</link>
      <pubDate>Sat, 25 Feb 2023 07:54:51 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/stm32%E5%90%AF%E5%8A%A8%E4%BB%A3%E7%A0%81%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;STM32启动代码原理分析（底层技术）；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;简述&#34;&gt;简述&lt;/h2&gt;
&lt;p&gt;ARM Cortex-M系列MCU的启动代码（使用汇编语言编程则不需要）主要做3件事情：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;初始化并正确放置异常/中断矢量表；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分散加载；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;初始化C语言运行环境（初始化堆栈以及C Library、浮点等）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Cortex-M3内核规定，起始地址必须存放堆顶指针，而第二个地址则必须存放复位中断入口矢量地址，这样在Cortex-M3内核复位后，会自动从起始地址的下一个32位空间取出复位中断入口矢量，跳转执行复位中断服务程序。对比ARM7/ARM9内核，Cortex-M3内核则是固定了中断矢量表的位置而起始地址是可变化的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;源码分析&#34;&gt;源码分析&lt;/h2&gt;
&lt;p&gt;基于&lt;code&gt;STM32F103C6T6&lt;/code&gt;的启动文件&lt;code&gt;startup_stm32f103x6.s&lt;/code&gt;的简要说明如下：&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;******************** (C) COPYRIGHT 2017 STMicroelectronics ********************
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;* File Name          : startup_stm32f103x6.s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;* Author             : MCD Application Team
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;* Description        : STM32F103x6 Devices vector table for MDK-ARM toolchain.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;*                      This module performs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;*                      - Set the initial SP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;*                      - Set the initial PC == Reset_Handler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;*                      - Set the vector table entries with the exceptions ISR address
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;*                      - Configure the clock system
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;*                      - Branches to __main in the C library (which eventually
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;*                        calls main()).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;*                      After Reset the Cortex-M3 processor is in Thread mode,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;*                      priority is Privileged, and the Stack is set to Main.
&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;;* @attention
&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;;* Copyright (c) 2017 STMicroelectronics.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;* All rights reserved.
&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;;* This software component is licensed by ST under BSD 3-Clause license,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;* the &amp;#34;License&amp;#34;; You may not use this file except in compliance with the
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;* License. You may obtain a copy of the License at:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;*                        opensource.org/licenses/BSD-3-Clause
&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&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;; Amount of memory (in bytes) allocated for Stack
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;; Tailor this value to your application needs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;  Stack Configuration
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;    Stack Size (in Bytes)
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Stack_Size		EQU     0x400       ;声明栈的大小为0x400字节
&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;                AREA    STACK, NOINIT, READWRITE, ALIGN=3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Stack_Mem       SPACE   Stack_Size  ;开辟一段大小为Stack_Size的内存空间作为栈
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;__initial_sp                        ;标号__initial_sp，表示栈空间顶地址。
&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;;  Heap Configuration
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;     Heap Size (in Bytes)
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Heap_Size       EQU     0x200     ;声明栈的大小为0x200字节
&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;                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;__heap_base                       ;标号__heap_base，表示堆空间起始地址。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Heap_Mem        SPACE   Heap_Size ;开辟一段大小为Heap_Size的内存空间作为堆。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;__heap_limit                      ;标号__heap_limit，表示堆空间结束地址。
&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&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;;启动代码最重要的工作是把异常中断向量表放到正确的Flash地址上
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;把向量表定义为只读数据段，并导出向量表标号(Symbol)，让链接器识别此标号并根据分散加载文件正确的放置向量表
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;__Vectors标号需要与分散加载文件合起来看，才会明白其真正的功能
&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;                PRESERVE8         ;告诉编译器以8字节对齐。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                THUMB             ;告诉编译器使用THUMB指令集。
&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;; Vector Table Mapped to Address 0 at Reset
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                AREA    RESET, DATA, READONLY   ;声明权限为“READONLY”的名称为“RESET”的数据段
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                       ;（假设STM32从FLASH启动，则此中断矢量表起始地址即为0x8000000）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  __Vectors      ;将标号__Vectors声明为全局标号，这样外部文档就可以使用这个标号。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  __Vectors_End
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  __Vectors_Size
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;标号__Vectors，表示中断矢量表入口地址
&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&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;;__initial_sp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   1、栈顶指针地址，此语法跟MDK编译器的底层相关，是ARMCC编译器才能识别的语法
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;      GCC与IAR的底层编译器ICCARM编译器不能识别;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   2、__initial_sp 是一个链接器Image Symbol;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   3、此处__initial_sp相当于是顶地址，或者此处直接把顶地址写到此处也行(如:0x20004000);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   4、__initial_sp具体是多少，在此种写法下，是由分散加载文件决定的，下文会有详细论述;
&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;;Reset_Handler:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   1、Reset_Handler函数地址，此处相当于把Reset_Handler函数地址赋值给PC，即调用Reset_Handler函数;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   2、此处也可以是其他函数，只是把复位函数放于此处最符合实际应用场景。
&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;;   1、绝大多数cortex-M微控制器(M0、M3、M4都是这样)复位后先进入厂商BOOTROM，此时所有用户行为均无法介入处理器;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   2、厂商BOOTROM(有些厂商会有其他名称来称呼此功能) 主要负责处理一些芯片最初级初始化、
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;      加密以及一些对MCU的差异化设置等工作:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   3、BOOTROM顺利完成后，MCu控制权会交给用户，即启动代码;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   4、启动代码(运行汇编语言则不需要此启动代码)，最重要的工作在于设置MSP (主堆栈指针)以及PC(程序计数器)的值;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   5、Cortex-M微控制器会默认把0x00000000地址里面的值设置为MSP的值，0x00000004地址里面的值设置为PC的值;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   6、5中的默认地址可以通过修改Cortex-M中的VTOR寄存器来重新映射，比如改到0x20000000地址或其他;
&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;;关于Exception(异常) 与Interrupt (中断) 的区别说明
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   1、Exception(异常)与Interrupt(中断)是不同的，是两个不同的概念，很多人会混淆两者,
&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;;   2、Exception(异常)是向量表的前16个向量，其优先级为负数，高于所有中断，而且不可调整优先级也不可关闭,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;      可以打断正常程序与Interrupt(中断) 的运行:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   3、从第16个向量以后才是Interrupt(中断)，可以设置优先级，不用时可以关闭，但优先级永远低于Exception(异常);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   4、从这里大家就可以理解Pendsy Handler与svsTick Handler为什么会被用于嵌入式操作系统，
&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;;      SVC_Handler有时也会用于操作系统，原理相同;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   5、用户应用程序应尽量避免使用Exception(异常);
&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;__Vectors       DCD     __initial_sp               ; Top of Stack  栈顶地址
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     Reset_Handler              ; Reset Handler 复位向量
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     NMI_Handler                ; NMI Handler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     HardFault_Handler          ; Hard Fault Handler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     MemManage_Handler          ; MPU Fault Handler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     BusFault_Handler           ; Bus Fault Handler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     UsageFault_Handler         ; Usage Fault Handler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     0                          ; Reserved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     0                          ; Reserved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     0                          ; Reserved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     0                          ; Reserved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     SVC_Handler                ; SVCall Handler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     DebugMon_Handler           ; Debug Monitor Handler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     0                          ; Reserved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     PendSV_Handler             ; PendSV Handler 操作系统会用到的异常向量
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     SysTick_Handler            ; SysTick Handler 操作系统会用到的心跳定时器异常向量(没有操作系统时可以用作普通定时器中断)
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   1、这里开始是中断向量表;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   2、各个向量的顺序是芯片设计的时候就定义好的，不能更改;
&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;                ; External Interrupts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     WWDG_IRQHandler            ; Window Watchdog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     TAMPER_IRQHandler          ; Tamper
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     RTC_IRQHandler             ; RTC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     FLASH_IRQHandler           ; Flash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     RCC_IRQHandler             ; RCC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     EXTI0_IRQHandler           ; EXTI Line 0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     EXTI1_IRQHandler           ; EXTI Line 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     EXTI2_IRQHandler           ; EXTI Line 2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     EXTI3_IRQHandler           ; EXTI Line 3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     EXTI4_IRQHandler           ; EXTI Line 4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     ADC1_2_IRQHandler          ; ADC1_2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     TIM1_UP_IRQHandler         ; TIM1 Update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     TIM2_IRQHandler            ; TIM2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     TIM3_IRQHandler            ; TIM3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     0                          ; Reserved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     I2C1_EV_IRQHandler         ; I2C1 Event
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     I2C1_ER_IRQHandler         ; I2C1 Error
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     0                          ; Reserved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     0                          ; Reserved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     SPI1_IRQHandler            ; SPI1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     0                          ; Reserved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     USART1_IRQHandler          ; USART1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     USART2_IRQHandler          ; USART2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     0                          ; Reserved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     RTC_Alarm_IRQHandler        ; RTC Alarm through EXTI Line
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;__Vectors_End
&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;__Vectors_Size  EQU  __Vectors_End - __Vectors
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;这部分开始可以称作Reset Handler实体，芯片上电后，经过BOOTROM后进入的用户可控最开始处的地方;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   1、如果想让Mcu正常使用c语言，务必在此处调用 main函数;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   2、__main() 不是main() 两者有着本质性的区别;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   3、__main()是c Library中的函数，Kei1开发环境中自带的c Library中的函数;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   4、main()是被 __main()调用的，__main()工作完成后最后一步就是调用main();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   5、__main()被调用之前，可以根据需要插入一个或多个其他功能函数;
&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;                AREA    |.text|, CODE, READONLY             ;定义只读的代码段
&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;; Reset handler routine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;复位中断服务程序，PROC…ENDP结构表示程序的开始和结束。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Reset_Handler    PROC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 EXPORT  Reset_Handler             [WEAK]   ;声明复位中断矢量Reset_Handler为全局属性
&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;     IMPORT  __main                                         ;声明__main标号。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     IMPORT  SystemInit                                     ;声明SystemInit标号。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 LDR     R0, =SystemInit                    ;跳转SystemInit地址执行
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 BLX     R0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 LDR     R0, =__main                        ;跳转__main地址执行
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 BX      R0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 ENDP
&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;; Dummy Exception Handlers (infinite loops which can be modified)
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   1、[weak]指定了一个这个函数为&amp;#34;弱函数”;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   2、这些中断服务函教定义成弱函数的意义是，当中断出现时，需要有一个中断服务函数予以响应，但真实的
&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;;      默认实现，很简单，默认实现就是死循环汇编中的&amp;#34;B.&amp;#34;语句,相当于while(1);因为不知道用户是否会
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;      用到多少中断，但这些服务函数又很重要，所以就把这些函数都&amp;#34;实现&amp;#34;并声明为弱函数;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   3、弱函数的意思是如果用户定义了同样名称的另一个函数，那么默认实现的弱函数就会被覆盖，比如
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;      HardFault_Handler异常在下面有一个默认的实现，但这种默认的实现不能满足我的需要的时候，我可以
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;      再重新定义一个HardEault Handler函数这个新定义的HardFault_Handler函数会覆盖原有的被声明
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;      为[WEAK]的弱函数;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   4、有很多种适合使用弱函数的场合，默认的异常/中断服务函数只是一种应用场景;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;   5、在C语言中声明弱函数是在函数后加“__attribute((weak))”;
&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;NMI_Handler     PROC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  NMI_Handler                [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                B       .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ENDP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HardFault_Handler\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                PROC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  HardFault_Handler          [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                B       .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ENDP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MemManage_Handler\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                PROC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  MemManage_Handler          [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                B       .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ENDP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BusFault_Handler\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                PROC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  BusFault_Handler           [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                B       .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ENDP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UsageFault_Handler\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                PROC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  UsageFault_Handler         [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                B       .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ENDP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SVC_Handler     PROC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  SVC_Handler                [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                B       .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ENDP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DebugMon_Handler\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                PROC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  DebugMon_Handler           [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                B       .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ENDP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PendSV_Handler  PROC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  PendSV_Handler             [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                B       .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ENDP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SysTick_Handler PROC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  SysTick_Handler            [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                B       .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ENDP
&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;Default_Handler PROC
&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;                EXPORT  WWDG_IRQHandler            [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  PVD_IRQHandler             [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  TAMPER_IRQHandler          [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  RTC_IRQHandler             [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  FLASH_IRQHandler           [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  RCC_IRQHandler             [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  EXTI0_IRQHandler           [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  EXTI1_IRQHandler           [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  EXTI2_IRQHandler           [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  EXTI3_IRQHandler           [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  EXTI4_IRQHandler           [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  DMA1_Channel1_IRQHandler   [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  DMA1_Channel2_IRQHandler   [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  DMA1_Channel3_IRQHandler   [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  DMA1_Channel4_IRQHandler   [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  DMA1_Channel5_IRQHandler   [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  DMA1_Channel6_IRQHandler   [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  DMA1_Channel7_IRQHandler   [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  ADC1_2_IRQHandler          [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  CAN1_RX1_IRQHandler        [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  CAN1_SCE_IRQHandler        [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  EXTI9_5_IRQHandler         [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  TIM1_BRK_IRQHandler        [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  TIM1_UP_IRQHandler         [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  TIM1_CC_IRQHandler         [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  TIM2_IRQHandler            [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  TIM3_IRQHandler            [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  I2C1_EV_IRQHandler         [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  I2C1_ER_IRQHandler         [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  SPI1_IRQHandler            [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  USART1_IRQHandler          [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  USART2_IRQHandler          [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  EXTI15_10_IRQHandler       [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  RTC_Alarm_IRQHandler        [WEAK]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                EXPORT  USBWakeUp_IRQHandler       [WEAK]
&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&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WWDG_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PVD_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TAMPER_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RTC_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FLASH_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RCC_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EXTI0_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EXTI1_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EXTI2_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EXTI3_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EXTI4_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DMA1_Channel1_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DMA1_Channel2_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DMA1_Channel3_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DMA1_Channel4_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DMA1_Channel5_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DMA1_Channel6_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DMA1_Channel7_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ADC1_2_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;USB_HP_CAN1_TX_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;USB_LP_CAN1_RX0_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CAN1_RX1_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CAN1_SCE_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EXTI9_5_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TIM1_BRK_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TIM1_UP_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TIM1_TRG_COM_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TIM1_CC_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TIM2_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TIM3_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;I2C1_EV_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;I2C1_ER_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SPI1_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;USART1_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;USART2_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EXTI15_10_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RTC_Alarm_IRQHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;USBWakeUp_IRQHandler
&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;                B       .
&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;                ENDP
&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;                ALIGN
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;; User Stack and Heap initialization
&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;;IF…ELSE…ENDIF结构，判断是否使用DEF:__MICROLIB（此处为不使用）。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;若使用DEF:__MICROLIB，则将__initial_sp，__heap_base，__heap_limit
&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;                 IF      :DEF:__MICROLIB
&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;                 EXPORT  __initial_sp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 EXPORT  __heap_base
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 EXPORT  __heap_limit
&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;                 ELSE
&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;                 IMPORT  __use_two_region_memory    ;定义全局标号__use_two_region_memory。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 EXPORT  __user_initial_stackheap   ;声明全局标号__user_initial_stackheap，
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;__user_initial_stackheap                    ;标号__user_initial_stackheap，表示用户堆栈初始化程序入口
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 ;分别保存栈顶指针和栈大小，堆始地址和堆大小至R0，R1，R2，R3寄存器。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 LDR     R0, =  Heap_Mem
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 LDR     R1, =(Stack_Mem + Stack_Size)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 LDR     R2, = (Heap_Mem +  Heap_Size)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 LDR     R3, = Stack_Mem
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 BX      LR
&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;                 ALIGN
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 ENDIF
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 END;程序完毕
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;部分解释&#34;&gt;部分解释&lt;/h2&gt;
&lt;p&gt;以上便是STM32的启动代码的完整解析，接下来对几个小地方做解释：&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32的启动过程</title>
      <link>https://fan-pengfei.top/posts/stm32%E7%9A%84%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/</link>
      <pubDate>Sat, 25 Feb 2023 07:48:13 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/stm32%E7%9A%84%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;STM32单片机是如何从上电运行到main()函数的；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;用三张图片基本就能理解了：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：
&lt;a href=&#34;https://blog.csdn.net/weixin_39118482/article/details/79508747?spm=1001.2014.3001.5502&#34;&gt;https://blog.csdn.net/weixin_39118482/article/details/79508747?spm=1001.2014.3001.5502&lt;/a&gt;
&lt;a href=&#34;https://www.modb.pro/db/548699&#34;&gt;https://www.modb.pro/db/548699&lt;/a&gt;
&lt;a href=&#34;https://www.cnblogs.com/yucloud/p/stm32_SystemInit_to_main.html&#34;&gt;https://www.cnblogs.com/yucloud/p/stm32_SystemInit_to_main.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;1函数的调用过程&#34;&gt;1、函数的调用过程：&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/stm32%E7%9A%84%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/img-1.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;2启动流程1使用标准库不使用microlib&#34;&gt;2、启动流程1（使用标准库，不使用Microlib）&lt;/h2&gt;
&lt;p&gt;如下图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/stm32%E7%9A%84%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/img-2.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;3启动流程2使用microlib&#34;&gt;3、启动流程2（使用Microlib）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;microlib 是缺省 C 库的备选库。它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。这些应用程序不在操作系统中运行。 microlib 进行了高度优化以使代码变得很小。它的功能比缺省 C 库少，并且根本不具备某些 ISOC 特性。某些库函数的运行速度也比较慢，例如， memcpy() 。
microlib与缺省C库之间的主要差异是：
microlib不符合ISO C库标准。不支持某些ISO特性，并且其他特性具有的功能也较少；
microlib不符合IEEE 754二进制浮点算法标准；
microlib进行了高度优化以使代码变得很小；
无法对区域设置进行配置。缺省C区域设置是唯一可用的区域设置；
不能将main()声明为使用参数，并且不能返回内容；
不支持stdio，但未缓冲的stdin、stdout和stderr除外；
microlib对C99函数提供有限的支持；
microlib不支持操作系统函数；
microlib不支持与位置无关的代码；
microlib不提供互斥锁来防止非线程安全的代码；
microlib不支持宽字符或多字节字符串；
与stdlib不同，microlib不支持可选择的单或双区内存模型。microlib只提供双区内存模型，即单独的堆栈和堆区。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;启动流程如下图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/stm32%E7%9A%84%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/img-3.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;4其他&#34;&gt;4、其他&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;关于stm32的启动文件：
&lt;a href=&#34;https://www.fan-pengfei.top/2023/02/25/STM32%E5%90%AF%E5%8A%A8%E4%BB%A3%E7%A0%81%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90/#more&#34;&gt;https://www.fan-pengfei.top/2023/02/25/STM32%E5%90%AF%E5%8A%A8%E4%BB%A3%E7%A0%81%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90/#more&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>分散加载文档</title>
      <link>https://fan-pengfei.top/posts/%E5%88%86%E6%95%A3%E5%8A%A0%E8%BD%BD%E6%96%87%E6%A1%A3/</link>
      <pubDate>Sat, 25 Feb 2023 04:38:38 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%88%86%E6%95%A3%E5%8A%A0%E8%BD%BD%E6%96%87%E6%A1%A3/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;分散加载（scatter）文档是一个文本文档，它可以用来描述ARM连接器生成映像文档时所需要的信息；
参考：&lt;a href=&#34;https://blog.csdn.net/KXue0703/article/details/114018759&#34;&gt;https://blog.csdn.net/KXue0703/article/details/114018759&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一基础知识&#34;&gt;一、基础知识&lt;/h2&gt;
&lt;p&gt;为了充分理解分散加载文档的魅力，需要对工程编译后的内容有详细的了解。
Keil 编译后的内容如下所示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Code：为程序代码部分；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RO-Data：表示程序定义的常量及 const 型数据；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RW-Data：表示已经初始化的静态变量，变量有初值；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ZI-Data：表示未初始化的静态变量，变量无初值；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当 Keil 工程编译完成后，查看其 map 文档，可得到结果如下程序清单：&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Code (inc. data)   RO Data    RW Data    ZI Data      Debug
&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;4194        230        714         16       1640      72715   Grand Totals
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4194        230        714         16       1640      72715   ELF Image Totals
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4194        230        714         16          0          0   ROM Totals
&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;Total RO  Size (Code + RO Data)                 4908 (4.79kB)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Total RW  Size (RW Data + ZI Data)              1656 (1.62kB)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Total ROM Size (Code + RO Data + RW Data)       4924 (4.81kB)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;由map文档可以看出：
ROM Size = Code＋RO-Data＋RW-Data = 4.81kB；
RAM Size = RW-Data＋ZI-Data = 1.62kB；&lt;/p&gt;</description>
    </item>
    <item>
      <title>git中的rebase用法小结</title>
      <link>https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/</link>
      <pubDate>Wed, 22 Feb 2023 07:28:48 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;今天用到了git rebase命令来进行合并两次提交，顺带梳理下rebase命令的用法；
参考：&lt;a href=&#34;https://www.jianshu.com/p/4a8f4af4e803&#34;&gt;https://www.jianshu.com/p/4a8f4af4e803&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;rebase在git中是一个非常有魅力的命令，使用得当会极大提高自己的工作效率；相反，如果乱用，会给团队中其他人带来麻烦。它的作用简要概括为：可以对某一段线性提交历史进行编辑、删除、复制、粘贴；因此，合理使用rebase命令可以使我们的提交历史干净、简洁！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前提：不要通过rebase对任何已经提交到公共仓库中的commit进行修改（你自己一个人玩的分支除外）；&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;一合并多个commit为一个完整commit&#34;&gt;一、合并多个commit为一个完整commit&lt;/h3&gt;
&lt;p&gt;当我们在本地仓库中提交了多次，在我们把本地提交push到公共仓库中之前，为了让提交记录更简洁明了，我们希望把如下分支B、C、D三个提交记录合并为一个完整的提交，然后再push到公共仓库。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;0ba5c5a59eac26db62f1de57ccd6040&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;现在我们在测试分支上添加了四次提交，我们的目标是把最后三个提交合并为一个提交：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;70c9817cfaf9fe0b38bf3bbb97197bd&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;这里我们使用命令:&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rebase -i  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;startpoint&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;endpoint&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中&lt;code&gt;-i&lt;/code&gt;的意思是&lt;code&gt;--interactive&lt;/code&gt;，即弹出交互式的界面让用户编辑完成合并操作，&lt;code&gt;[startpoint]&lt;/code&gt;  &lt;code&gt;[endpoint]&lt;/code&gt;则指定了一个编辑区间，如果不指定&lt;code&gt;[endpoint]&lt;/code&gt;，则该区间的终点默认是当前分支&lt;code&gt;HEAD&lt;/code&gt;所指向的&lt;code&gt;commit&lt;/code&gt;(注：该区间指定的是一个前开后闭的区间)。
在查看到了log日志后，我们运行以下命令：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rebase -i 36224db
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或:&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rebase -i HEAD~3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后我们会看到如下界面:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;326677b29707761988e3d89c2a5ef58&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;上面未被注释的部分列出的是我们本次rebase操作包含的所有提交，下面注释部分是git为我们提供的命令说明。每一个commit id 前面的&lt;code&gt;pick&lt;/code&gt;表示指令类型，git 为我们提供了以下几个命令:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;pick：保留该commit（缩写:p）
reword：保留该commit，但我需要修改该commit的注释（缩写:r）
edit：保留该commit, 但我要停下来修改该提交(不仅仅修改注释)（缩写:e）
squash：将该commit和前一个commit合并（缩写:s）
fixup：将该commit和前一个commit合并，但我不要保留该提交的注释信息（缩写:f）
exec：执行shell命令（缩写:x）
drop：我要丢弃该commit（缩写:d）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;根据我们的需求，我们将commit内容编辑如下:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;5939a788fc6c0730435233001dc4cf4&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/img-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后是注释修改界面:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;d1cc8502accee35249a4a248663085c&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/img-5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;编辑完保存即可完成commit的合并了：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;3a0723ad06ce0cff218b931b1a0b422&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/img-6.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;二将某一段commit粘贴到另一个分支上&#34;&gt;二、将某一段commit粘贴到另一个分支上&lt;/h3&gt;
&lt;p&gt;当我们项目中存在多个分支，有时候我们需要将某一个分支中的一段提交同时应用到其他分支中，就像下图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;d4b3c401612bba5cd4cac2efb15450c&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/img-7.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;我们希望将develop分支中的C~E部分复制到master分支中，这时我们就可以通过rebase命令来实现（如果只是复制某一两个提交到其他分支，建议使用更简单的命令:&lt;code&gt;git cherry-pick&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;在实际模拟中，我们创建了master和develop两个分支:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;master分支:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;55dda3c4a0bf2cd83d03b5714ec9107&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/img-8.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;develop分支:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;c2a745be2db81114facc5c699da5170&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/git%E4%B8%AD%E7%9A%84rebase%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/img-9.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;我们使用命令的形式为:&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rebase &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;startpoint&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;endpoint&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; --onto &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;branchName&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中，&lt;code&gt;[startpoint]&lt;/code&gt;  &lt;code&gt;[endpoint]&lt;/code&gt;仍然和上一个命令一样指定了一个编辑区间(前开后闭)，&lt;code&gt;--onto&lt;/code&gt;的意思是要将该指定的提交复制到哪个分支上。&lt;/p&gt;
&lt;p&gt;所以，在找到C(90bc0045b)和E(5de0da9f2)的提交id后，我们运行以下命令：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git  rebase 90bc0045b^ 5de0da9f2 --onto master
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注:因为&lt;code&gt;[startpoint]&lt;/code&gt;  &lt;code&gt;[endpoint]&lt;/code&gt;指定的是一个前开后闭的区间，为了让这个区间包含C提交，我们将区间起始点向后退了一步。&lt;/p&gt;</description>
    </item>
    <item>
      <title>单总线挂载多个DS18B20并读取温度</title>
      <link>https://fan-pengfei.top/posts/%E5%8D%95%E6%80%BB%E7%BA%BF%E6%8C%82%E8%BD%BD%E5%A4%9A%E4%B8%AAds18b20%E5%B9%B6%E8%AF%BB%E5%8F%96%E6%B8%A9%E5%BA%A6/</link>
      <pubDate>Wed, 22 Feb 2023 03:15:35 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%8D%95%E6%80%BB%E7%BA%BF%E6%8C%82%E8%BD%BD%E5%A4%9A%E4%B8%AAds18b20%E5%B9%B6%E8%AF%BB%E5%8F%96%E6%B8%A9%E5%BA%A6/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;当需要同时读取多个点的温度数据时，DS18B20就是一个很好的选择，不仅精度高，而且还可以单总线挂载多个传感器以节省IO口的使用；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;初始化函数&#34;&gt;初始化函数&lt;/h2&gt;
&lt;p&gt;DS18B20的通信协议为单总线通信协议；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%8D%95%E6%80%BB%E7%BA%BF%E6%8C%82%E8%BD%BD%E5%A4%9A%E4%B8%AAds18b20%E5%B9%B6%E8%AF%BB%E5%8F%96%E6%B8%A9%E5%BA%A6/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;首先由主机发送一个复位脉冲约480-960us；然后总线被拉高；在15-60us之后传感器向单片机发送一个约60-240us的存在脉冲，然后总线被拉高。&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;&lt;span style=&#34;color:#75715e&#34;&gt; * @brief 主机给从机发送复位脉冲
&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; */&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Reset&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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:#a6e22e&#34;&gt;DS18B20_Mode_OUT_PP&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;    DS18B20_OUT_0; &lt;span style=&#34;color:#75715e&#34;&gt;// 主机至少产生 480us 的低电平复位信号
&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:#a6e22e&#34;&gt;delay_us&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;750&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_OUT_1; &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;    &lt;span style=&#34;color:#75715e&#34;&gt;// 从机接收到主机的复位信号后，会在 15 ~ 60 us 后给主机发一个存在脉冲
&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:#a6e22e&#34;&gt;delay_us&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;15&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;&lt;span style=&#34;color:#75715e&#34;&gt; * @brief  检测从机给主机返回的存在脉冲
&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; * @return 0：成功		1：失败
&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; */&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Presence&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; pulse_time &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#a6e22e&#34;&gt;DS18B20_Mode_IN_NP&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;    &lt;span style=&#34;color:#75715e&#34;&gt;// 等待存在脉冲的到来，存在脉冲为一个 60 ~ 240 us 的低电平信号
&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;// 如果存在脉冲没有来则做超时处理，从机接收到主机的复位信号后，会在 15 ~ 60 us 后给主机发一个存在脉冲
&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;while&lt;/span&gt; (DS18B20_IN &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; (pulse_time &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#66d9ef&#34;&gt;else&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;        pulse_time &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;// 响应脉冲（低电平）到来，且存在的时间不能超过 240 us
&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;while&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;(DS18B20_IN) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pulse_time &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;240&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:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#66d9ef&#34;&gt;else&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:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;&lt;span style=&#34;color:#75715e&#34;&gt; * @brief  DS18B20 初始化函数
&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; * @reurn  0：成功		1：失败
&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; */&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;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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:#a6e22e&#34;&gt;DS18B20_Mode_OUT_PP&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DS18B20_OUT_1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Reset&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;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DS18B20_Presence&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;配置写函数&#34;&gt;配置写函数&lt;/h2&gt;
&lt;p&gt;当主机将数据线从高逻辑级别拉到低逻辑级别时，将启动写入时隙。有两种类型的写时槽：写1时槽和写0时槽。所有写入时隙的持续时间必须至少为60µs，且每个写入周期之间的恢复时间至少为1µs以上。在DQ线下降后，DS18B20在15µs到60µs的窗口中对DQ线进行采样。&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何用7个IO口驱动42个LED</title>
      <link>https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E7%94%A87%E4%B8%AAio%E5%8F%A3%E9%A9%B1%E5%8A%A842%E4%B8%AAled/</link>
      <pubDate>Tue, 21 Feb 2023 10:52:40 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E7%94%A87%E4%B8%AAio%E5%8F%A3%E9%A9%B1%E5%8A%A842%E4%B8%AAled/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;尽量用较少的IO口来驱动较多的LED灯；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当IO口数量较少，而又需要驱动较多的LED灯时，就需要想办法通过修改硬件或者软件的方案来进行；&lt;/p&gt;
&lt;p&gt;硬件方案的话，就是用串转并芯片例如74HC595或者其他的数码管驱动芯片来控制，当然会增加硬件成本，如果只是用在个人项目中，小小的成本增加并没有什么，但是如果是用在量产项目中，小小的成本增加就会吃掉一大部分盈利；&lt;/p&gt;
&lt;p&gt;所以尽量还是使用软件方案，并不需要什么74HC595芯片；&lt;/p&gt;
&lt;p&gt;下面介绍的这种方法叫做查理复用：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;查理复用（Charlieplex）是一种在驱动大量LED时有效地节约IO口的方法，理论上可以用N个IO驱动&lt;code&gt;N*(N-1)&lt;/code&gt;个LED，也有接入二极管用来做按键检测的，理论上可实现用N个IO驱动&lt;code&gt;N*(N-1)&lt;/code&gt;个按键；  因而7个脚用满理论上可管理是42个LED，极大节省了IO口的使用；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;但是对单片机的IO口有一个要求，也就是这种LED是由单片机I/O口直接驱动，I/O口要在工作在3态（高、低电平和高阻）；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用六个IO口驱动30个LED的原理图如下（第六行并未完整画出）：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E7%94%A87%E4%B8%AAio%E5%8F%A3%E9%A9%B1%E5%8A%A842%E4%B8%AAled/img-1.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;可以在程序里面每次间隔1ms，扫描一行，总共扫描6行后（6ms），一帧完整就画面结束了，也是利用人眼的视觉暂留画面；
一定要记得，&lt;strong&gt;每行扫描的时候，需要亮灯的高低电平点亮，不亮灯的IO口一定要设为悬浮（高阻模式）。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>如何用一个IO口检测两个按键的状态</title>
      <link>https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E7%94%A8%E4%B8%80%E4%B8%AAio%E5%8F%A3%E6%A3%80%E6%B5%8B%E4%B8%A4%E4%B8%AA%E6%8C%89%E9%94%AE%E7%9A%84%E7%8A%B6%E6%80%81/</link>
      <pubDate>Tue, 21 Feb 2023 10:52:12 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E7%94%A8%E4%B8%80%E4%B8%AAio%E5%8F%A3%E6%A3%80%E6%B5%8B%E4%B8%A4%E4%B8%AA%E6%8C%89%E9%94%AE%E7%9A%84%E7%8A%B6%E6%80%81/</guid>
      <description>&lt;blockquote&gt;
&lt;h2 id=&#34;用单个io口来检测两个按键的状态&#34;&gt;用单个IO口来检测两个按键的状态；&lt;/h2&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一adc方案&#34;&gt;一、ADC方案&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E7%94%A8%E4%B8%80%E4%B8%AAio%E5%8F%A3%E6%A3%80%E6%B5%8B%E4%B8%A4%E4%B8%AA%E6%8C%89%E9%94%AE%E7%9A%84%E7%8A%B6%E6%80%81/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;上面是原理图，这个方案很好理解，主要就是利用电阻分压原理来判断多个按键被按下的状态，如果ADC的位数足够多，可以判断的按键数也会很多；&lt;/p&gt;
&lt;p&gt;因为原理很简单，在这里就不再多说；&lt;/p&gt;
&lt;h2 id=&#34;二非adc方案&#34;&gt;二、非ADC方案&lt;/h2&gt;
&lt;p&gt;这个方案适用于无ADC引脚或者ADC引脚被其他外设占用的情况，只以单IO口检测两个按键的状态的方案为例；&lt;/p&gt;
&lt;h3 id=&#34;原理图如下所示&#34;&gt;原理图如下所示：&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&#34;图二&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E7%94%A8%E4%B8%80%E4%B8%AAio%E5%8F%A3%E6%A3%80%E6%B5%8B%E4%B8%A4%E4%B8%AA%E6%8C%89%E9%94%AE%E7%9A%84%E7%8A%B6%E6%80%81/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;EN是单片机内部的上拉使能开关，S1和S2是待检测的按键；&lt;/p&gt;
&lt;p&gt;通过查阅STM32F103C8T6数据手册可以得知：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;751d413dec771489a3d5835a2d0855e&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E7%94%A8%E4%B8%80%E4%B8%AAio%E5%8F%A3%E6%A3%80%E6%B5%8B%E4%B8%A4%E4%B8%AA%E6%8C%89%E9%94%AE%E7%9A%84%E7%8A%B6%E6%80%81/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;内部的上拉电阻阻值等效为40K欧姆电阻，高低电平的范围也在数据手册中有给出：&lt;/p&gt;
&lt;p&gt;当MCU供电为3.3V时候：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IO口低电平电压范围：-0.5-0.8V；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IO口高电平电压范围： 2.0-3.8V；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此得到最开始的检测电路；但有两个注意事项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;这里特别要注意在使用该电路时，电路参数须满足MCU的IO口高低电平的电气特性要求；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;电路如果需要具备两个按键同时按的功能要求，需自行调整电路，该电路参数不满足该要求；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;电路分析如下&#34;&gt;电路分析如下：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;当EN 闭合时：
S1 按下时， V_IO 接近0V，此时IO口为低电平。
S2 按下时， V_IO = 3.3V * R103 / (R+R103)
V_IO = 3.3V * 510K/ (510K+（40K//2M）) = 3.06V
此时IO口为高电平。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当EN 断开时：
S1 按下时， V_IO 接近0V，此时IO口为低电平。
S2 按下时， V_IO = 3.3V * R103 / (R+R103)
V_IO = 3.3V * 510K/ (510K+ 2M) = 0.67V
此时IO口为低电平。&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何写好CommitMessage</title>
      <link>https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E5%86%99%E5%A5%BDcommitmessage/</link>
      <pubDate>Sat, 18 Feb 2023 14:06:23 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E5%86%99%E5%A5%BDcommitmessage/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;翻译的一篇文章；
&lt;strong&gt;Commit messages matter. Here’s how to write them well.&lt;/strong&gt;
提交的备注信息很重要，这里将教给你如何写好它们.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;How to Write a Git Commit Message&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E5%86%99%E5%A5%BDcommitmessage/img-1.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;简介为什么好的提交信息很重要&#34;&gt;简介：为什么好的提交信息很重要&lt;/h2&gt;
&lt;p&gt;如果你随机浏览任何一个 Git 存储库的日志，你可能会发现它的提交消息或多或少是一团糟。&lt;/p&gt;
&lt;p&gt;例如，下面是我早期致力于 Spring 时的提交信息：&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git log --oneline -5 --author cbeams --before &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Fri Mar 26 2009&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;e5f4b49 Re-adding ConfigurationPostProcessorTests after its brief removal in r814. @Ignore-ing the testCglibClassesAreLoadedJustInTimeForEnhancement&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; method as it turns out this was one of the culprits in the recent build breakage. The classloader hacking causes subtle downstream effects, breaking unrelated tests. The test method is still useful, but should only be run on a manual basis to ensure CGLIB is not prematurely classloaded, and should not be run as part of the automated build.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2db0f12 fixed two build-breaking issues: + reverted ClassMetadataReadingVisitor to revision &lt;span style=&#34;color:#ae81ff&#34;&gt;794&lt;/span&gt; + eliminated ConfigurationPostProcessorTests &lt;span style=&#34;color:#66d9ef&#34;&gt;until&lt;/span&gt; further investigation determines why it causes downstream tests to fail &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;such as the seemingly unrelated ClassPathXmlApplicationContextTests&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;147709f Tweaks to package-info.java files
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;22b25e0 Consolidated Util and MutableAnnotationUtils classes into existing AsmUtils
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;7f96f57 polishing
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;啊哈，然后将其与来自同一存储库的这些最近的提交进行比较：&lt;/p&gt;</description>
    </item>
    <item>
      <title>与或非等逻辑运算在程序中的应用</title>
      <link>https://fan-pengfei.top/posts/%E4%B8%8E%E6%88%96%E9%9D%9E%E7%AD%89%E9%80%BB%E8%BE%91%E8%BF%90%E7%AE%97%E5%9C%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8/</link>
      <pubDate>Tue, 14 Feb 2023 11:56:02 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E4%B8%8E%E6%88%96%E9%9D%9E%E7%AD%89%E9%80%BB%E8%BE%91%E8%BF%90%E7%AE%97%E5%9C%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;今天写代码的时候再次用到了与或非等逻辑运算符来完成一些二进制处理应用，总结记录一下；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一缘起&#34;&gt;一、缘起&lt;/h2&gt;
&lt;p&gt;以下是一个显示板的原理图，由于LED数量较多，因此在LED控制方案的选择上是选用了一块串转并的芯片74HC595；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E4%B8%8E%E6%88%96%E9%9D%9E%E7%AD%89%E9%80%BB%E8%BE%91%E8%BF%90%E7%AE%97%E5%9C%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8/img-1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;对于74HC595的使用在这里就不再赘述；&lt;/p&gt;
&lt;p&gt;74HC595串转并是转出8个输出端，再加上三个直接连接单片机引脚的COM端，理论上是可以很容易控制24个LED灯亮灭，就像是控制三个数码管一样，利用人眼的暂留现象，就可以使这24个LED灯的亮灭随意组合；&lt;/p&gt;
&lt;p&gt;每一个COM端和8个LED组成一个组合，然后轮询点亮这三组LED，速度够快的话，就能看到三组LED被同时点亮；&lt;/p&gt;
&lt;h2 id=&#34;二解决&#34;&gt;二、解决&lt;/h2&gt;
&lt;p&gt;为了消除残影问题，在每一组的LED点亮后，应该马上写入使LED全部熄灭的命令，以消除可能会出现的残影问题；&lt;/p&gt;
&lt;p&gt;首先定义三个&lt;code&gt;uint8_t&lt;/code&gt;变量，例如代码中的&lt;code&gt;LED_NUM1&lt;/code&gt;、&lt;code&gt;LED_NUM2&lt;/code&gt;、&lt;code&gt;LED_NUM3&lt;/code&gt;，然后通过控制COM端，分别向每组LED中写入这三个数据：&lt;/p&gt;
&lt;p&gt;第一组
COM引脚排布：100
待写入74HC595中的数据：LED_NUM1&lt;/p&gt;
&lt;p&gt;第二组
COM引脚排布：010
待写入74HC595中的数据：LED_NUM2&lt;/p&gt;
&lt;p&gt;第三组
COM引脚排布：001
待写入74HC595中的数据：LED_NUM3&lt;/p&gt;
&lt;p&gt;然后对于每一个单独LED的控制，就需要用到逻辑运算，例如图中的LED1，其属于第三组LED，因为其控制COM引脚为COM3，&lt;/p&gt;
&lt;p&gt;因而代码可以写为：&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//只点亮LED1，而不影响本组内其他LED的显示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&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;//只熄灭LED1，而不影响本组内其他LED的显示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其他的LED控制也是一样的道理；&lt;/p&gt;
&lt;p&gt;可以提取出公式，如LED的编号为0&lt;del&gt;7，分别接在74HC595的Q0&lt;/del&gt;Q1引脚上，设任意一引脚为n号引脚，则其控制代码为：&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//只点亮LEDn，而不影响本组内其他LED的显示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LED_NUM &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt; PF0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;STCP &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; PA12
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DS  &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; PB5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;COM1&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;PA15
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;COM2&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;PB3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;COM3&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;PB4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;/**
&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; * @brief 模拟SPI向74HC595芯片发送数据
&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; * @param SendVal 待发送八位数据
&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; * @return 无
&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; */&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;HC595SendData&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; SendVal)
&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;uint8_t&lt;/span&gt; i;
&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;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i  &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;        LED_NUM1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM1 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x08&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:#66d9ef&#34;&gt;else&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;        LED_NUM1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x08&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:#a6e22e&#34;&gt;HC595SendData&lt;/span&gt;(LED_NUM1);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;HC595SendData&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&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:#a6e22e&#34;&gt;HAL_GPIO_WritePin&lt;/span&gt;(COM1_PIN_GPIO_Port, COM1_PIN_Pin, GPIO_PIN_RESET);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;HAL_GPIO_WritePin&lt;/span&gt;(COM2_PIN_GPIO_Port, COM2_PIN_Pin, GPIO_PIN_SET);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;HAL_GPIO_WritePin&lt;/span&gt;(COM3_PIN_GPIO_Port, COM3_PIN_Pin, GPIO_PIN_RESET);
&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;if&lt;/span&gt; (LED_second_case &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;        LED_NUM2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM2 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x08&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:#66d9ef&#34;&gt;else&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;        LED_NUM2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x08&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:#a6e22e&#34;&gt;HC595SendData&lt;/span&gt;(LED_NUM2);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;HAL_Delay&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#a6e22e&#34;&gt;HC595SendData&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&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:#a6e22e&#34;&gt;HAL_GPIO_WritePin&lt;/span&gt;(COM1_PIN_GPIO_Port, COM1_PIN_Pin, GPIO_PIN_RESET);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;HAL_GPIO_WritePin&lt;/span&gt;(COM2_PIN_GPIO_Port, COM2_PIN_Pin, GPIO_PIN_RESET);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;HAL_GPIO_WritePin&lt;/span&gt;(COM3_PIN_GPIO_Port, COM3_PIN_Pin, GPIO_PIN_SET);
&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;if&lt;/span&gt; (LED_second_case &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x08&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:#66d9ef&#34;&gt;else&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;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x08&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:#66d9ef&#34;&gt;if&lt;/span&gt; (LED_power)
&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;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x40&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:#66d9ef&#34;&gt;else&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;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x40&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:#66d9ef&#34;&gt;if&lt;/span&gt; (LED_smart &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#66d9ef&#34;&gt;if&lt;/span&gt; (pwm_high &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;pwm_t&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;            LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;0x20&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:#66d9ef&#34;&gt;else&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;            LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x20&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&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;if&lt;/span&gt; (pwm_temp &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;if&lt;/span&gt; (flag &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#66d9ef&#34;&gt;pwm_t&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;pwm_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;                flag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;flag;
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;else&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:#66d9ef&#34;&gt;pwm_t&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;pwm_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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;                flag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;flag;
&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&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;    pwm_high&lt;span style=&#34;color:#f92672&#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;if&lt;/span&gt; (pwm_high &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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;        pwm_high &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;switch&lt;/span&gt; (LED_first_case)
&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;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;/* code */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x02&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x04&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;break&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;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;/* code */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;0x02&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x04&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;break&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;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;/* code */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x02&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;0x10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x04&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;break&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;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;/* code */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x02&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LED_NUM3 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;0x04&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;break&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;default&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;break&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:#a6e22e&#34;&gt;HC595SendData&lt;/span&gt;(LED_NUM3);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;HAL_Delay&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#a6e22e&#34;&gt;HC595SendData&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;，&lt;/p&gt;</description>
    </item>
    <item>
      <title>我的年终总结（2022）</title>
      <link>https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%932022/</link>
      <pubDate>Sun, 01 Jan 2023 01:20:38 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%932022/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;对于我来说，2022年是极为重要的一年；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;18dfe9c8cdfa86554cec30e2abf961e&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%932022/img-1.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;关于读研&#34;&gt;关于读研&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;关键词：迷茫&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在去年这个时候，我还在考虑读研的事情，我记得自己大三上学期所有科目成绩出来的那一天，我拿计算器算了一遍又一遍，最后得到一个心凉的结果：&lt;strong&gt;即使我大三下学期的核心课程考试都是100分，我也够不到保研的名额&lt;/strong&gt;；算出来这个结果之后，说真的是心凉了一截；&lt;/p&gt;
&lt;p&gt;虽然自己之前也大概估计着保研比较悬（每次考试都是考前突击，怎么可能稳保研），但是当自己真的算出来保研无望的那一刻，心里还是失落的；失落归失落，自己总还是要做出一个选择：考研或者工作；当然初期我根本没考虑工作的事情，一是对读研确实还有向往，二是我认识的同学或者学长他们绝大多数的选择都是考研；算是迷茫也算是随大流吧，我就打算考研；当然那个时候还比较早，才是一二月份，寒假在家那些天带着失落，自己也没开始复习，在家还是搞一点东西，在咸鱼接一些单子，自己搞一点东西做，在家也算开心；&lt;/p&gt;
&lt;p&gt;开学之后回到学校，就真要开始准备复习了，自己开始也没买什么纸质资料，网上找了些英语数学的考研课程就开始复习了，前些天倒也算努力，还制定了一个简单的复习时间表，英语看的刘晓燕老师的视频课程，数学是看的李永乐老师的视频教程和习题册；准备了一两个月吧，那些天上课时候偷偷复习，晚上也经常自己去中楼的自习室复习；复习这么久，有进展没有嘞，说实话，没什么进展，说是考研复习，自己心里没什么劲头，也只是看同学他们都开始复习，自己跟风罢了；&lt;/p&gt;
&lt;p&gt;复习时候，感觉很难受，可能也是自从高中之后自己再也没有像这样坐在那一坐一整天地复习，学来学去，进到自己脑袋的东西也不知道有多少；那时候为了复习还拒绝了很多事情，跟老师说我要考研，推掉本来要我做的项目，跟学姐说我要考研，推掉介绍给我的外快，跟父母说我要考研，让他们安心不要经常给我打电话，看起来自己是为考研做足了准备，貌似我就是要认真复习准备考研了；&lt;/p&gt;
&lt;p&gt;在刚回到学校不久，班助学长他们组织了一个考研就业动员大会，从这里也能看出考研和工作的人数比例，我记得讲考研经验的有三四个人，而讲工作经验的只有一个人（这位学长应该是拿了TP-LINK SP或者更高档次的Offer），我还用手机的记事本记了很多考研经验，以备我后边用；&lt;/p&gt;
&lt;p&gt;那我是什么时候改变想法了呢，我想是那天听的一个讲座，是毕业工作几年的学长们开的讲座，中间也讲到了工作和读研的抉择，最打动我的是一句话：&lt;strong&gt;你应该考虑读研三年和工作三年哪一个对自己的帮助大，你不应该拿着你现在去跟读研三年之后的你比，而应该拿读研三年之后的你和工作三年之后的你比&lt;/strong&gt;；听了之后对我触动很大，我说，那就去试试找工作吧；我想，几年后，我再回来看今天，会发现今天将是改变我一生的日子（现在一年后来看，的确是这样）；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;有一句话，很符合我那天的想法：
“当你老了，回顾一生，就会发觉：什么时候出国读书、什么时候决定做第一份职业、何时选定了对象而恋爱、什么时候结婚，其实都是命运的巨变。只是当时站在三岔路口，眼见风云千樯，你作出抉择的那一日，在日记上，相当沉闷和平凡，当时还以为是生命中普通的一天。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后就放弃了考研，不知道算不算半途而废，因为自己都还没有走到半途；自己的这个打算对自己将来发展是利是弊，现在还未可知也；&lt;/p&gt;
&lt;p&gt;至此，我的考研结束。&lt;/p&gt;
&lt;h2 id=&#34;关于工作&#34;&gt;关于工作&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;关键词：期待&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;工作的念头出现的比较晚，就是在上面提到的那个讲座之后，自己才开始考虑找工作的事情；&lt;/p&gt;
&lt;p&gt;最先当然是写简历，简历花了挺多时间写，不过也不是一天搞完的，我采取的方法是一天进步一点点，也就是一天写一部分，从个人信息、项目经历、个人荣誉一直写到专业技能，然后又润色润色，搞了差不多一个多星期才输出一份我自己比较满意的简历；&lt;/p&gt;
&lt;p&gt;然后就是找合适的公司投递简历，那个时候还比较早，很多公司的提前批都还没开始，所以就先准备投个实习练练手，说起来也没有投几个，我记得就投了海康威视和OPPO这两个公司的实习，OPPO那个是一直没什么什么进展，前几天去看才发现我连简历筛选都没过，可能是跟JD不太匹配吧；至于海康威视，倒是一步步都正常进行，简历筛选过了，然后HR打电话问了我的一些基本情况，然后是技术面和HR面，当然也都顺利通过了，最后我也在杭州海康威视实习了整两个月的时间，虽然最后因为实习时间不够的缘故未能参加最后的转正答辩，但是我还是很感谢我在海康的那段实习经历，第一次让我接触到了实际的工作内容；&lt;/p&gt;
&lt;p&gt;有一个比较神奇的地方，就是我后来拿到的大疆Offer的面试甚至比海康面试还要早一些，当我海康一面的时候，我就已经完成了大疆三面的流程在等最后结果了；&lt;/p&gt;
&lt;p&gt;大疆是我很早就接触到的公司，我在大二参加了RoboMaster比赛，而这个比赛就是大疆举办的，所以我与大疆还是有一些小缘分的；大疆提前批很早，我记得是4月25那天就开放投递简历了，大疆的提前批其实更准确的说法应该是“RM专属通道”，是为曾经参加过RM比赛的同学们开通的一个投递通道，我刚好参加过一年这个比赛，所以就顺理成章地投递了简历，后来我才知道我竟然还是投递专属通道的前一百位同学中的一个，还收到了大疆寄给我的一份礼物；&lt;/p&gt;
&lt;p&gt;大疆的面试流程走的很快，基本一周一个进度，所以在面试海康的时候我就已经完成了大疆的面试流程，面试大疆的面试经验对后边我面试海康起到了非常大的帮助；具体的时间表可以看一下我之前写的&lt;a href=&#34;https://www.fan-pengfei.top/2022/10/31/DJI%E9%9D%A2%E7%BB%8F/#more&#34;&gt;面经&lt;/a&gt;；&lt;/p&gt;
&lt;p&gt;当我拿到海康实习的Offer后，我就决定去了，毕竟大疆的最后面试结果还没有出来，自己还要为后面的秋招准备，想着是有个实习经验，后面找工作会好一些，所以就去了杭州实习，其实实习时候自己还是比较迷茫的，对于自己到底要找什么样的工作，需要做一些什么样的准备都不太清楚，刷题刷了一些，面试经验也看了不少，但是又怀疑自己的学历到底够不够，硕士那么多，自己一个末流985本科找工作能找到吗，天天也是很焦虑，害怕自己找不到什么好的工作，怀疑自己放弃读研去找工作是不是正确的选择；焦虑归焦虑，日子还是一天天的过，看看书，做一点任务，刷刷题目，天天吃的也不少，可能也是海康餐厅的伙食不错；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;f9385dba3d24e4bec7a5d67538cda49&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%932022/img-2.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;4865cacbde4839cbfa36be10b06bb00&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%932022/img-3.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;转折点就在七月份的一天，我接到了大疆HR小姐姐打来的Offer Call，也收到了邮件发来的录用意向书；&lt;/p&gt;
&lt;p&gt;我当时就想：&lt;strong&gt;好哦，我的秋招结束了；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;知道自己拿到大疆Offer的那一刻，自己明显不那么焦虑了，当然学东西也还在学，但是更偏向自己兴趣而不是那些八股文了，因为在我看来，大疆的确是我比较好的工作去向了，不论是我面试的感受还是平常了解到的，大疆确实是我很喜欢的一家公司；&lt;/p&gt;
&lt;p&gt;工作找到了，在海康又待了一个月，实习也结束了，又回到了学校；虽然拿到了录用意向书，但是又听说很多公司会有毁意向书的情况存在，又开始焦虑了，然后自己大四上学期又基本没有什么课程任务，就自己开始一天天摆弄自己的小玩意还有等待着最后的正式Offer，然后就在十月底的一天等到了，这样秋招才是正式结束了，悬着的心放下了，自己的秋招之旅也是有了一个满意的结果；&lt;/p&gt;
&lt;p&gt;我对工作这件事感觉很陌生，自己上了快20年的学，终于也要到了工作的时候了，有期待也有不安；&lt;/p&gt;
&lt;p&gt;但是日子还是一天天的过下去，一眼望到头的生活我不喜欢；&lt;/p&gt;
&lt;p&gt;我希望自己成长，能成为自己小时候梦想的工程师那样：无所不能。&lt;/p&gt;
&lt;h2 id=&#34;关于未来&#34;&gt;关于未来&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;关键词：无所不能&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我前几天看到了一段话，感觉挺有道理：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;生活不可能像你想象得那么好，但也不会像你想象得那么糟。我觉得人的脆弱和坚强都超乎自己的想象。有时，我可能脆弱得一句话就泪流满面，有时，也发现自己咬着牙走了很长的路。
——莫泊桑《一生》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;越往前走越能发现自己的路变得清晰；回想自己刚上大学时候那迷茫的样子，再看自己现在关于未来的想法，路变得越来越清晰了；&lt;/p&gt;
&lt;p&gt;沿着这条路走下去，我也能成为自己期望的那种人；&lt;/p&gt;
&lt;p&gt;新的一年，我希望我的家人平安幸福；&lt;/p&gt;
&lt;p&gt;新的一年，我希望自己能在梦想的路上越走越远；&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我想，我会成为自己想成为的那个工程师，掌握很多技能，面对问题，自己总能想到办法；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我相信我会成为这样的人：聪明、乐观、幽默、不言放弃、坚信问题终会被解决；&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>常用网站</title>
      <link>https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E7%BD%91%E7%AB%99/</link>
      <pubDate>Fri, 30 Dec 2022 02:46:33 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E7%BD%91%E7%AB%99/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;收罗一些常用的网站；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;1立创开源硬件平台&#34;&gt;1、立创开源硬件平台&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;当自己做一些硬件电路时在该网站上找一些参考设计；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://oshwhub.com/&#34;&gt;立创开源硬件平台&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;2立创商城&#34;&gt;2、立创商城&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;用于查询芯片的数据手册，有时也在该商城购买一些元器件，比较保真，开发票也很快；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.szlcsc.com/&#34;&gt;立创商城&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;3古月居ros&#34;&gt;3、古月居ROS&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;用于查看一些ROS相关的教程，依稀记得自己入门ROS就是学习的古月居的教程；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.guyuehome.com/&#34;&gt;古月居ROS&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;4学长的博客&#34;&gt;4、学长的博客&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;学长的博客网站，我记得自己AD库就是用的学长放在博客上面的；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://seaskyl.gitee.io/blog/&#34;&gt;刘威学长的博客&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;5阿里云域名管理控制台&#34;&gt;5、阿里云域名管理控制台&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;自己博客网站的域名就是在阿里云购买的，续费也是通过该平台进行；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://dc.console.aliyun.com/next/index?spm=5176.12818093.ProductAndResource--ali--widget-product-recent.dre0.bf2616d0gkDRmp#/overview&#34;&gt;阿里云域名控制台&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;6robomaster赛事报名系统专属通道投递简历&#34;&gt;6、ROBOMASTER赛事报名系统(专属通道投递简历)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://registration.robomaster.com/registration-center&#34;&gt;ROBOMASTER赛事报名系统&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;7牛客&#34;&gt;7、牛客&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;找工作时候经常用的，用来看一些面经；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nowcoder.com/&#34;&gt;牛客&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;8湖南大学webvpn系统门户&#34;&gt;8、湖南大学WebVPN系统门户&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;不需要运行VPN客户端即可；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://webvpn.hnu.edu.cn/&#34;&gt;湖南大学WebVPN系统门户&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;9威伯斯云登录页面&#34;&gt;9、威伯斯云登录页面&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;VPN登录页面；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.vps000.org/site/login&#34;&gt;威伯斯云登录页面&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;10书伴&#34;&gt;10、书伴&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;很多关于Kindle的使用技巧;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://bookfere.com/&#34;&gt;书伴&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;11在线思维导图&#34;&gt;11、在线思维导图&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;用于在线绘制思维导图，可以导出为图片，很方便；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.processon.com/&#34;&gt;在线思维导图&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;12阮一峰的博客&#34;&gt;12、阮一峰的博客&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;比较有意思；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://ruanyifeng.com/blog/&#34;&gt;阮一峰的博客&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;13typora官方中文站&#34;&gt;13、Typora官方中文站&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;有一些软件使用技巧；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://typoraio.cn/&#34;&gt;Typora官方中文站&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;14阿里云资源站&#34;&gt;14、阿里云资源站&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;有很多的纪录片和电影小说可以下载；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.yunpanziyuan.com/&#34;&gt;阿里云资源站&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;15磁力天堂&#34;&gt;15、磁力天堂&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;聚合类网站；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://btlm.cc/#term-33&#34;&gt;磁力天堂&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;16哇酷开发者社区&#34;&gt;16、哇酷开发者社区&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;之前搞荔枝派的时候经常使用这个网站；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://whycan.com/index.html&#34;&gt;WhyCan Forum(哇酷开发者社区)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;17阿里云矢量图标网站&#34;&gt;17、阿里云矢量图标网站&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;之前搞LVGL用了很多这个网站上的小图标；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.iconfont.cn/&#34;&gt;阿里云矢量图标网站&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>ubuntu2004无法联网问题</title>
      <link>https://fan-pengfei.top/posts/ubuntu2004%E6%97%A0%E6%B3%95%E8%81%94%E7%BD%91%E9%97%AE%E9%A2%98/</link>
      <pubDate>Thu, 29 Dec 2022 02:48:57 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/ubuntu2004%E6%97%A0%E6%B3%95%E8%81%94%E7%BD%91%E9%97%AE%E9%A2%98/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近Ubuntu2004虚拟机无法联网，而且这个问题很常见，就记录一下；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://blog.csdn.net/weixin_45084986/article/details/119192544?spm=1001.2014.3001.5506&#34;&gt;VMware Ubuntu20.04无法联网的解决方法&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;一安装环境及版本&#34;&gt;一、安装环境及版本&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;宿主机
Windows 10
虚拟机软件版本
VMware Workstation 16 Pro
ubuntu版本
Ubuntu 20.04&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;二解决方法&#34;&gt;二、解决方法&lt;/h2&gt;
&lt;p&gt;1、虚拟机-&amp;gt;设置-&amp;gt;网络适配器：进行如下设置：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;在这里插入图片描述&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/ubuntu2004%E6%97%A0%E6%B3%95%E8%81%94%E7%BD%91%E9%97%AE%E9%A2%98/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;2、然后打开终端窗口，在终端窗口输入如下命令：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo service network-manager stop
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo rm /var/lib/NetworkManager/NetworkManager.state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo service network-manager start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3、再运行&lt;code&gt;ifconfig&lt;/code&gt;便可以发现网络已经恢复正常；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;88d3a0e09984f60b005c21210c88bd6&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/ubuntu2004%E6%97%A0%E6%B3%95%E8%81%94%E7%BD%91%E9%97%AE%E9%A2%98/img-2.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>FOC基础源码分析</title>
      <link>https://fan-pengfei.top/posts/foc%E5%9F%BA%E7%A1%80%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/</link>
      <pubDate>Mon, 21 Nov 2022 08:05:05 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/foc%E5%9F%BA%E7%A1%80%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;以基于STM32F103的FOC源码为例分析；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;保存电机参数&#34;&gt;保存电机参数&lt;/h3&gt;
&lt;p&gt;采用宏定义开关来决定是否要进行参数校准；&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//1 已校准
&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;//0 未校准
&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;#define IS_ALIGN 0
&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;//参数数据结构体
&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;struct&lt;/span&gt; ALIGN_DATA
&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;long&lt;/span&gt; direction;
&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;int&lt;/span&gt; pole;
&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;float&lt;/span&gt; zero_angle;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} DATA_ALIGN;
&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;//根据宏定义判断是否要更新FLASH中存储的参数
&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;#if IS_ALIGN
&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:#a6e22e&#34;&gt;Internal_ReadFlash&lt;/span&gt;(ALIGN_ANGLE_ADDR, (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;DATA_ALIGN, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;);&lt;span style=&#34;color:#75715e&#34;&gt;//读取内部FLASH中的参数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sensor_direction &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; DATA_ALIGN.direction;    &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;    pole_pairs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; DATA_ALIGN.pole;               &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;    zero_electric_angle &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; DATA_ALIGN.zero_angle;&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;&lt;span style=&#34;color:#75715e&#34;&gt;#else
&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;//
&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;//此处略去参数识别代码
&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;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DATA_ALIGN.direction &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sensor_direction;    &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;    DATA_ALIGN.pole &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pole_pairs;               &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;    DATA_ALIGN.zero_angle &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; zero_electric_angle;&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;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Internal_WriteFlash&lt;/span&gt;(ALIGN_ANGLE_ADDR, (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;DATA_ALIGN, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;);&lt;span style=&#34;color:#75715e&#34;&gt;//将参数写入单片机内部FLASH中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;通过uart通信控制电机&#34;&gt;通过UART通信控制电机&lt;/h3&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;&lt;span style=&#34;color:#75715e&#34;&gt; * @brief 简易串口命令接收，需在while循环里重复调用该函数
&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; * @return 无
&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; */&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;commander_run&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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:#66d9ef&#34;&gt;if&lt;/span&gt; ((USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x8000&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;switch&lt;/span&gt; (USART_RX_BUF[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;H&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello World!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;break&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;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;T&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// T6.28
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            target &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;atof&lt;/span&gt;((&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)(USART_RX_BUF &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RX=%.4f&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, target);
&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;break&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;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// D
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            M1_Disable;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OK!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;break&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;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;E&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// E
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            M1_Enable;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OK!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;break&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;        USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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&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;#define USART_REC_LEN 256
&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;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; USART_RX_BUF[USART_REC_LEN]; &lt;span style=&#34;color:#75715e&#34;&gt;//接收缓冲，usart.h中定义长度
&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;//接收状态
&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;// bit15  接收完成标志
&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;// bit14  接收到0x0D
&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;// bit13~0  接收的字节数
&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;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;short&lt;/span&gt; USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//发送的命令必须以&amp;#34;\r\n&amp;#34;作为结尾，以标志命令的结束
&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;USART1_IRQHandler&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;//串口1中断程序
&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:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; 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;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;USART_GetITStatus&lt;/span&gt;(USART1, USART_IT_RXNE) &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; RESET) &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;    {
&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:#a6e22e&#34;&gt;USART_ReceiveData&lt;/span&gt;(USART1); &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;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ((USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x8000&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &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;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;if&lt;/span&gt; (USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x4000&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;//接收到了0x0d
&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:#66d9ef&#34;&gt;if&lt;/span&gt; (Res &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x0a&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;                    USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &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;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;else&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;                    USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x8000&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;                    USART_RX_BUF[USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;X3FFF] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;//最后一个字节放&amp;#39;0’，方便判断
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;//还没收到0x0D
&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:#66d9ef&#34;&gt;if&lt;/span&gt; (Res &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x0d&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;                    USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x4000&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:#66d9ef&#34;&gt;else&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;                    USART_RX_BUF[USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;X3FFF] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Res;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    USART_RX_STA&lt;span style=&#34;color:#f92672&#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;if&lt;/span&gt; (USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; (USART_REC_LEN &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;                        USART_RX_STA &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &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;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&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&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>CSAPP笔记</title>
      <link>https://fan-pengfei.top/posts/csapp%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Sat, 05 Nov 2022 11:43:47 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/csapp%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;CSAPP学习中所记录的笔记；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;第七章-链接&#34;&gt;第七章 链接&lt;/h2&gt;
&lt;p&gt;链接是将各种代码和数据片段收集并组合成为一个单一文件的过程，这个文件可被加载（复制）到内存中并执行。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;链接可以执行于：
编译时：也就是在源代码被翻译成机器代码时；
加载时：也就是在程序被加载器加载到内存并执行时；
运行时：也就是由应用程序来执行；
在早期系统，链接是手动执行的；
在现代系统，链接是由叫做链接器的程序自动执行的；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;链接器使分离编译成为可能；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;学习链接的必要性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;理解链接器将帮助你构造大型程序；&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;理解链接器将帮助你避免一些危险的编程错误（例如，在默认情况下，错误的定义多个全局变量的程序将通过链接器，而不产生任何警告信息）；&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;理解链接器将帮助你理解语言的作用域规则是如何实现的（全局变量和局部变量之间的区别？static属性的变量或者函数到底意味着什么）；&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;理解链接将帮助你理解其他重要的系统概念（比如加载和运行程序、虚拟内存、分页、内存映射等）；&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;理解链接将使你能够利用链接库；&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;71-编译器驱动程序&#34;&gt;7.1 编译器驱动程序&lt;/h3&gt;
&lt;p&gt;贯穿本章的示例程序：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;main.c
main函数初始化一个整数数组，然后调用sum函数对数组进行求和；&lt;/p&gt;
&lt;/blockquote&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sum&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n);
&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;int&lt;/span&gt; array[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&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:#66d9ef&#34;&gt;int&lt;/span&gt; val &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sum&lt;/span&gt;(array, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;return&lt;/span&gt; val;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#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;sum.c&lt;/p&gt;
&lt;/blockquote&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sum&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n)
&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;int&lt;/span&gt; i, s&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;i &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;首先运行预处理器，将&lt;/span&gt;main.c翻译成ASCII码的中间文件main.i&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;bash
&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;&amp;gt;&lt;/span&gt; cpp main.c &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;tmp&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;main.i
&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;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;接下来，驱动程序运行&lt;/span&gt;C编译器&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，将&lt;/span&gt;main.i翻译成一个ASCII汇编语言文件main.s&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;plaintext
&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;&amp;gt;&lt;/span&gt; cc1 &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;temp&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;main.i &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;Og &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;o &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;tmp&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;main.s
&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;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;然后，驱动程序运行汇编器，它将&lt;/span&gt;main.s翻译成一个可重定位目标文件main.o&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;bash
&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;&amp;gt;&lt;/span&gt; as &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;o &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;temp&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;main.o &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;tmp&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;main.s
&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;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;驱动程序经过相同的过程生成&lt;/span&gt;sum.o&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;最后，运行链接器程序&lt;/span&gt;ld&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，将&lt;/span&gt;main.o和sum.o以及一些必要的目标文件组合起来&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，创建一个可执行目标文件&lt;/span&gt;prog&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;bash
&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;&amp;gt;&lt;/span&gt; ld &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;o prog &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;tmp&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;main.o &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;tmp&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;sum.o
&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;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;```&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:#960050;background-color:#1e0010&#34;&gt;要运行可执行文件&lt;/span&gt;prog&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，使用以下命令：&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:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;bash
&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;/&lt;/span&gt;prog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;shell调用操作系统中一个叫做加载器的函数，它将可执行文件prog中的代码和数据复制到内存，然后将控制转移到这个程序的开头；&lt;/p&gt;</description>
    </item>
    <item>
      <title>DJI面经</title>
      <link>https://fan-pengfei.top/posts/dji%E9%9D%A2%E7%BB%8F/</link>
      <pubDate>Mon, 31 Oct 2022 12:21:08 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/dji%E9%9D%A2%E7%BB%8F/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;DJI面试经验；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;流程时间表&#34;&gt;流程时间表：&lt;/h3&gt;
&lt;p&gt;事件
日期&lt;/p&gt;
&lt;p&gt;投递简历
4月25日&lt;/p&gt;
&lt;p&gt;性格测评
4月27日&lt;/p&gt;
&lt;p&gt;第一次面试
5月3日&lt;/p&gt;
&lt;p&gt;第二次面试
5月13日&lt;/p&gt;
&lt;p&gt;第三次面试
5月20日&lt;/p&gt;
&lt;p&gt;电话OC
7月22日&lt;/p&gt;
&lt;p&gt;收到录用意向书
7月22日&lt;/p&gt;
&lt;p&gt;谈薪电话
10月27日&lt;/p&gt;
&lt;p&gt;收到正式OFFER
10月27日&lt;/p&gt;
&lt;p&gt;沟通三方信息
10月28日&lt;/p&gt;
&lt;h3 id=&#34;性格测评&#34;&gt;性格测评：&lt;/h3&gt;
&lt;p&gt;这个测评的题量还是比较大的（有大概一百多道题），不过时间也是完全足够的，有大概两个小时；&lt;/p&gt;
&lt;p&gt;题型全部都是选择题；主要内容为：一些简单的行测题、图形推理题、性格测试题、各种主观题，从难度来说都不是很难，不过听说测评会刷掉挺多的人，不过也没必要刻意去违心地回答这些问题，表现真实一些就可以，毕竟如果是跟自己价值观相差很大的公司，你进入后也不会很舒服；&lt;/p&gt;
&lt;p&gt;答题过程中会需要开摄像头，如果自己电脑不带前置摄像头的话，可能需要自备一个；&lt;/p&gt;
&lt;p&gt;答题过程中是可以使用草稿纸进行演算的，这个是没有任何问题的；&lt;/p&gt;
&lt;p&gt;其他的问题就没有了，可能需要提前了解一些大疆的各种产品信息等等；&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PS:因为我投递的是提前批，所以并没有笔试部分。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;第一次面试&#34;&gt;第一次面试：&lt;/h3&gt;
&lt;p&gt;面试前我很紧张，毕竟是第一次正式面试，甚至比后面的海康暑假实习面试还要早很多；&lt;/p&gt;
&lt;p&gt;面试前我准备了很多很多，把自己做过的项目都总结了一下，从头到尾过了一遍，听说会问比较多RTOS相关的知识，所以又把RTOS相关的知识过了一遍，即使这样，准备的还算比较充分，毕竟自己实际也做过很多很多自己的项目，但还是非常紧张；&lt;/p&gt;
&lt;p&gt;面试平台用的是腾讯会议，会提前发会议链接；&lt;/p&gt;
&lt;p&gt;我很早就在面试间等着，第一场面试的面试官有三位，他们三个轮换着来提问，不过应该其中一位是面试的主导者；&lt;/p&gt;
&lt;p&gt;上来就是自我介绍，我提前准备了一个三分钟自我介绍，阿巴阿巴介绍完，面试官就开始问问题；例如你最满意的项目是什么，为什么会很满意，做项目遇到了什么问题，你是怎样解决的等等诸如此类的问题；&lt;/p&gt;
&lt;p&gt;出乎我意料的是，整个面试中并没有问到什么知识点，唯一问到的就是单片机是如何启动到main函数的，而这个我正好复习过，就顺利地答上来了，面试官问和我回答的这段时间有二十分钟左右，后续就是问我有什么问题要问吗，我就问了几个应届生培养方案之类的问题；&lt;/p&gt;
&lt;p&gt;总的来说，面试过程很愉快，也并没有自己相信的那样紧张；&lt;/p&gt;
&lt;p&gt;大概是第二天，就收到了面试通过的邮件，效率很高；&lt;/p&gt;
&lt;h3 id=&#34;第二次面试&#34;&gt;第二次面试：&lt;/h3&gt;
&lt;p&gt;第一次面试之后过了大概一个星期就是第二次面试，这次面试只有一位面试官；&lt;/p&gt;
&lt;p&gt;面试的内容跟第一次面试的内容很相似，也都是自我介绍，问自己做过的项目，最满意的项目是哪个，我就说是曾经做过的小一，然后问为什么会觉得满意，就围绕着这个项目谈了很多（主要可能是我自发的做的这个项目，并没有什么功利性），还问了你有没有跟市面上类似的产品做过比较等等的，你用的这个框架LVGL你觉得有什么不足之处吗；&lt;/p&gt;
&lt;p&gt;后面还问了一些其他的问题，比如你FreeRTOS用的熟吗，队里边是只有你一个人用得熟，还是大家用的都很熟，平常在实验室都待到几点，在队伍里的感受怎么样，曾经有没有用过大疆的产品，这个产品你觉得有什么优点（我提到了大疆的一款无人机）；&lt;/p&gt;
&lt;p&gt;面试官说话让人感觉到很舒服，很愉快，也不会让自己太紧张，这次的面试时间很长，大概有五十多分钟；&lt;/p&gt;
&lt;p&gt;大概当晚我就收到了面试通过的消息；&lt;/p&gt;
&lt;h3 id=&#34;第三次面试&#34;&gt;第三次面试：&lt;/h3&gt;
&lt;p&gt;大概第二次面试通过五六天之后就是第三次面试，这次面试的面试官也是一位；第三次面试跟前两次有些不同，更多的是问我性格相关的问题，对项目相关的问题会少一些；&lt;/p&gt;
&lt;p&gt;问的问题有：你用一个词语形容一下自己，这个我当时真的蒙了，就尝试说了几下自己的优势，然后面试官还追问说，那你用一个词语描述下呢？最后好像也没说出什么（还是怪我没有准备完全）；&lt;/p&gt;
&lt;p&gt;还有就是问我有没有跟别人争执过，因为什么而争执，怎么解决的；你觉得你的性格方面有没有什么缺陷等等；&lt;/p&gt;
&lt;p&gt;这场面试感觉答得不是很好，因为有些问题自己之前都没准备到，本以为凉凉了，没想到很快就通过了，然后就是等着综合评估结果；&lt;/p&gt;
&lt;p&gt;大概第二天，登录招聘网站，就发现三面通过了，不过听说还会有综合排序，会刷一部分的人；&lt;/p&gt;
&lt;p&gt;在七月下旬，终于接到OC（Offer Call）了，我的秋招正式结束；&lt;/p&gt;</description>
    </item>
    <item>
      <title>AG1280串口通信</title>
      <link>https://fan-pengfei.top/posts/ag1280%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1/</link>
      <pubDate>Sun, 30 Oct 2022 04:58:47 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/ag1280%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;因为上次做的板子是将FPGA和一块MCU芯片集成在一块的，他们之间就需要通信，当然最容易实现的就是UART串口通信；
下面的代码是一个Demo代码，实现的功能是，RX接收到什么，TX就发送相同的数据；
FPGA芯片
AG1280Q48
时钟频率
48MHZ
波特率
921600
RX引脚
PIN_16
TX引脚
PIN_14
LED引脚
PIN_48
时钟输入引脚
PIN_15
复位引脚
PIN_17&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;具体代码如下：&lt;/p&gt;
&lt;h2 id=&#34;顶层模块&#34;&gt;顶层模块&lt;/h2&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-verilog&#34; data-lang=&#34;verilog&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;module&lt;/span&gt; connect_mcu (&lt;span style=&#34;color:#66d9ef&#34;&gt;input&lt;/span&gt; clk,
&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;input&lt;/span&gt; rst_n,
&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;input&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;wire&lt;/span&gt; uart_rx,
&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;output&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;wire&lt;/span&gt; uart_tx,
&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;output&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;wire&lt;/span&gt; led);
&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;wire&lt;/span&gt; clk_pll_o; &lt;span style=&#34;color:#75715e&#34;&gt;//PLL时钟
&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;    inpll pll_inst (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clkin(clk),		&lt;span style=&#34;color:#75715e&#34;&gt;// PLL.clkin MUST connect to PIN_XX_GB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clkfb(clk_pll_o),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .pllen(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;b1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .resetn(rst_n),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clkout0en(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;b1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clkout1en(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;b0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clkout2en(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;b0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clkout3en(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;b0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clkout0(clk_pll_o),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clkout1(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clkout2(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clkout3(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .lock()
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;parameter&lt;/span&gt;  SYSTERM_CLK &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;d48&lt;/span&gt;_000_000;               &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;    &lt;span style=&#34;color:#66d9ef&#34;&gt;parameter&lt;/span&gt;  UART_BPS    &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;d921600&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;
&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;wire&lt;/span&gt;       flag;
&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;wire&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] data;
&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;// assign led = data[0];
&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;    uart_receive
&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;    .SYSTERM_CLK   (SYSTERM_CLK),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .UART_BPS      (UART_BPS)
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    u_uart_receive(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clk          (clk_pll_o),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .rst_n        (rst_n),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .uart_rx      (uart_rx),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .receive_done (flag),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .uart_data    (data)
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    uart_send
&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;    .SYSTERM_CLK   (SYSTERM_CLK),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .UART_BPS      (UART_BPS)
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    u_uart_send(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .clk          (clk_pll_o),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .rst_n        (rst_n),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .uart_in_data (data),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .uart_in_flag (flag),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .uart_tx      (uart_tx)
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;reg&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] led_counter;
&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;assign&lt;/span&gt; led &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; led_counter[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;// parameter SEC_TIME = 32&amp;#39;d48_000_000;//48M
&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;reg&lt;/span&gt;	[&lt;span style=&#34;color:#ae81ff&#34;&gt;31&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] cnt;
&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;always&lt;/span&gt; @ (&lt;span style=&#34;color:#66d9ef&#34;&gt;posedge&lt;/span&gt; clk_pll_o &lt;span style=&#34;color:#66d9ef&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;negedge&lt;/span&gt; rst_n)&lt;span style=&#34;color:#66d9ef&#34;&gt;begin&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;if&lt;/span&gt; (rst_n &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cnt &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;d1&lt;/span&gt;)) &lt;span style=&#34;color:#66d9ef&#34;&gt;begin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            reg_data
&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:#f92672&#34;&gt;!&lt;/span&gt;[f1992c7fce5ccbde038bca329048345](img&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.&lt;/span&gt;png)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>AT32F403A系列单片机开发</title>
      <link>https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/</link>
      <pubDate>Wed, 12 Oct 2022 15:07:03 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;记录AT32开发中遇到的问题；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;硬件部分&#34;&gt;硬件部分：&lt;/h2&gt;
&lt;p&gt;硬件部分我是参考官方开发板来做的；&lt;/p&gt;
&lt;p&gt;经过测试，硬件部分没有任何问题；&lt;/p&gt;
&lt;p&gt;原理图
&lt;img alt=&#34;2e8cc9324c8e969b2ba048221939699&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;PCB仿真图
&lt;img alt=&#34;f12b1584db83aef4fbd8cc925b76d40&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;实物图
&lt;img alt=&#34;bbea8d18667d74360d3ef9c638453d5&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-3.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;显示效果
&lt;img alt=&#34;dcf5793c87931e4e32513eca0f71157&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-4.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;有几个值得关注的地方，我将在下面列出：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用编码器开关作为输入设备；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用CH340E芯片作为串口转USB；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;通过TYPE-C接口的正反插实现不同的功能（连接CH340E芯片和AT32的USB引脚）：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;屏幕接口采用的是FPC0.5mm接口，方便安装；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;硬件部分的测试很快就结束了，主要就是测试各个外设是否能正常使用；&lt;/p&gt;
&lt;p&gt;经测试，主控芯片、屏幕、spiflash、USB接口、CH340E、编码器开关、RTC时钟均能正常使用；&lt;/p&gt;
&lt;h2 id=&#34;软件开发&#34;&gt;软件开发：&lt;/h2&gt;
&lt;h3 id=&#34;参考资料&#34;&gt;参考资料：&lt;/h3&gt;
&lt;p&gt;主控芯片使用的是雅特力的AT32F403ACGU7，其特性如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;f9ed3e62565a45863771434081c095d&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;参考资料网站：&lt;a href=&#34;https://www.arterytek.com/cn/product/AT32F403A.jsp&#34;&gt;https://www.arterytek.com/cn/product/AT32F403A.jsp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ae1d18fa022ab02fffa6a006428d441&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-6.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;下载固件库源码，经解压后，可以在目录:&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#ae81ff&#34;&gt;\A&lt;/span&gt;T32F403A_407_Firmware_Library_V2.1.2&lt;span style=&#34;color:#ae81ff&#34;&gt;\p&lt;/span&gt;roject&lt;span style=&#34;color:#ae81ff&#34;&gt;\a&lt;/span&gt;t_start_f403a&lt;span style=&#34;color:#ae81ff&#34;&gt;\e&lt;/span&gt;xamples
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;找到各个外设的例子：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ls
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;acc/        crm/    gpio/  spi/         wwdt/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adc/        dac/    i2c/   sram/        xmc/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bpr/        debug/  i2s/   tmr/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;can/        dma/    pwc/   usart/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cortex_m4/  exint/  rtc/   usb_device/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crc/        flash/  sdio/  wdt/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;首先当然是串口打印和点灯，这样能测试时钟配置是否正常，以及判断芯片好坏与否；&lt;/p&gt;
&lt;h3 id=&#34;具体开发&#34;&gt;具体开发：&lt;/h3&gt;
&lt;p&gt;关键代码如下：&lt;/p&gt;
&lt;h4 id=&#34;点灯&#34;&gt;点灯：&lt;/h4&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;at32_led_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    gpio_init_type gpio_init_struct;
&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;/* enable the led clock */&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:#a6e22e&#34;&gt;crm_periph_clock_enable&lt;/span&gt;(USER_LED_GPIO_CRM_CLK, TRUE);
&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;/* set default parameter */&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:#a6e22e&#34;&gt;gpio_default_para_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gpio_init_struct);
&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;/* configure the led gpio */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_pins &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; USER_LED_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_MODE_OUTPUT;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_out_type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_OUTPUT_PUSH_PULL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_pull &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_PULL_NONE;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_drive_strength &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_DRIVE_STRENGTH_STRONGER;
&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:#a6e22e&#34;&gt;gpio_init&lt;/span&gt;(USER_LED_GPIO, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gpio_init_struct);
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;at32_led_on&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    USER_LED_GPIO&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;clr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; USER_LED_PIN;
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;at32_led_off&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    USER_LED_GPIO&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;scr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; USER_LED_PIN;
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;at32_led_toggle&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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;    USER_LED_GPIO&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;odt &lt;span style=&#34;color:#f92672&#34;&gt;^=&lt;/span&gt; USER_LED_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;串口&#34;&gt;串口：&lt;/h4&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;uart_print_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; baudrate)
&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;    gpio_init_type gpio_init_struct;
&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;/* enable the uart and gpio clock */&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:#a6e22e&#34;&gt;crm_periph_clock_enable&lt;/span&gt;(PRINT_UART_CRM_CLK, TRUE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;crm_periph_clock_enable&lt;/span&gt;(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;gpio_default_para_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gpio_init_struct);
&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;/* configure the uart tx pin */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_drive_strength &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_DRIVE_STRENGTH_STRONGER;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_out_type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_OUTPUT_PUSH_PULL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_MODE_MUX;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_pins &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; PRINT_UART_TX_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_pull &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_PULL_NONE;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;gpio_init&lt;/span&gt;(PRINT_UART_TX_GPIO, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gpio_init_struct);
&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;/* configure uart param */&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:#a6e22e&#34;&gt;usart_init&lt;/span&gt;(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;usart_transmitter_enable&lt;/span&gt;(PRINT_UART, TRUE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;usart_enable&lt;/span&gt;(PRINT_UART, TRUE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;串口重定向&lt;/strong&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>LCD底板设计</title>
      <link>https://fan-pengfei.top/posts/lcd%E5%BA%95%E6%9D%BF%E8%AE%BE%E8%AE%A1/</link>
      <pubDate>Wed, 12 Oct 2022 11:41:43 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/lcd%E5%BA%95%E6%9D%BF%E8%AE%BE%E8%AE%A1/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;打算做一个适配1.33寸屏幕和2.0寸屏幕的底板，屏幕接口留出来两种，FPC排线连接，八位并行接口和SPI接口；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个可能要搁置一段时间了，因为目前只做了集成MCU和屏幕的板子；&lt;/p&gt;</description>
    </item>
    <item>
      <title>Typora修改高亮颜色</title>
      <link>https://fan-pengfei.top/posts/typora%E4%BF%AE%E6%94%B9%E9%AB%98%E4%BA%AE%E9%A2%9C%E8%89%B2/</link>
      <pubDate>Wed, 12 Oct 2022 05:52:59 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/typora%E4%BF%AE%E6%94%B9%E9%AB%98%E4%BA%AE%E9%A2%9C%E8%89%B2/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;如何修改 Typora 「高亮」的颜色；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Typora 有一个「高亮」的格式（示例：&lt;code&gt;==例子==&lt;/code&gt;），类似于荧光笔，但是感觉默认的颜色偏亮，看久了不舒服，所以利用修改主题文件的方式来自定义颜色。&lt;/p&gt;
&lt;p&gt;操作很简单，先找到主题文件：「文件」 ==&amp;gt; 「偏好设置」（或者直接 Ctrl + 逗号），在右边「外观」栏中找到「打开主题文件」打开：&lt;/p&gt;
&lt;p&gt;打开主题对应的 &lt;code&gt;.css&lt;/code&gt; 文件，在最后面加上下面的文字：&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-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;mark&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;background&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;#a9d18e&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;border-bottom&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;px&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;solid&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;#ffffff&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;padding&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;px&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;margin&lt;/span&gt;: &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:#66d9ef&#34;&gt;px&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果只是想要单纯改变颜色，也可以只写 &lt;code&gt;background&lt;/code&gt;的这一行：&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-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;mark&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;background&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;#a9d18e&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中 &lt;code&gt;backgraoud&lt;/code&gt;后面的十六进制数为所需要的颜色。&lt;code&gt;border-bottom&lt;/code&gt; 是下划线的大小和颜色。&lt;code&gt;padding&lt;/code&gt;就是上下左右的边框大小。&lt;code&gt;margin&lt;/code&gt;就是所标记文字离左右文字的距离。&lt;/p&gt;
&lt;p&gt;最后，Typora 中「高亮」没有快捷键，但是可以自定义。Ctrl+逗号 打开「偏好设置」，在「通用」里最下面打开高级设置，找到下图位置，添加自己需要的快捷键：&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Custom key binding, which will override the default ones.
&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:#e6db74&#34;&gt;&amp;#34;keyBinding&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;// for example:
&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;// &amp;#34;Always on Top&amp;#34;: &amp;#34;Ctrl+Shift+P&amp;#34;
&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:#960050;background-color:#1e0010&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改为：&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Custom key binding, which will override the default ones.
&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:#e6db74&#34;&gt;&amp;#34;keyBinding&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;// for example:
&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;// &amp;#34;Always on Top&amp;#34;: &amp;#34;Ctrl+Shift+P&amp;#34;
&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;&amp;#34;Highlight&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ctrl+Shift+H&amp;#34;&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:#960050;background-color:#1e0010&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后的效果如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>AG1280开发记录</title>
      <link>https://fan-pengfei.top/posts/ag1280%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Wed, 12 Oct 2022 04:51:04 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/ag1280%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;AG1280是一款国产的CPLD芯片，我准备将这个芯片和MCU配合起来，来做一些定制化的接口和功能，例如扩展UART接口，外接一些高速的AD/DA芯片；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;芯片资源&#34;&gt;芯片资源：&lt;/h3&gt;
&lt;p&gt;AG1280资源：&lt;/p&gt;
&lt;p&gt;LUTs
1280&lt;/p&gt;
&lt;p&gt;Distributed RAM (Kbits)
10&lt;/p&gt;
&lt;p&gt;EBR SRAM (Kbits)
68&lt;/p&gt;
&lt;p&gt;Maximum User I/O pins
40&lt;/p&gt;
&lt;p&gt;Number of PLLs
1&lt;/p&gt;
&lt;p&gt;Package
48-Pin QFN&lt;/p&gt;
&lt;p&gt;价格很便宜，每颗单价大概是7元；&lt;/p&gt;
&lt;p&gt;我画了一个评估板，除了这颗CPLD芯片外，还加了一颗STM32F103C6T6芯片，他们之间有六个IO口互相连接来进行通信或者时钟输入；&lt;/p&gt;
&lt;p&gt;STM32F103C6T6资源：&lt;/p&gt;
&lt;p&gt;封装 / 箱体
LQFP-48&lt;/p&gt;
&lt;p&gt;核心
ARM Cortex M3&lt;/p&gt;
&lt;p&gt;程序存储器大小
32 kB&lt;/p&gt;
&lt;p&gt;数据总线宽度
32 bit&lt;/p&gt;
&lt;p&gt;ADC分辨率
12 bit&lt;/p&gt;
&lt;p&gt;最大时钟频率
72 MHz&lt;/p&gt;
&lt;p&gt;输入/输出端数量
48 I/O&lt;/p&gt;
&lt;p&gt;数据 RAM 大小
10 kB&lt;/p&gt;
&lt;h3 id=&#34;评估板设计&#34;&gt;评估板设计：&lt;/h3&gt;
&lt;p&gt;板子原理图如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;b1d8d200e99d2ad024b82831d823bf7&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/ag1280%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;PCB视图如下：
&lt;img alt=&#34;d85be4f1a50fb9dc67385b0af4d328f&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/ag1280%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/img-2.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;硬件设计注意&#34;&gt;硬件设计注意：&lt;/h3&gt;
&lt;p&gt;AG1280硬件设计中有几个需要特别注意的点：&lt;/p&gt;
&lt;p&gt;1、IO_GLOBE_S1(位于第9脚)、IO_GLOBE_S2(位于第13脚)、IO_GLOBE_S3(位于第15脚)、IO_GLOBE_S4(位于第19脚)、IO_GLOBE_N1(位于第41脚) 、IO_GLOBE_N2(位于第44脚) 、IO_GLOBE_N3(位于第46脚)可以作为全局时钟输入管脚，可用于输入全局时钟。&lt;strong&gt;但若要使用PLL，则只能从13、15和19管脚输入。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2、电路板载一个24MHz有源晶振，另外还可以通过PMOD接口从STM32的MCO时钟输出管脚获得时钟，它们被连接到具有PLL输入功能的管脚13、15上。&lt;/p&gt;
&lt;p&gt;3、AG1280的GPIO分为North和South两组，可以使用不同IO电平，以实现不同电平逻辑的转换。另外AG1280还需要3.3V电源作为片上Flash电源，且该电源域North组的IO电源共用，因此&lt;strong&gt;North组也只能使用3.3V的IO电源电压。South组却可以任选电源电压&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;4、&lt;strong&gt;AG1280还需要1.2V内核电源电压，且该电源应略迟于Flash电源上电，以方便Flash加载程序&lt;/strong&gt;。我的图2电路通过PMOD接口从STM32开发板获得3.3V电源，再用LDO芯片XC6206P122MR从3.3V向下稳压到1.2V内核电源，LDO后带有100uF电容,1.2V上电时间自然要落后于3.3V上电。&lt;/p&gt;
&lt;p&gt;板子已经发出去打样了，估计今天就能到，我到时候焊接测试下；&lt;/p&gt;
&lt;h3 id=&#34;软件&#34;&gt;软件：&lt;/h3&gt;
&lt;h4 id=&#34;环境配置&#34;&gt;环境配置：&lt;/h4&gt;
&lt;p&gt;AG1280的开发EDA软件Supera还不具备分析和综合电路的能力，但能实现其特有的PLL和片上RAM的IP核打包、综合后的布局布线、下载文件打包及下载等功能。&lt;/p&gt;</description>
    </item>
    <item>
      <title>F1C100S驱动开发</title>
      <link>https://fan-pengfei.top/posts/f1c100s%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91/</link>
      <pubDate>Sun, 02 Oct 2022 04:23:19 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/f1c100s%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Uboot和系统跑起来了，接下来就是进行驱动开发了；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;heartbeat心跳灯&#34;&gt;Heartbeat(心跳灯)&lt;/h2&gt;
&lt;h3 id=&#34;修改设备树&#34;&gt;修改设备树：&lt;/h3&gt;
&lt;p&gt;在设备树文件&lt;code&gt;arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts&lt;/code&gt;中；&lt;/p&gt;
&lt;p&gt;在 / { } 所包裹的根节点目录下添加：&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;leds {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    compatible = &amp;#34;gpio-leds&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    user_led {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    label = &amp;#34;led:usr&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        gpios = ; /* PE12 */
&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gpios = ; /* PE12 */
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;代表引脚 &lt;code&gt;4 * 32 + 12&lt;/code&gt;也就是&lt;code&gt;PE12（ A~G： 0~6）&lt;/code&gt;
其名字为：&lt;code&gt;led:usr&lt;/code&gt;；&lt;/p&gt;
&lt;p&gt;系统启动后与LED控制有关的文件；&lt;/p&gt;
&lt;p&gt;系统启动后，将看到这样的文件：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$: ls /sys/class/leds/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;led:usr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里三个文件夹分别对应设备树中定义的三个LED；&lt;/p&gt;
&lt;h3 id=&#34;编译设备树&#34;&gt;编译设备树：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;可以只编译设备树，不编译其他文件；&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make ARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm CROSS_COMPILE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm-linux-gnueabi- dtbs -j12
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;控制led灯亮灭&#34;&gt;控制LED灯亮灭：&lt;/h3&gt;
&lt;p&gt;点亮LED：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$: echo &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &amp;gt; /sys/class/leds/led&lt;span style=&#34;color:#ae81ff&#34;&gt;\:&lt;/span&gt;usr/brightness
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;熄灭LED：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$: echo &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &amp;gt; /sys/class/leds/led&lt;span style=&#34;color:#ae81ff&#34;&gt;\:&lt;/span&gt;usr/brightness
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;控制LED闪烁：&lt;/p&gt;</description>
    </item>
    <item>
      <title>F1C100S开发记录</title>
      <link>https://fan-pengfei.top/posts/f1c100s%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Sat, 01 Oct 2022 04:10:08 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/f1c100s%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近画了一个Linux板子，主控是全志的F1C100S，自带了32M RAM，不是很大，但是可以学习下；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;板子图片&#34;&gt;板子图片：&lt;/h2&gt;
&lt;p&gt;板子正面
板子反面
UBoot启动&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;f1c100s-1&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/f1c100s%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/img-1.jpg&#34;&gt;
&lt;img alt=&#34;f1c100s-2&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/f1c100s%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/img-2.jpg&#34;&gt;
&lt;img alt=&#34;f1c100s-3&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/f1c100s%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/img-3.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;flash下载工具使用&#34;&gt;FLASH下载工具使用&lt;/h2&gt;
&lt;p&gt;1、通过命令 &lt;code&gt;sudo sunxi-fel ver&lt;/code&gt; 来确认有无成功进入fel模式；&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo sunxi-fel ver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2、短接FLASH&lt;code&gt;1&lt;/code&gt;和&lt;code&gt;4&lt;/code&gt;脚，可以进入fel模式，其实就是CS引脚拉低；&lt;/p&gt;
&lt;p&gt;3、单次运行（下载到RAM中）：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sunxi-fel uboot /your/path/to/u-boot-sunxi-with-spl.bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4、烧进 spi-flash （开机自启）&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sunxi-fel -p spiflash-write 0 /your/path/to/u-boot-sunxi-with-spl.bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中0是烧录偏移地址；&lt;/p&gt;
&lt;h2 id=&#34;uboot编译&#34;&gt;Uboot编译&lt;/h2&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://gitee.com/LicheePiNano/u-boot.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd u-boot
&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;# 查看分支&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git branch -a
&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;# 切换到 Nano 分支&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout nano-lcd800480
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone -b nano-lcd800480 --depth&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; https://github.com/Lichee-Pi/u-boot.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;此处告知make采用arm-linux-gnueabi下的所有交叉编译工具，目标架构为Arm，设定各项默认配置为 nano 的spiflash支持版
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make ARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm CROSS_COMPILE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm-linux-gnueabi- f1c100s_nano_uboot_defconfig
&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;# 若不带spi-flash的板子，请换成 licheepi_nano_defconfig&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;# 进行可视化配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make ARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm menuconfig
&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;# 修改默认bootcmd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gedit include/configs/suniv.h
&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;# 需要修改为&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;#define CONFIG_BOOTCOMMAND &amp;#34;run distro_bootcmd&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;# 开始编译&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make ARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm CROSS_COMPILE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm-linux-gnueabi- -j8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;只需要&lt;code&gt;u-boot-sunxi-with-spl.bin&lt;/code&gt;即可；&lt;/p&gt;</description>
    </item>
    <item>
      <title>FOC项目记录</title>
      <link>https://fan-pengfei.top/posts/foc%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Thu, 29 Sep 2022 03:35:34 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/foc%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;大四应该没多少事情了，想继续做一下FOC相关的；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;开发过程持续更新&#34;&gt;开发过程(持续更新)：&lt;/h1&gt;
&lt;h2 id=&#34;2022年9月29日&#34;&gt;2022年9月29日：&lt;/h2&gt;
&lt;p&gt;中间好久没有更新，是这几天比较忙，没有时间写；&lt;/p&gt;
&lt;p&gt;算下来，FOC的板子做了三个大的版本，五个比较小的版本，可以说是一次次的迭代更新；&lt;/p&gt;
&lt;p&gt;主控
供电方案
驱动模块
是否有电流采样
通信方式&lt;/p&gt;
&lt;p&gt;FOC-V1
STM32F103C6T6
AMS1117-3.3V
DRV8313
否
UART&lt;/p&gt;
&lt;p&gt;FOC-V2
STM32F103C6T6
AMS1117-3.3V
DRV8313
否
UART&lt;/p&gt;
&lt;p&gt;FOC-V3
STM32F103C6T6
AMS1117-3.3V
MP6540
是
UART&lt;/p&gt;
&lt;p&gt;FOC-V4
AT32F403ACGU7
AMS1117-5V &amp;amp; AMS117-3.3V
DRV8313
否
UART&lt;/p&gt;
&lt;p&gt;FOC-V5
STM32F405RGT6
L7805 &amp;amp; AMS1117-3.3V
BTN7960B
是
UART/CAN&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码自己也加入了很多功能，电流环还没有做出来，后边再继续努力做，加油！&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;板子pcb&#34;&gt;板子PCB：&lt;/h4&gt;
&lt;p&gt;版本
图片&lt;/p&gt;
&lt;p&gt;FOC-V1
&lt;img alt=&#34;5a51969d25e04571c84bbed4619b3d1&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/foc%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;FOC-V2
&lt;img alt=&#34;810f1cf95eb622c35b9f178e4779c89&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/foc%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;FOC-V3
&lt;img alt=&#34;9e2eb6c5c2c84dea0f5ffeafe90cf76&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/foc%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;FOC-V4
&lt;img alt=&#34;98b04d9d4090dbfbf42a2c17963e346&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/foc%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/img-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;FOC-V5
&lt;img alt=&#34;de81656ff3a84382a63eb2933b4aada&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/foc%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/img-5.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;2022年9月12日&#34;&gt;2022年9月12日：&lt;/h2&gt;
&lt;p&gt;中间好久不更新，这些天对FOC项目做了更多的测试，还有做了一些应用，例如倒立摆，平衡车等等；&lt;/p&gt;
&lt;p&gt;想要加上电流环，刚开始自然的想法是，用合金采样电阻加电流放大器加stm32的AD，这个外围电路比较麻烦，成本也很高；&lt;/p&gt;
&lt;p&gt;昨天查找资料发现了一个芯片：&lt;strong&gt;MP6540&lt;/strong&gt;，三相电机驱动芯片，且内部集成了电流检测，只需要用32的AD去读就可以了，今上午画了一个测试板，已经发去打样了，希望能正常工作；&lt;/p&gt;
&lt;p&gt;等板子回来了，我测试一下，在说要不要改用这个芯片；&lt;/p&gt;
&lt;h2 id=&#34;2022年9月3日&#34;&gt;2022年9月3日：&lt;/h2&gt;
&lt;p&gt;修改的板子今天已经到了，焊接好了，也测试了，很完美，发热没那么严重了；&lt;/p&gt;
&lt;p&gt;这次使用的LDO是AMS1117(SOT-89封装)，它的输入最高电压是18V，完全够用了，发热虽然还是很大，但封装也更大了，所以还是可以接受的；&lt;/p&gt;
&lt;p&gt;AMS1117数据手册说明的的输入电压限制&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;fcf213d49a6cab89ced651af4a63af8&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/foc%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/img-6.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;在测试过程中，长时间运转未出现任何问题，闭环控制，开环控制都可以很好运转；&lt;/p&gt;
&lt;p&gt;后续就是开始做平衡车，调参数；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;FOC_V1&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/foc%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/img-7.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;2022年8月22日&#34;&gt;2022年8月22日：&lt;/h2&gt;
&lt;p&gt;今天又查看了一下RT9013-33GB的数据手册，发现电压最大为5.5V，看来是要换供电部分的电路了；&lt;/p&gt;
&lt;p&gt;输入电压限制
输出电流限制&lt;/p&gt;</description>
    </item>
    <item>
      <title>git常用命令</title>
      <link>https://fan-pengfei.top/posts/git%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link>
      <pubDate>Wed, 28 Sep 2022 13:12:41 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/git%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近在做FOC项目的时候，用到了GIT中的分支功能，因而再复习一下GIT的用法，在此记录一下GIT常用命令；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;为表简洁，我就直接给出具体的命令以及简短的注释和自己对此的理解；&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;1git-init&#34;&gt;1、git init&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;用于初始化git仓库；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;2git-add-文件名&#34;&gt;2、git add +文件名&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;将指定工作区文件提交到git暂存区；
-A，是添加文件夹内的所有文件到暂存区；
每次提交，都要&lt;code&gt;git add&lt;/code&gt;加入到暂存区，然后再commit提交；
第一次修改 -&amp;gt; &lt;code&gt;git add&lt;/code&gt; -&amp;gt; 第二次修改 -&amp;gt; &lt;code&gt;git add&lt;/code&gt; -&amp;gt; &lt;code&gt;git commit&lt;/code&gt;；
commit提交的是git add 加入的修改的内容，而不是文件当前的内容；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;3git-commit--m-本次提交的说明&#34;&gt;3、git commit -m +“本次提交的说明”&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;将暂存区文件提交到仓库；
-m，后边是关于本次提交的说明；
该命令执行成功后会显示提交的内容：
例如：
&lt;code&gt;1 file changed&lt;/code&gt;：1个文件被改动；
&lt;code&gt;2 insertions&lt;/code&gt;：插入了两行内容；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;4git-status&#34;&gt;4、git status&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;显示当前仓库的状态（被修改的文件是否被提交）；
例如某个文件被修改却未被提交；
包括工作区的文件修改情况和暂存区的文件修改情况；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;5git-diff-文件名&#34;&gt;5、git diff +文件名&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;查看文件修改内容；
常看尚未被提交的文件做了什么修改；
&lt;strong&gt;是工作区和暂存区文件之间的差别；&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;6git-log&#34;&gt;6、git log&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;显示从近到远的提交日志；
&lt;img alt=&#34;efb8ab5c515470ebd88aece20684127&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/git%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/img-1.png&#34;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;7git-reset-hard-head&#34;&gt;7、git reset —hard HEAD^&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;回退到上一版本；
HEAD
当前版本
HEAD^
上一版本
HEAD^^
上上一版本&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;8git-reset-hard-1094a&#34;&gt;8、git reset —hard 1094a&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;回退或者前进到指定版本；
—hard，后边的是版本号前几位；&lt;/p&gt;</description>
    </item>
    <item>
      <title>UART中的硬件流控CTS和RTS</title>
      <link>https://fan-pengfei.top/posts/uart%E4%B8%AD%E7%9A%84%E7%A1%AC%E4%BB%B6%E6%B5%81%E6%8E%A7cts%E5%92%8Crts/</link>
      <pubDate>Wed, 14 Sep 2022 07:01:32 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/uart%E4%B8%AD%E7%9A%84%E7%A1%AC%E4%BB%B6%E6%B5%81%E6%8E%A7cts%E5%92%8Crts/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;昨天花了一个USB转TTL小板子，其中芯片引脚有RT和CTS，之前从没用过，还是查找资料了解一下吧。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;RTS （Require ToSend，发送请求）为输出信号，用于指示本设备准备好可接收数据，低电平有效，低电平说明本设备可以接收数据。&lt;/p&gt;
&lt;p&gt;CTS （Clear ToSend，发送允许）为输入信号，用于判断是否可以向对方发送数据，低电平有效，低电平说明本设备可以向对方发送数据。&lt;/p&gt;</description>
    </item>
    <item>
      <title>markdown编辑数学公式</title>
      <link>https://fan-pengfei.top/posts/markdown%E7%BC%96%E8%BE%91%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F/</link>
      <pubDate>Tue, 16 Aug 2022 08:41:33 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/markdown%E7%BC%96%E8%BE%91%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;用Markdown编辑数学公式看起来会很舒服，学一下；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;希腊字母&#34;&gt;希腊字母：&lt;/h2&gt;
&lt;h3 id=&#34;常见希腊字母&#34;&gt;常见希腊字母：&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/markdown%E7%BC%96%E8%BE%91%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F/img-1.jpg&#34;&gt;&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$\alpha$、$\beta$、$\chi$、$\Delta$、$\Gamma$、$\Theta$
&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;\alpha\beta\chi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;显示效果为：&lt;/p&gt;
&lt;p&gt;\alpha\beta\chi\Delta\Gamma\Theta&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注：当希腊字母的LaTex语法首字母大写时，即输出大写的希腊字母；首字母小写时，输出小写的希腊字母。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;数学结构&#34;&gt;数学结构：&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/markdown%E7%BC%96%E8%BE%91%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F/img-2.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;分数&#34;&gt;分数：&lt;/h3&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$\frac{abc}{xyz}$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;显示效果为：&lt;/p&gt;
&lt;p&gt;\frac{abc}{xyz}&lt;/p&gt;
&lt;h3 id=&#34;根号&#34;&gt;根号：&lt;/h3&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-plaintext&#34; data-lang=&#34;plaintext&#34;&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;\frac{\sqrt{1+abc}}{\sqrt{1-abc}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;显示效果为：&lt;/p&gt;
&lt;p&gt;\frac{\sqrt{1+abc}}{\sqrt{1-abc}}&lt;/p&gt;
&lt;h3 id=&#34;向量符号&#34;&gt;向量符号：&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/markdown%E7%BC%96%E8%BE%91%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F/img-3.png&#34;&gt;&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$\overrightarrow{F}$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;显示效果为：&lt;/p&gt;
&lt;p&gt;\overrightarrow{F}&lt;/p&gt;
&lt;h2 id=&#34;定界符&#34;&gt;定界符：&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/markdown%E7%BC%96%E8%BE%91%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F/img-4.png&#34;&gt;&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$|$、$\|$、$\Uparrow$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;显示效果为：&lt;/p&gt;
&lt;p&gt;|、|、\Uparrow&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注：将上述定界符与&lt;code&gt;\left&lt;/code&gt;和&lt;code&gt;right&lt;/code&gt;组合使用可以使得定界符匹配其内容的高度。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;比如要构建一个如下的矩阵的行列式。&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-plaintext&#34; data-lang=&#34;plaintext&#34;&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;\left|\begin{matrix}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   1 &amp;amp; 2 &amp;amp; 3 \\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   4 &amp;amp; 5 &amp;amp; 6 \\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   7 &amp;amp; 8 &amp;amp; 9
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  \end{matrix} \right|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;显示效果如下：&lt;/p&gt;
&lt;p&gt;\left|\begin{matrix}
1 &amp;amp; 2 &amp;amp; 3 \
4 &amp;amp; 5 &amp;amp; 6 \
7 &amp;amp; 8 &amp;amp; 9
\end{matrix} \right|&lt;/p&gt;</description>
    </item>
    <item>
      <title>刷题中碰到的知识点</title>
      <link>https://fan-pengfei.top/posts/%E5%88%B7%E9%A2%98%E4%B8%AD%E7%A2%B0%E5%88%B0%E7%9A%84%E7%9F%A5%E8%AF%86%E7%82%B9/</link>
      <pubDate>Mon, 08 Aug 2022 12:04:55 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%88%B7%E9%A2%98%E4%B8%AD%E7%A2%B0%E5%88%B0%E7%9A%84%E7%9F%A5%E8%AF%86%E7%82%B9/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;记录一下刷题中遇到的知识点；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;1断言assert&#34;&gt;1、(断言)assert&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;在程序设计中，断言（assertion）是一种放在程序中的一阶逻辑（如一个结果为真或是假的逻辑判断式），目的是为了标示与验证程序开发者预期的结果－当程序执行到断言的位置时，对应的断言应该为真。若断言不为真时，程序会中止执行，并给出错误消息。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>XOR用法</title>
      <link>https://fan-pengfei.top/posts/xor%E7%94%A8%E6%B3%95/</link>
      <pubDate>Mon, 08 Aug 2022 09:08:09 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/xor%E7%94%A8%E6%B3%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;异或的常见用法；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;xor用法&#34;&gt;XOR用法&lt;/h1&gt;
&lt;h2 id=&#34;一运算真值表&#34;&gt;一、运算真值表：&lt;/h2&gt;
&lt;blockquote&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;二运算定理&#34;&gt;二、运算定理：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一个值与自身的运算，总是为 false。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一个值与 0 的运算，总是等于其本身。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可交换性&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;结合性&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;z&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;z&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;三应用&#34;&gt;三、应用：&lt;/h2&gt;
&lt;h3 id=&#34;1简化运算&#34;&gt;1、简化运算；&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;多个值的异或运算，可以根据运算定律进行简化。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;b&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;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;c&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;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;c&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;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;2交换值&#34;&gt;2、交换值；&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;两个变量连续进行三次异或运算，可以互相交换值。
假设两个变量是&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;，各自的值是&lt;code&gt;a&lt;/code&gt;和&lt;code&gt;b&lt;/code&gt;。下面就是&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;进行三次异或运算，注释部分是每次运算后两个变量的值。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// (a ^ b, b)
&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:#a6e22e&#34;&gt;y&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// (a ^ b, a ^ b ^ b) =&amp;gt; (a ^ b, a)
&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:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// (a ^ b ^ a, a) =&amp;gt; (b, a)
&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;
&lt;h3 id=&#34;3加密&#34;&gt;3、加密；&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;异或运算可以用于加密。
第一步，明文（text）与密钥（key）进行异或运算，可以得到密文（cipherText）。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;text&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cipherText&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>
    <item>
      <title>如何做到有用的学习</title>
      <link>https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E5%81%9A%E5%88%B0%E6%9C%89%E7%94%A8%E7%9A%84%E5%AD%A6%E4%B9%A0/</link>
      <pubDate>Sun, 07 Aug 2022 08:25:05 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%A6%82%E4%BD%95%E5%81%9A%E5%88%B0%E6%9C%89%E7%94%A8%E7%9A%84%E5%AD%A6%E4%B9%A0/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;转自知乎，如何做到有用的学习；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;问题描述：为什么我的成绩那么好，最终还是成了一个没用的人？&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;作者：东坡夜奔  链接：&lt;a href=&#34;https://www.zhihu.com/question/30375123/answer/48170636&#34;&gt;https://www.zhihu.com/question/30375123/answer/48170636&lt;/a&gt;  来源：知乎  著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;基本问题&#34;&gt;基本问题：&lt;/h2&gt;
&lt;p&gt;说两个问题。一是&lt;strong&gt;知识空白&lt;/strong&gt;的问题。二是&lt;strong&gt;知识技能化&lt;/strong&gt;的问题。&lt;/p&gt;
&lt;h3 id=&#34;1知识空白&#34;&gt;1、知识空白&lt;/h3&gt;
&lt;p&gt;我们初高中（甚至大学）学到的知识，是教育部根据我国整体教育情况，考虑&lt;strong&gt;成本&lt;/strong&gt;和&lt;strong&gt;国家工业化的需求&lt;/strong&gt;，制定的一整套学习计划。&lt;/p&gt;
&lt;p&gt;说白了，目的很简单：就是用尽可能低的成本，培养出对于推进我国工业化和现代化足够多的&lt;strong&gt;人才。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对于每个人个人的具体情况，对于一个人的人格情感培养，对于毕业后在社会上的就业，对于一个人的自我实现，&lt;strong&gt;基本上都没有考虑。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;它是一个整体考量，不是个体考量。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以，你会有很多&lt;strong&gt;知识空白。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;很多对于你自己人生成长成才&lt;strong&gt;所必须的知识&lt;/strong&gt;，是&lt;strong&gt;空白的&lt;/strong&gt;，尤其对于出身小地方或者农村的孩子们，学校教育几乎是唯一接受教育的途径，这种情况就更加严重。&lt;/p&gt;
&lt;p&gt;情感教育，心理教育，人格教育，美学，人际交往知识，良好的生活习惯……&lt;/p&gt;
&lt;p&gt;都没有，都是空白。&lt;/p&gt;
&lt;p&gt;再加上城市与农村的差异带来的冲击，学校和社会的差异带来的冲击，面临这样的心理困境，是正常的，不必过于焦虑。——这些东西，我们的教育中也是空白。&lt;/p&gt;
&lt;p&gt;这些重要的东西，经济发达物质基础好，父母见识广的地方，可能可以通过家庭教育进行弥补（他们的问题本来就少），但鉴于目前的经济和教育水平，在我国绝大多数地区，都做不到。&lt;/p&gt;
&lt;p&gt;我大学之后陷入困境，某种程度上，就是因为这些缺失的知识。&lt;/p&gt;
&lt;p&gt;比如&lt;strong&gt;心理学&lt;/strong&gt;，比如&lt;strong&gt;思维科学&lt;/strong&gt;，最重要的两门课，如何保持心理康健，如何正确地进行思考，我们的学校教育中都是空白。&lt;/p&gt;
&lt;p&gt;随着经济的不断发展，随着整个社会对于个体的逐渐重视，这个情况会有所好转，但是，我们毕竟来不及了。&lt;/p&gt;
&lt;p&gt;所以延伸出来的，就是&lt;strong&gt;自我教育&lt;/strong&gt;的问题。&lt;/p&gt;
&lt;p&gt;好在你还年轻，会读书，会工作，会上网，会来知乎学习，&lt;strong&gt;会自我教育，就不算晚。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2013年11月3日，我在某笔记里写下一篇名为《五年多的成长》的日记，里面写到毕业后才意识到的，自己所面临的困惑。&lt;/p&gt;
&lt;p&gt;六种困惑，其实都是知识的空白而已。&lt;/p&gt;
&lt;p&gt;1、男女之惑——对于情感的知识&lt;/p&gt;
&lt;p&gt;2、心理之惑——心理学&lt;/p&gt;
&lt;p&gt;3、性格之惑——我是什么性格以及为什么是这个性格&lt;/p&gt;
&lt;p&gt;4、方法之惑——为什么一腔真心、无数努力却做不成事&lt;/p&gt;
&lt;p&gt;5、自我之惑——我是不是没有自我，为什么没有自我，如何建立自我&lt;/p&gt;
&lt;p&gt;6、方向之惑——未来要怎么走&lt;/p&gt;
&lt;p&gt;其实这些问题，通过心理学和思维科学的学习，在毕业之后的五年里，我基本都有了较为清晰的&lt;strong&gt;阶段性认识。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;问题是，在之前的22年里，我不知道这些知识。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自我教育，毕业之后的自我教育，才是人生成长的关键。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是对知识空白问题的解决。&lt;/p&gt;
&lt;h3 id=&#34;2知识技能化&#34;&gt;2、知识技能化&lt;/h3&gt;
&lt;p&gt;我们学校中学习的，都是知识，但对于个人来说，&lt;strong&gt;知识不转化为技能，就无用。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;知识当然是伟大的，那是人类百万年进化的结晶，但是，我们必须意识到，你的知识只有转化为技能，才拥有了价值。&lt;/p&gt;
&lt;p&gt;你的价值，附着于你的技能之上。&lt;/p&gt;
&lt;p&gt;你是律师，你要会打官司，能打赢官司，才能赚到钱，体现个人价值。&lt;/p&gt;
&lt;p&gt;你是医生，你要会治病，能治好病，才能赚到工资，体现个人价值。&lt;/p&gt;
&lt;p&gt;你是警察，你要会维持治安，打击犯罪，才能赚到工资，体现个人价值。&lt;/p&gt;
&lt;p&gt;……&lt;/p&gt;
&lt;p&gt;你说我有知识，但是我什么都不干，那就只好饿死，因为你没有&lt;strong&gt;通过技能体现出你的价值&lt;/strong&gt;来。&lt;/p&gt;
&lt;p&gt;当年明月研究了多年明史，如果他不写出《明朝那些事儿》，就无法证明自己的价值。——他把明史的知识&lt;strong&gt;技能化&lt;/strong&gt;了——转变成了一本书。&lt;/p&gt;
&lt;p&gt;郎朗学习了多年钢琴，如果他不去参加比赛获奖不去表演，就无法证明自己的价值。——他把钢琴弹奏&lt;strong&gt;技能化&lt;/strong&gt;了——转变为一首首曲子。&lt;/p&gt;
&lt;p&gt;你要&lt;strong&gt;把你学习到的知识转化为对这个社会有价值的技能&lt;/strong&gt;，这才有用。&lt;/p&gt;
&lt;p&gt;还是自己的例子，经过三年的锻炼，我基本上掌握了&lt;strong&gt;公文写作的技能&lt;/strong&gt;，所以现在很崩溃，写稿子写讲话稿写的脑子想炸了，但是我的知识（文字知识，政治知识，写作知识，专业知识，部门知识……）转化为了技能（公文写作）。&lt;/p&gt;
&lt;p&gt;所以，你就可以靠技能吃饭了，有了这个技能，虽然并不是多大的笔杆子，但毕竟有了自己的利用价值，所以领导对自己还不错，提拔的时候也会考虑，不至于让你做凉板凳坐很久。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;家有万贯不如一技傍身&lt;/strong&gt;，就是这个意思。&lt;/p&gt;
&lt;p&gt;你学了那么多知识，可否能够转化为某种对这个社会、对别人有价值的技能？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技能远大于知识。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;技能能吃饭，知识不行。&lt;/p&gt;
&lt;p&gt;技能能发家，知识不行。&lt;/p&gt;
&lt;p&gt;切记切记，要将知识转化为技能。&lt;/p&gt;
&lt;p&gt;比如：你看了那么多电影，一肚子电影的知识，可有没有想过写剧本？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;写剧本，就是技能。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;另：会考试也是一个技能啊，而且是很厉害的技能，一次没考上怕什么，多考几次就是了。&lt;/p&gt;
&lt;h2 id=&#34;延伸问题&#34;&gt;延伸问题：&lt;/h2&gt;
&lt;h3 id=&#34;技能的门槛&#34;&gt;技能的门槛。&lt;/h3&gt;
&lt;p&gt;你说我有技能啊，为什么还是没价值？&lt;/p&gt;
&lt;p&gt;可能是你自己的技能&lt;strong&gt;没有建立高门槛&lt;/strong&gt;，随便就被别人比下去了。&lt;/p&gt;
&lt;p&gt;这是个&lt;strong&gt;高度竞争&lt;/strong&gt;的社会。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二八法则。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所谓20%的人赚走80%的利润，就是因为人家建立了高门槛。&lt;/p&gt;
&lt;p&gt;1、&lt;strong&gt;高门槛不一定需要知识&lt;/strong&gt;，人家资本雄厚，同样是高门槛，人家脸皮够厚，同样是高门槛，知识只是一个参考因素。&lt;/p&gt;
&lt;p&gt;2、在知识—技能这个维度，建立高门槛需要&lt;strong&gt;精确定位市场、研究规律、不断实践、积累经验、建立细节体系&lt;/strong&gt;——建立你自己的高门槛，就能享受相对高的回报，因为你的价值也是相对高的。——这需要时间，需要思考，需要不断改进、需要耐心。&lt;/p&gt;
&lt;p&gt;3、&lt;strong&gt;耐心本身就是一个高门槛&lt;/strong&gt;，这个世界上，聪明人很多，耐心的人，却真的不多。&lt;/p&gt;
&lt;p&gt;4、知识很重要，要充分利用（别小看考试能力，你知道多少领导家孩子想要进公务员系统却考不进来吗？），尤其是当你只拥有知识的时候，但问题是，&lt;strong&gt;不要过于夸大知识的作用&lt;/strong&gt;，而且，你所拥有的知识，并不一定有价值。&lt;/p&gt;</description>
    </item>
    <item>
      <title>实习记录与总结</title>
      <link>https://fan-pengfei.top/posts/%E5%AE%9E%E4%B9%A0%E8%AE%B0%E5%BD%95%E4%B8%8E%E6%80%BB%E7%BB%93/</link>
      <pubDate>Sun, 07 Aug 2022 06:17:14 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%AE%9E%E4%B9%A0%E8%AE%B0%E5%BD%95%E4%B8%8E%E6%80%BB%E7%BB%93/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;到今天为止（2022\08\07），我的暑假实习就要接近尾声了，我想，记录一下我这一个多月的实习经历吧，毕竟这是自己的第一份正式工作；&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>谷歌发现的十条真理</title>
      <link>https://fan-pengfei.top/posts/%E8%B0%B7%E6%AD%8C%E5%8F%91%E7%8E%B0%E7%9A%84%E5%8D%81%E6%9D%A1%E7%9C%9F%E7%90%86/</link>
      <pubDate>Sat, 06 Aug 2022 07:06:15 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E8%B0%B7%E6%AD%8C%E5%8F%91%E7%8E%B0%E7%9A%84%E5%8D%81%E6%9D%A1%E7%9C%9F%E7%90%86/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Google的网站上有一个网页，叫做&lt;a href=&#34;https://www.google.com/corporate/tenthings.html&#34;&gt;“我们的哲学”&lt;/a&gt;（Our Philosophy），上面列出了十句话。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;1. 用户第一，然后其他事情就会发生。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（Focus on the user and all else will follow.）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;2. 最好的方法就是把一件事情做到非常、非常好。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（It’s best to do one thing really, really well.）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不要在乎自己现在的状况，如果你不断地正确地做一件事情，总有一天会有不一样的结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 快比慢好。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（Fast is better than slow.）
“我们也许是世界上唯一一家希望用户尽快离开自己网站的公司：最快地给出用户想要的结果，一个多余的字节也没有，并且还在致力于变得更快。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;4. 民主在网上很管用。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（Democracy on the web works.）
相信民主的人在互联网上能获得成功，相信管制和独裁的人在互联网上必将遭到失败。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;5. 要寻找答案，不一定需要办公桌。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（You don’t need to be at your desk to need an answer.）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;6. 不干坏事，也能挣到钱。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（You can make money without doing evil.）
当考验来临时，要将信念置于金钱之上。坚信人生中有比金钱和物质更重要的东西，更加坚信这样做的人最终会赢得信赖和回报。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;7. 未知的信息总是存在的。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（There’s always more information out there.）&lt;/p&gt;</description>
    </item>
    <item>
      <title>计算机基础补全计划</title>
      <link>https://fan-pengfei.top/posts/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80%E8%A1%A5%E5%85%A8%E8%AE%A1%E5%88%92/</link>
      <pubDate>Wed, 27 Jul 2022 14:02:56 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80%E8%A1%A5%E5%85%A8%E8%AE%A1%E5%88%92/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;自己虽然是写程序的，但是专业是自动化，毕竟不是计算机科班出身，还是要补一补计算机基础的；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;计算机基础：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;计算机组成原理；&lt;/strong&gt;
《深入理解计算机原理》&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;操作系统；&lt;/strong&gt;
《操作系统导论》&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;计算机网络；&lt;/strong&gt;
《计算机网络：自顶向下方法》&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据结构与算法；&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;编译原理；&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;学习过程记录&#34;&gt;学习过程记录：&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;先学习计算机网络，正好视频跟课本是配套的：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考B站视频，争取一个月内补全计算机网络相关的知识；&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;链接：&lt;a href=&#34;https://www.bilibili.com/video/BV1JV411t7ow?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=d3e0d33e56175cb1e5a020e1a154d370&#34;&gt;https://www.bilibili.com/video/BV1JV411t7ow?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=d3e0d33e56175cb1e5a020e1a154d370&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;到今天为止，把计算机网络的内容过了一遍，满打满算花了一个月吧，后续肯定还需要更多的时间去消化这些知识内容；&lt;/p&gt;
&lt;p&gt;后续看一下计算机系统整体相关的知识吧，大四这一年应该是难得的知识摄入的时间。&lt;/p&gt;</description>
    </item>
    <item>
      <title>我会成为自己所期望的那个工程师吗</title>
      <link>https://fan-pengfei.top/posts/%E6%88%91%E4%BC%9A%E6%88%90%E4%B8%BA%E8%87%AA%E5%B7%B1%E6%89%80%E6%9C%9F%E6%9C%9B%E7%9A%84%E9%82%A3%E4%B8%AA%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%90%97/</link>
      <pubDate>Sat, 23 Jul 2022 06:24:02 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E6%88%91%E4%BC%9A%E6%88%90%E4%B8%BA%E8%87%AA%E5%B7%B1%E6%89%80%E6%9C%9F%E6%9C%9B%E7%9A%84%E9%82%A3%E4%B8%AA%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%90%97/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;昨天收到了大疆的录用意向offer，很开心，从四月投递简历，到终面结束，再到昨天收到意向offer，自己花了很多的时间和精力去修改简历和准备面试，终于还是等到了；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;关于dji面试&#34;&gt;关于DJI面试&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;收到意向offer的时候，我正在海康的三楼餐厅吃饭，看到是深圳的电话，我就猜到是大疆的HR打来的；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;image-20220729154202060&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E4%BC%9A%E6%88%90%E4%B8%BA%E8%87%AA%E5%B7%B1%E6%89%80%E6%9C%9F%E6%9C%9B%E7%9A%84%E9%82%A3%E4%B8%AA%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%90%97/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;我很早就听说过大疆，那时候只是知道大疆是一家做无人机的公司，更多的就没有什么了解了；&lt;/p&gt;
&lt;p&gt;大二开学，我报名参加了我们学校的RoboMaster战队，在队内总共呆了一年，主要是负责哨兵机器人的嵌入式开发；说来惭愧，我并没有为我们队伍做出过什么大的贡献，自己也没有做什么创新性的东西，充其量我的表现是中规中矩，大多数时候都是在补充自己的知识储备，不过正是通过这个比赛我才更近距离地接触到大疆，也认识了挺多学长学姐，这对我的影响很大；&lt;/p&gt;
&lt;p&gt;在备赛过程中，我用过大疆的无刷电机，很强，功能很强，控制尤其方便，还勾起了我对无刷电机控制的兴趣，学了一点FOC，然后用开源的Simple FOC，做了一个简单的无刷电机驱动器，很有意思，在大疆的面试中，面试官问我：“你能不能说一个你用过的大疆的产品的一个缺点？”，我就提到了这件事，并说了一个我认为大疆的无刷电机所存在的缺点。&lt;/p&gt;
&lt;p&gt;我只去过一次比赛现场，感受过那种赛场的氛围，很难忘的经历，在面试中，面试官问了我一个问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“你对大疆印象最深的是什么？”
“我印象最深的就是是大疆的社会责任感，因为我去过比赛现场，所以我很感激大疆提供的这种难得的机会，对我这样的人来说，这是很难忘也很难得的机会；”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不知道面试官对我的回答是否满意，但这的确是我心里的想法；&lt;/p&gt;
&lt;p&gt;我想，今天这个日子，几年或者更久的时间后，再回头来看，可能会说今天是一个十分重要的日子；&lt;/p&gt;
&lt;p&gt;4月25日，我投出了我的简历；然后按部就班，面试面试还是面试，一共三轮面试，最后就是等offer；&lt;/p&gt;
&lt;p&gt;在准备面试中，花了很多精力，学了好多东西，实时操作系统的知识还有C语言和ARM内核相关的知识，也把自己做过的项目，参加过的比赛都捋了好多遍，生怕面试官问到这方面的内容，自己却答不上来；&lt;/p&gt;
&lt;p&gt;这是我第一次投简历和面试，之前听说找工作时永远不要将自己最想去的公司放在第一个，因为第一次总是没有经验，总会紧张。所以如果第一次就要投最想去的公司，那就要认真准备了；&lt;/p&gt;
&lt;p&gt;准备面试的那几个星期我记了好多笔记，梳理了知识点，理通了自己做过的所有的项目还考虑了面试官可能问到的各种问题，记了几万字的笔记；&lt;/p&gt;
&lt;p&gt;我还记得那个下午，我在自习室坐了一天，把FreeRTOS的相关知识从头到尾梳理了一遍；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;52d913c451869c28fbf9d526b1ff5ab&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E4%BC%9A%E6%88%90%E4%B8%BA%E8%87%AA%E5%B7%B1%E6%89%80%E6%9C%9F%E6%9C%9B%E7%9A%84%E9%82%A3%E4%B8%AA%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%90%97/img-2.png&#34;&gt;
&lt;img alt=&#34;9a4943faae6f7706365b1445cd0b9cf&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E4%BC%9A%E6%88%90%E4%B8%BA%E8%87%AA%E5%B7%B1%E6%89%80%E6%9C%9F%E6%9C%9B%E7%9A%84%E9%82%A3%E4%B8%AA%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%90%97/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;准备的越多，自己就越有底气；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;虽然面试中并没有问到很多自己准备的问题，但是准备的过程还是很大程度上减弱了自己的紧张；&lt;/p&gt;
&lt;p&gt;虽然付出并不总是有收获的；&lt;/p&gt;
&lt;p&gt;但是想到自己经常熬夜去解决一个又一个Bug，熬夜画一个又一个板子，自己乐在其中，享受做东西的快乐；&lt;/p&gt;
&lt;h2 id=&#34;关于我的愿望&#34;&gt;关于我的愿望&lt;/h2&gt;
&lt;p&gt;我QQ签名是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;立志成为一名嵌入式开发攻城狮！&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;是的，成为一名工程师是我一直以来的愿望；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;前些天我又看了一遍《三傻大闹宝莱坞》，每次看的感觉都不一样；&lt;/p&gt;
&lt;p&gt;第一次看这部电影是在我六年级的时候，那个时候觉得做一名工程师好酷，好像什么都能做出来，好像能解决遇到的一切问题，还有着不错的薪资；&lt;/p&gt;
&lt;p&gt;现在想来，梦想成为一名工程师的想法就是从那个时候开始的吧；&lt;/p&gt;
&lt;p&gt;兰彻，聪明，幽默，还有很多奇葩的想法，这部电影，让我觉得，做一名工程师会是多么有意思的事情呀；&lt;/p&gt;
&lt;p&gt;能用自己的知识解决遇到的各种问题，而且乐在其中；&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;路一步步走，越走就离自己最初的想法越近；&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;最后我想说&#34;&gt;最后我想说&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;我想，我会成为自己想成为的那个工程师，掌握很多技能，面对问题，自己总能想到办法；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我相信我会成为这样的人：聪明、乐观、幽默、不言放弃、坚信问题终会被解决；&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;正式offer2022年10月31号更新&#34;&gt;正式OFFER（2022年10月31号更新）&lt;/h2&gt;
&lt;p&gt;上周五中午接到电话，谈了薪水，晚上收到了正式OFFER，然后沟通了三方，尘埃落定；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image-20221031195615496&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E4%BC%9A%E6%88%90%E4%B8%BA%E8%87%AA%E5%B7%B1%E6%89%80%E6%9C%9F%E6%9C%9B%E7%9A%84%E9%82%A3%E4%B8%AA%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%90%97/img-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;说真的，大疆开的是真的高，福利也不错，我是非常满意了，所以就决定去了。&lt;/p&gt;
&lt;p&gt;下面整理一下整个流程，也许可以帮助到后面的人：&lt;/p&gt;
&lt;p&gt;事件
日期&lt;/p&gt;
&lt;p&gt;投递简历
4月25日&lt;/p&gt;
&lt;p&gt;性格测评
4月27日&lt;/p&gt;
&lt;p&gt;第一次面试
5月3日&lt;/p&gt;
&lt;p&gt;第二次面试
5月13日&lt;/p&gt;
&lt;p&gt;第三次面试
5月20日&lt;/p&gt;
&lt;p&gt;电话OC
7月22日&lt;/p&gt;
&lt;p&gt;收到录用意向书
7月22日&lt;/p&gt;
&lt;p&gt;谈薪电话
10月27日&lt;/p&gt;
&lt;p&gt;收到正式OFFER
10月27日&lt;/p&gt;
&lt;p&gt;沟通三方信息
10月28日&lt;/p&gt;</description>
    </item>
    <item>
      <title>BIN、HEX、AXF和ELF的区别</title>
      <link>https://fan-pengfei.top/posts/binhexaxf%E5%92%8Celf%E7%9A%84%E5%8C%BA%E5%88%AB/</link>
      <pubDate>Thu, 21 Jul 2022 06:00:53 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/binhexaxf%E5%92%8Celf%E7%9A%84%E5%8C%BA%E5%88%AB/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;几种常见格式的区别；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一bin文件&#34;&gt;一、bin文件&lt;/h2&gt;
&lt;p&gt;Bin文件是最纯粹的二进制机器代码, 或者说是”顺序格式”。按照assembly code顺序翻译成binary machine  code，内部没有地址标记。&lt;strong&gt;Bin是直接的内存映象表示&lt;/strong&gt;，二进制文件大小即为文件所包含的数据的实际大小。&lt;/p&gt;
&lt;p&gt;BIN文件就是直接的二进制文件，一般用编程器烧写时从地址0x00开始，而如果下载运行，则下载到编译时的地址即可。&lt;strong&gt;可以直接在裸机上运行。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;二hex文件&#34;&gt;二、hex文件&lt;/h2&gt;
&lt;p&gt;Intel hex 文件常用来保存单片机或其他处理器的目标程序代码。它保存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。 就是机器代码的十六进制形式,并且是用一定文件格式的ASCII码来表示。&lt;/p&gt;
&lt;p&gt;HEX文件由记录（RECORD）组成。在HEX文件里面，每一行代表一个记录。每条记录都由一个冒号“:”打头，其格式如下：&lt;/p&gt;
&lt;h3 id=&#34;文件格式&#34;&gt;文件格式：&lt;/h3&gt;
&lt;p&gt;:BBAAAATTHHHH…HHHHCC　&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;含义分别如下：&lt;/strong&gt;　&lt;/p&gt;
&lt;p&gt;BB：字节个数；
AAAA：数据记录的开始地址，高位在前，低位在后；
TT: Type ；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Type：
00数据记录，用来记录数据；01记录结束，放在文件末尾，用来标识文件结束；02用来标识扩展段地址的记录；04扩展地址记录(表示32位地址的前缀)；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;HHHH：一个字(Word)的数据记录,高字节在前,低字节在后；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TT之后共有 BB/2 个字的数据 。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CC: 占据一个Byte的CheckSum；&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;举例：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每行中的数据并不是一定有的，第二个字节数据长度为0，那么这行就没有数据。&lt;/p&gt;
&lt;p&gt;由于每行标识数据地址的只有2Byte，所以最大只能到64K，为了可以保存高地址的数据，就有了Extended Linear Address Record。如果这行的数据类型是0x04，那么，这行的数据就是随后数据的基地址。例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;:020000040004F6
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D
:00000001FF&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;第一行，是Extended Linear Address Record，里面的数据，也就是基地址是0x0004；&lt;/p&gt;
&lt;p&gt;第二行是Data  Record，里面的地址值是0x0000。那么数据18F09FE518F09FE518F09FE518F09FE5要写入FLASH中的地址为  &lt;strong&gt;(0x0004 &amp;laquo; 16) |  0x0000&lt;/strong&gt;，也就是写入FLASH的0x40000这个地址。&lt;/p&gt;
&lt;p&gt;同样，第三行的数据的写入地址为0x40010。当一个HEX文件的数据超过64k的时候，文件中就会出现多个Extended Linear Address Record。&lt;/p&gt;
&lt;p&gt;校验值：每一行的最后一个值为此行数据的校验和。例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;:1000000018F09FE518F09FE518F09FE518F09FE5C0 这行中的 0xC0；
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D 这行中的 0x1D；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;校验和的算法为：计算从0x3A 以后（不包括0x3A）的所有各字节的和模256的余。即各字节二进制算术和，不计超过256的溢出值，然后用0x100减去这个算数累加和，得出得值就是此行得校验和。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如手头的STM32 HEX 第一行 020000040800F2；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;End of File Record 行是每一个HEX文件的最后一行。例如：&lt;/p&gt;</description>
    </item>
    <item>
      <title>力扣刷题记录</title>
      <link>https://fan-pengfei.top/posts/%E5%8A%9B%E6%89%A3%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Sun, 17 Jul 2022 15:20:23 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%8A%9B%E6%89%A3%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;记录自己刷算法题中遇到的问题和自己的思路；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;1无重复长度的最长子串&#34;&gt;1、无重复长度的最长子串：&lt;/h3&gt;
&lt;h4 id=&#34;题目描述&#34;&gt;题目描述：&lt;/h4&gt;
&lt;p&gt;&lt;img alt=&#34;bba26f3a71a90a406c18dc5f4fbb88e&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%8A%9B%E6%89%A3%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/img-1.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;提示：
&lt;code&gt;0 &amp;lt;= s.length &amp;lt;= 5 * 104； &lt;/code&gt;s` 由英文字母、数字、符号和空格组成；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;思路&#34;&gt;思路：&lt;/h4&gt;
&lt;p&gt;就是做两个标志位，表示当前字符串的起始位置和正在比较的字符位置；&lt;/p&gt;
&lt;p&gt;遍历整个字符串；&lt;/p&gt;
&lt;p&gt;从起始标志位开始，到结束位置，依次比对是否有重复字符；&lt;/p&gt;
&lt;p&gt;如果无，就结束位置加加；&lt;/p&gt;
&lt;p&gt;如果有，就计算长度，并移动起始位置到重复字符的下一个位置；&lt;/p&gt;
&lt;p&gt;然后一直循环；&lt;/p&gt;
&lt;p&gt;要特别考虑：&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;au
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;abb
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bba
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这些特殊排序的字符串；&lt;/p&gt;
&lt;p&gt;是因为最后一个没有办法比较；&lt;/p&gt;
&lt;h4 id=&#34;题解代码&#34;&gt;题解代码：&lt;/h4&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lengthOfLongestSubstring&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;s)
&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;int&lt;/span&gt; str_length &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;strlen&lt;/span&gt;(s);
&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;int&lt;/span&gt; end_flag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, start_flag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, max_length &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;char&lt;/span&gt; flag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;int&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;if&lt;/span&gt; (str_length &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(s &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; end_flag) &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\0&amp;#39;&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:#66d9ef&#34;&gt;for&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; start_flag; i  max_length)
&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;                    max_length &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; end_flag &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; start_flag;
&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;                flag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;break&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:#66d9ef&#34;&gt;if&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; str_length &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#66d9ef&#34;&gt;if&lt;/span&gt; ((&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(s &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; end_flag &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\0&amp;#39;&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:#66d9ef&#34;&gt;if&lt;/span&gt; (end_flag &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; start_flag &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; max_length)
&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;                        max_length &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; end_flag &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; start_flag &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (flag &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;            flag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            start_flag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#66d9ef&#34;&gt;else&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;            end_flag&lt;span style=&#34;color:#f92672&#34;&gt;++&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&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; max_length;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;改进&#34;&gt;改进：&lt;/h4&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//方法2
&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;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lengthOfLongestSubstring&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; s){
&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;int&lt;/span&gt; str_length&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;strlen&lt;/span&gt;(s);
&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;int&lt;/span&gt; end_flag&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,start_flag&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,max_length&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;char&lt;/span&gt; flag&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;int&lt;/span&gt; i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;if&lt;/span&gt;(str_length&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(s&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;end_flag)&lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\0&amp;#39;&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:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;start_flag;imax_length)
&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;                 max_length&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;end_flag&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;start_flag;
&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;            flag&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            start_flag&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#66d9ef&#34;&gt;else&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:#66d9ef&#34;&gt;if&lt;/span&gt;(end_flag&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;start_flag&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;max_length)
&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;                 max_length&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;end_flag&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;start_flag&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;            end_flag&lt;span style=&#34;color:#f92672&#34;&gt;++&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&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; max_length;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;2括号匹配&#34;&gt;2、括号匹配&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;test&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%8A%9B%E6%89%A3%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/img-2.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>malloc和free的用法</title>
      <link>https://fan-pengfei.top/posts/malloc%E5%92%8Cfree%E7%9A%84%E7%94%A8%E6%B3%95/</link>
      <pubDate>Sat, 16 Jul 2022 06:48:25 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/malloc%E5%92%8Cfree%E7%9A%84%E7%94%A8%E6%B3%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;在C语言中，内存管理是很重要的，最近刷算法题目也用到了malloc和free函数，在此记录一下；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一函数原型及说明&#34;&gt;一、函数原型及说明：&lt;/h2&gt;
&lt;h3 id=&#34;malloc&#34;&gt;malloc()：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;函数原型：&lt;/strong&gt;&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; NumBytes);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;该函数分配了NumBytes个字节，并返回了指向这块内存的指针。如果分配失败，则返回一个空指针（NULL）。
关于分配失败的原因，应该有多种，比如说空间不足就是一种。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;free&#34;&gt;free()：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;函数原型：&lt;/strong&gt;&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;free&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;FirstByte);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;该函数是将之前用malloc分配的空间还给程序或者是操作系统，也就是释放了这块内存，让它重新得到自由。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;二函数使用注意事项&#34;&gt;二、函数使用注意事项：&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1、申请了内存空间后，必须检查是否分配成功；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2、当不需要再使用申请的内存时，记得释放；&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;释放后应该把指向这块内存的指针指向NULL，防止程序后面不小心使用了它。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;3、这两个函数应该是配对使用；&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果申请后不释放就是内存泄露；如果无故释放那就是什么也没有做。释放只能一次，如果释放两次及两次以上会出现错误（释放空指针例外，释放空指针其实也等于啥也没做，所以释放空指针释放多少次都没有问题）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;**4、虽然malloc()函数的类型是(void &lt;em&gt;)，任何类型的指针都可以转换成(void &lt;em&gt;)，但是最好还是在前面进行强制类型转换，因为这样可以躲过一些编译器的检查；&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;三具体例子&#34;&gt;三、具体例子：&lt;/h2&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Code...
&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;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;Ptr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ptr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#a6e22e&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&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;if&lt;/span&gt; (NULL &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; Ptr)
&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:#a6e22e&#34;&gt;exit&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#a6e22e&#34;&gt;gets&lt;/span&gt;(Ptr);
&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;// code...
&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:#a6e22e&#34;&gt;free&lt;/span&gt;(Ptr);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ptr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;
&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;// code...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;四原理部分&#34;&gt;四、原理部分：&lt;/h2&gt;
&lt;h3 id=&#34;1malloc内存空间的来源&#34;&gt;1、malloc内存空间的来源：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;答案是从堆里面获得空间。
也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时，就会遍历该链表，然后就寻找第一个空间大于所申请空间的堆结点，然后就将该结点从空闲结点链表中删除，并将该结点的空间分配给程序。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;在使用malloc()分配内存空间后，一定要记得释放内存空间，否则就会出现内存泄漏。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;2free释放了什么&#34;&gt;2、free释放了什么：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;free()释放的是指针指向的内存。
注意！释放的是内存，不是指针！指针并没有被释放，指针仍然指向原来的存储空间。指针是一个变量，只有程序结束时才被销毁。释放了内存空间后，原来指向这块空间的指针还是存在！只不过现在指针指向的内容的垃圾，是未定义的，所以说是垃圾。因此，释放内存后把指针指向NULL，防止指针在后面不小心又被解引用了。
free() 不会改变 指针变量本身的值，调用 free() 后它仍然会指向相同的内存空间，但是此时该内存已无效，不能被使用。所以建议将 指针的值设置为 NULL，例如：&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;free&lt;/span&gt;(ptr);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ptr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;free()的源代码：&lt;/strong&gt;&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; mem_control_block {
&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;int&lt;/span&gt; is_available;    &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;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; size;            &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;};
&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;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;free&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ptr)
&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;struct&lt;/span&gt; mem_control_block &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;free;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    free &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ptr &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; mem_control_block);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    free&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;is_available &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;return&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;五直接定义一个数组和使用malloc动态分配的区别&#34;&gt;五、直接定义一个数组和使用malloc动态分配的区别：&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;malloc作为一个包含在头文件下的函数，用于申请空间。&lt;/p&gt;</description>
    </item>
    <item>
      <title>比较好的知识网站记录</title>
      <link>https://fan-pengfei.top/posts/%E6%AF%94%E8%BE%83%E5%A5%BD%E7%9A%84%E7%9F%A5%E8%AF%86%E7%BD%91%E7%AB%99%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Wed, 13 Jul 2022 14:52:14 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E6%AF%94%E8%BE%83%E5%A5%BD%E7%9A%84%E7%9F%A5%E8%AF%86%E7%BD%91%E7%AB%99%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;一些比较好的网站的集锦；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;1阮一峰的网络日志&#34;&gt;1、阮一峰的网络日志：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ruanyifeng.com/blog/2015/02/make.html&#34;&gt;Make 命令教程&lt;/a&gt;
主要是关于Makefile的简单教程，看了之后基本能够完成一个比较完备的Makefile；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这是我自己总结的例子：&lt;a href=&#34;https://www.fan-pengfei.top/2022/07/07/%E7%AE%80%E5%8D%95Makefile/#more&#34;&gt;Makefile基本示例&lt;/a&gt;；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;跟我一起写Makefile教程：&lt;a href=&#34;https://seisman.github.io/how-to-write-makefile/&#34;&gt;跟我一起写Makefile&lt;/a&gt;；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网站上还有不少比较好的教程和博客：&lt;a href=&#34;https://www.ruanyifeng.com/&#34;&gt;网站首页&lt;/a&gt;；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2bash脚本教程&#34;&gt;2、Bash脚本教程：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wangdoc.com/bash/expansion.html&#34;&gt;阮一峰的Bash脚本教程&lt;/a&gt;；&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3c语言入门教程&#34;&gt;3、C语言入门教程：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wangdoc.com/clang/intro.html&#34;&gt;阮一峰的C语言入门教程&lt;/a&gt;；&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>GCC常见命令及用法</title>
      <link>https://fan-pengfei.top/posts/gcc%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E5%8F%8A%E7%94%A8%E6%B3%95/</link>
      <pubDate>Sat, 09 Jul 2022 13:52:33 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/gcc%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E5%8F%8A%E7%94%A8%E6%B3%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;GCC工具介绍以及常见的用法；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;gcc编译命令&#34;&gt;GCC编译命令：&lt;/h1&gt;
&lt;h2 id=&#34;1-gcc工具&#34;&gt;1. GCC工具&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;GCC编译器：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GCC（GNU Compiler Collection）是由 GNU 开发的编程语言编译器。 GCC最初代表“GNU C Compiler”，当时只支持C语言。 后来又扩展能够支持更多编程语言，包括 C++、Fortran 和 Java 等。 因此，GCC也被重新定义为“GNU Compiler Collection”，成为历史上最优秀的编译器， 其执行效率与一般的编译器相比平均效率要高 20%~30%。&lt;/p&gt;
&lt;p&gt;GCC的官网地址为：&lt;a href=&#34;https://link.zhihu.com/?target=https%3A//gcc.gnu.org/&#34;&gt;https://gcc.gnu.org/&lt;/a&gt;，在Ubuntu系统下系统默认已经安装好GCC编译器，可以通过如下命令查看Ubuntu系统中GCC编译器的版本及安装路径：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/gcc%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E5%8F%8A%E7%94%A8%E6%B3%95/img-1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GCC编译工具链：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GCC编译工具链（toolchain），是指以GCC编译器为核心的一整套工具。它主要包含以下三部分内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;gcc-core：即GCC编译器，用于完成预处理和编译过程，把C代码转换成汇编代码。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Binutils ：除GCC编译器外的一系列小工具包括了链接器ld，汇编器as、目标文件格式查看器readelf等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;glibc：包含了主要的 C语言标准函数库，C语言中常常使用的打印函数printf、malloc函数就在glibc 库中。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在很多场合下会直接用GCC编译器来指代整套GCC编译工具链。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Binutils工具集：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Binutils（bin utility），是GNU二进制工具集，通常跟GCC编译器一起打包安装到系统，它的官方说明网站地址为： &lt;a href=&#34;https://link.zhihu.com/?target=https%3A//www.gnu.org/software/binutils/&#34;&gt;https://www.gnu.org/software/binutils/&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;在进行程序开发的时候通常不会直接调用这些工具，而是在使用GCC编译指令的时候由GCC编译器间接调用。下面是其中一些常用的工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;as：汇编器，把汇编语言代码转换为机器码（目标文件）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ld：链接器，把编译生成的多个目标文件组织成最终的可执行程序文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;readelf：可用于查看目标文件或可执行程序文件的信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nm ： 可用于查看目标文件中出现的符号。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;objcopy： 可用于目标文件格式转换，如.bin 转换成 .elf 、.elf 转换成 .bin等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;objdump：可用于查看目标文件的信息，最主要的作用是反汇编。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;size：可用于查看目标文件不同部分的尺寸和总尺寸，例如代码段大小、数据段大小、使用的静态内存、总大小等。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;系统默认的Binutils工具集位于/usr/bin目录下，可使用如下命令查看系统中存在的Binutils工具集：&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-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 在Ubantu上执行如下命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls /usr/bin/ | grep linux-gnu-
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/gcc%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E5%8F%8A%E7%94%A8%E6%B3%95/img-2.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;glibc库：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;glibc库是GNU组织为GNU系统以及Linux系统编写的C语言标准库，因为绝大部分C程序都依赖该函数库，该文件甚至会直接影响到系统的正常运行，例如常用的文件操作函数read、write、open，打印函数printf、动态内存申请函数malloc等。&lt;/p&gt;
&lt;p&gt;在Ubuntu系统下，libc.so.6是glibc的库文件，可直接执行该库文件查看版本，在主机上执行如下命令：&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-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 在Ubantu上执行如下命令&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;# 以下是Ubuntu 64位机的glibc库文件路径，可直接执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/lib/x86_64-linux-gnu/libc.so.6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/gcc%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E5%8F%8A%E7%94%A8%E6%B3%95/img-3.jpg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>算数式计算</title>
      <link>https://fan-pengfei.top/posts/%E7%AE%97%E6%95%B0%E5%BC%8F%E8%AE%A1%E7%AE%97/</link>
      <pubDate>Fri, 08 Jul 2022 15:36:23 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E7%AE%97%E6%95%B0%E5%BC%8F%E8%AE%A1%E7%AE%97/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;字符串算式先转为逆波兰式(后缀表达式)，然后计算；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一求逆波兰表达式&#34;&gt;一、求逆波兰表达式&lt;/h2&gt;
&lt;h3 id=&#34;核心思想&#34;&gt;核心思想：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;逆波兰算法的核心思想是将普通的中缀表达式转换为后缀表达式。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;**什么是中缀表达式？**例如a+b，运算符在两个操作数的中间。这是我们从小学开始学习数学就一直使用的表达式形式。
**什么是后缀表达式？**例如a b + ，运算符在两个操作数的后面。后缀表达式虽然看起来奇怪，不利于人阅读，但利于计算机处理。
&lt;strong&gt;转换为后缀表达式的好处是：&lt;/strong&gt;
去除原来表达式中的括号，因为括号只指示运算顺序，不是实际参与计算的元素。
使得运算顺序有规律可寻，计算机能编写出代码完成计算。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;核心步骤&#34;&gt;核心步骤：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;逆波兰算法的核心步骤就2个：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;将中缀表达式转换为后缀表达式，例如输入的原始表达式是 3*(5+7) ，转换得到 3 5 7 + *
根据后缀表达式，按照特定的计算规则得到最终计算结果&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;具体步骤&#34;&gt;具体步骤：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;中缀表达式转换为后缀表达式：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;你需要设定一个栈SOP,和一个线性表 L 。SOP用于临时存储运算符和左括号分界符( ，L用于存储后缀表达式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;遍历原始表达式中的每一个表达式元素：
如果是操作数，则直接追加到 L中。只有 运算符 或者 分界符（ 才可以存放到 栈SOP中；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果是分界符：
如果是左括号 ( ， 则 直接压入SOP，等待下一个最近的 右括号 与之配对。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果是右括号 ) ，则说明有一对括号已经配对(在表达式输入无误的情况下)。不将它压栈，丢弃它，然后从SOP中出栈，得到元素e，将e依次追加到L里。一直循环，直到出栈元素e 是 左括号 ( ，同样丢弃他。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果是运算符（用op1表示）：
如果SOP栈顶元素（用op2表示） 不是运算符，则二者没有可比性，则直接将此运算符op1压栈。 例如栈顶是左括号 ( ，或者栈为空。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果SOP栈顶元素（用op2表示） 是运算符 ，则比较op1和 op2的优先级。如果op1 &amp;gt; op2 ，则直接将此运算符op1压栈。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果不满足op1 &amp;gt; op2，则将op2出栈，并追加到L，再试图将op1压栈，如果如果依然不满足 op1&amp;gt;新的栈顶op2，继续将新的op2弹出追加到L ，直到op1可以压入栈中为止。&lt;/p&gt;</description>
    </item>
    <item>
      <title>简单Makefile</title>
      <link>https://fan-pengfei.top/posts/%E7%AE%80%E5%8D%95makefile/</link>
      <pubDate>Thu, 07 Jul 2022 14:12:55 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E7%AE%80%E5%8D%95makefile/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;一个简单的Makefile，可以直接Copy使用；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;一用字符常量简化&#34;&gt;一、用字符常量简化&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Makefile文件：&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;objects &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;main.o fun1.o &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;cc&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;gcc    &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;prom&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;main &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;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;prom: &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objects&lt;span style=&#34;color:#66d9ef&#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;$(&lt;/span&gt;cc&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objects&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -o &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;prom&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;main.o: main.c fun1.h
&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;$(&lt;/span&gt;cc&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -c main.c -o main.o
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		@echo 正在编译main文件 &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;fun1.o: fun1.c fun1.h
&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;$(&lt;/span&gt;cc&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -c fun1.c -o fun1.o
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		@echo 正在编译其他文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.PHONY: clean
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clean:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		-rm &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;prom&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objects&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文件夹结构：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;d41af99c56828f3430586aacbec9b96&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E7%AE%80%E5%8D%95makefile/img-1.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;二更简化的写法&#34;&gt;二、更简化的写法&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Makefile文件：&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;obj&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;main.o fun1.o
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cc&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;gcc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;prom&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deps&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;fun1.h
&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;$(&lt;/span&gt;prom&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;:&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;obj&lt;span style=&#34;color:#66d9ef&#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;$(&lt;/span&gt;cc&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -o &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;prom&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;obj&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;%.o:%.c &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;deps&lt;span style=&#34;color:#66d9ef&#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;$(&lt;/span&gt;cc&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -c $&amp;lt; -o $@
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;在这里，我们用到了几个特殊的宏。首先是 &lt;code&gt;%.o:%.c&lt;/code&gt;，这是一个模式规则，表示所有的 .o 目标都依赖于与它同名的 .c 文件（当然还有 deps 中列出的头文件）。再来就是命令部分的 &lt;code&gt;$&amp;lt;&lt;/code&gt; 和 &lt;code&gt;$@&lt;/code&gt;，其中 &lt;code&gt;$&amp;lt;&lt;/code&gt; 代表的是依赖关系表中的第一项（如果我们想引用的是整个关系表，那么就应该使用 &lt;code&gt;$^&lt;/code&gt;），具体到我们这里就是 %.c。
而 &lt;code&gt;$@&lt;/code&gt; 代表的是当前语句的目标，即 %.o。这样一来，make 命令就会自动将所有的 .c 源文件编译成同名的 .o 文件。不用我们一项一项去指定了。整个代码自然简洁了许多。&lt;/p&gt;</description>
    </item>
    <item>
      <title>基本的正则表达式</title>
      <link>https://fan-pengfei.top/posts/%E5%9F%BA%E6%9C%AC%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/</link>
      <pubDate>Sun, 05 Jun 2022 11:28:34 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%9F%BA%E6%9C%AC%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;基本的正则表达式，记录一下，方便之后查询；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;基本的正则表达式&#34;&gt;基本的正则表达式：&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https%3A//regex101.com/r/DOc5Nu/1&#34;&gt;在线练习&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-基本匹配&#34;&gt;1. 基本匹配&lt;/h3&gt;
&lt;p&gt;正则表达式其实就是在执行搜索时的格式，它由一些字母和数字组合而成。 例如：一个正则表达式 &lt;code&gt;the&lt;/code&gt;，它表示一个规则：由字母&lt;code&gt;t&lt;/code&gt;开始，接着是&lt;code&gt;h&lt;/code&gt;，再接着是&lt;code&gt;e&lt;/code&gt;。&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;the&amp;#34; =&amp;gt; The fat cat sat on the mat.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正则表达式&lt;code&gt;123&lt;/code&gt;匹配字符串&lt;code&gt;123&lt;/code&gt;。它逐个字符的与输入的正则表达式做比较。&lt;/p&gt;
&lt;p&gt;正则表达式是大小写敏感的，所以&lt;code&gt;The&lt;/code&gt;不会匹配&lt;code&gt;the&lt;/code&gt;。&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;The&amp;#34; =&amp;gt; The fat cat sat on the mat.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-元字符&#34;&gt;2. 元字符&lt;/h3&gt;
&lt;p&gt;正则表达式主要依赖于元字符。 元字符不代表他们本身的字面意思，他们都有特殊的含义。一些元字符写在方括号中的时候有一些特殊的意思。以下是一些元字符的介绍：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;元字符描述&lt;/strong&gt;.句号匹配任意单个字符除了换行符。[ ]字符种类。匹配方括号内的任意字符。&lt;a href=&#34;#fn_&#34;&gt;&lt;/a&gt;否定的字符种类。匹配除了方括号里的任意字符&lt;em&gt;匹配&amp;gt;=0 个重复的在&lt;/em&gt;号之前的字符。+匹配&amp;gt;=1 个重复的+号前的字符。?标记?之前的字符为可选.{n,m}匹配 num 个大括号之间的字符 (n &amp;lt;= num &amp;lt;= m).(xyz)字符集，匹配与 xyz 完全相等的字符串.|或运算符，匹配符号前或后的字符.\转义字符,用于匹配一些保留的字符 &lt;code&gt;{ } . * + ? ^ $ \ |&lt;/code&gt;^从开始行开始匹配.$从末端开始匹配.&lt;/p&gt;
&lt;h4 id=&#34;21-点运算符-&#34;&gt;2.1 点运算符 .&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;.&lt;/code&gt;是元字符中最简单的例子。 &lt;code&gt;.&lt;/code&gt;匹配任意单个字符，但不匹配换行符。 例如，表达式&lt;code&gt;.ar&lt;/code&gt;匹配一个任意字符后面跟着是&lt;code&gt;a&lt;/code&gt;和&lt;code&gt;r&lt;/code&gt;的字符串。&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;.ar&amp;#34; =&amp;gt; The car parked in the garage.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;22-字符集&#34;&gt;2.2 字符集&lt;/h4&gt;
&lt;p&gt;字符集也叫做字符类。 方括号用来指定一个字符集。 在方括号中使用连字符来指定字符集的范围。 在方括号中的字符集不关心顺序。 例如，表达式&lt;code&gt;[Tt]he&lt;/code&gt; 匹配 &lt;code&gt;the&lt;/code&gt; 和 &lt;code&gt;The&lt;/code&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux_grep命令使用</title>
      <link>https://fan-pengfei.top/posts/linux_grep%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8/</link>
      <pubDate>Sun, 05 Jun 2022 07:40:21 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/linux_grep%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近在学Linux，发现grep命令很常用，所以记录一下，方便之后查询；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;grep命令常见用法&#34;&gt;grep命令常见用法&lt;/h3&gt;
&lt;h4 id=&#34;1字符串搜索&#34;&gt;1、字符串搜索：&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;在文件中搜索一个单词，命令会返回一个包含 “match_pattern” 的文本行：&lt;/strong&gt;&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep match_pattern file_name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;match_pattern&amp;#34;&lt;/span&gt; file_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;例子：
&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/linux_grep%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8/img-1.png&#34;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;2在多个文件中查找字符串&#34;&gt;2、在多个文件中查找字符串：&lt;/h4&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;match_pattern&amp;#34;&lt;/span&gt; file_1 file_2 file_3 ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;例子：
&lt;img alt=&#34;2&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/linux_grep%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8/img-2.png&#34;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;3输出除之外的所有行--v-选项&#34;&gt;3、输出除之外的所有行 -v 选项：&lt;/h4&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep -v &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;match_pattern&amp;#34;&lt;/span&gt; file_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;例子：
&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/linux_grep%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8/img-3.png&#34;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;4标记匹配颜色&#34;&gt;4、标记匹配颜色&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;—color=auto 选项：&lt;/strong&gt;&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;match_pattern&amp;#34;&lt;/span&gt; file_name --color&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;auto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;例子：
&lt;img alt=&#34;3&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/linux_grep%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8/img-4.png&#34;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;5使用正则表达式&#34;&gt;5、使用正则表达式：&lt;/h4&gt;
&lt;p&gt;使用正则表达式 &lt;strong&gt;-E&lt;/strong&gt; 选项：&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep -E &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[1-9]+&amp;#34;&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;# 或&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;egrep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[1-9]+&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用正则表达式 &lt;strong&gt;-P&lt;/strong&gt; 选项：&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep -P &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;(\d{3}\-){2}\d{4}&amp;#34;&lt;/span&gt; file_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;只输出文件中匹配到的部分 &lt;strong&gt;-o&lt;/strong&gt; 选项：&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo this is a test line. | grep -o -E &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[a-z]+\.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;line.
&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;echo this is a test line. | egrep -o &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[a-z]+\.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;line.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;6统计文件或者文本中包含匹配字符串的行数&#34;&gt;6、统计文件或者文本中包含匹配字符串的行数：&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;-c 选项：&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>lvgl显示txt文本(指定字体)</title>
      <link>https://fan-pengfei.top/posts/lvgl%E6%98%BE%E7%A4%BAtxt%E6%96%87%E6%9C%AC%E6%8C%87%E5%AE%9A%E5%AD%97%E4%BD%93/</link>
      <pubDate>Mon, 16 May 2022 03:38:12 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/lvgl%E6%98%BE%E7%A4%BAtxt%E6%96%87%E6%9C%AC%E6%8C%87%E5%AE%9A%E5%AD%97%E4%BD%93/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;前些天做微机课设，给小一加了几个功能，其中一个重要功能是显示中文文本；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;字体取模&#34;&gt;字体取模：&lt;/h2&gt;
&lt;p&gt;屏幕要显示图案，例如某个汉字或者数字、图案等，都需要对图案进行取模操作；&lt;/p&gt;
&lt;p&gt;使用的是&lt;code&gt;LvglFontTool&lt;/code&gt;工具，&lt;code&gt;LVGL&lt;/code&gt;官网的字体转化用于单个字体取模比较方便；批量的话，使用这个离线取模软件比较方便；&lt;/p&gt;
&lt;p&gt;操作界面如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;c941fa311425ab16f5bc3f354d99fc2&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/lvgl%E6%98%BE%E7%A4%BAtxt%E6%96%87%E6%9C%AC%E6%8C%87%E5%AE%9A%E5%AD%97%E4%BD%93/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;步骤还是很简单的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;首先选择字体，包括一个&lt;code&gt;TFF&lt;/code&gt;字体文件还有选择需要取模的字体大小；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后加入汉字，我是将所有常用的汉字都加入了；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后在右边配置一些选项，按照图片上的配置就可以；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后点击开始转换就可以生成一个&lt;code&gt;myFont.c&lt;/code&gt;和&lt;code&gt;myFont.bin&lt;/code&gt;文件，&lt;code&gt;bin&lt;/code&gt;文件加载到&lt;code&gt;SPI FLASH&lt;/code&gt;中，C文件加入&lt;code&gt;Keil&lt;/code&gt;工程即可;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;efcc7c6005ad5950310dbec4ab39cd3&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/lvgl%E6%98%BE%E7%A4%BAtxt%E6%96%87%E6%9C%AC%E6%8C%87%E5%AE%9A%E5%AD%97%E4%BD%93/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;如果只需要显示数量比较少的文本，取模后得到的数组可以直接放在一个&lt;code&gt;.c&lt;/code&gt;或者&lt;code&gt;.h&lt;/code&gt;文件中，直接下载到单片机的&lt;code&gt;FLASH&lt;/code&gt;中即可，但是如果要显示各种不同样式和不同大小的字体，取模后得到的文件会很大，加载到&lt;code&gt;FLASH&lt;/code&gt;中存放是不合理的。&lt;/p&gt;
&lt;h2 id=&#34;文件放置&#34;&gt;文件放置：&lt;/h2&gt;
&lt;p&gt;小一这一版的硬件是带了一个&lt;code&gt;8M&lt;/code&gt;的&lt;code&gt;SPI FLASH&lt;/code&gt;，所以取模后的数据可以放在这块&lt;code&gt;SPI FLASH&lt;/code&gt;中，可以用哪些方法通过单片机读取&lt;code&gt;bin&lt;/code&gt;文件中的内容呢？&lt;/p&gt;
&lt;p&gt;一般是有两个方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;放入移植好的&lt;code&gt;Fatfs&lt;/code&gt;文件系统中，通过文件系统提供的接口读取该bin文件；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;加载进&lt;code&gt;SPI FLASH&lt;/code&gt;中，直接通过最底层的读取函数读取；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两种方案各有优缺点，第一种更换字体取模文件很方便，但是由于字体取模文件会频繁被读取，所以这个方案的效率会比较差；第二种方案更换字体取模文件比较麻烦，但是读取的效率会高不少。我是选择了第二种方案，第一种我也试了，效率确实不是很高。&lt;/p&gt;
&lt;p&gt;对于第二种方案，首先要将取模文件从PC机放入&lt;code&gt;SPI FLASH&lt;/code&gt;中，我采用的方案是将&lt;code&gt;SPI FLASH&lt;/code&gt;划分为两部分：&lt;/p&gt;
&lt;p&gt;前4MB
后4MB&lt;/p&gt;
&lt;p&gt;用于存储字体取模数据
用于建立文件系统&lt;/p&gt;
&lt;p&gt;然后将&lt;code&gt;SPI FLASH&lt;/code&gt;模拟为USB设备，插入PC机，会弹出一个U盘，将字体文件拖入；然后通过一个函数，将&lt;code&gt;bin&lt;/code&gt;文件分段读取并分段写入&lt;code&gt;SPI FLASH&lt;/code&gt;的前&lt;code&gt;4MB&lt;/code&gt;部分中，具体函数如下所示：&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;write_to_flash&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; i;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    f_res &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f_open&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;file1, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;myFont.bin&amp;#34;&lt;/span&gt;, FA_READ);&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;    count_f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;如果有多个字体文件，可以将写入的地址偏移一个大小即可。&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;## 文件读取：
&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:#960050;background-color:#1e0010&#34;&gt;字体取模文件读取只需要修改`&lt;/span&gt;myFont.c&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;`中的一个函数：&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:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;c
&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; __g_font_buf[&lt;span style=&#34;color:#ae81ff&#34;&gt;324&lt;/span&gt;]; &lt;span style=&#34;color:#75715e&#34;&gt;//如bin文件存在SPI FLASH可使用此buff
&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;__user_font_getdata&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; offset, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; size)
&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;//如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);
&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;//如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset);
&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:#a6e22e&#34;&gt;my_W25QXX_Read&lt;/span&gt;(__g_font_buf, offset, size);
&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; __g_font_buf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#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;code&gt;myFont&lt;/code&gt;文件中将读出的地址偏移一个大小即可。&lt;/p&gt;</description>
    </item>
    <item>
      <title>结构体中定义函数指针</title>
      <link>https://fan-pengfei.top/posts/%E7%BB%93%E6%9E%84%E4%BD%93%E4%B8%AD%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88/</link>
      <pubDate>Tue, 10 May 2022 06:56:37 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E7%BB%93%E6%9E%84%E4%BD%93%E4%B8%AD%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;前些天看了一个RobMaster哨兵机器人的开源代码，里边用了C语言结构体定义函数指针，看得有点迷糊，所以自己查了一些相关的资料；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C语言结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。所以，标准C中的结构体是不允许包含成员函数的，当然C++中的结构体对此进行了扩展。那么，我们在C语言的结构体中，只能通过定义函数指针的方式，用函数指针指向相应函数，以此达到调用函数的目的。&lt;/p&gt;
&lt;h2 id=&#34;结构体定义&#34;&gt;结构体定义：&lt;/h2&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; data_demo
&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;int&lt;/span&gt; result;
&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;int&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;add)(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&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;int&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sub)(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;完整例子&#34;&gt;完整例子：&lt;/h2&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&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;struct data_demo&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;{
&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;int&lt;/span&gt; result;
&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;int&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;add)(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&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;int&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sub)(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&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:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;add_demo&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; j)
&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;return&lt;/span&gt; i&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;j;
&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;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sub_demo&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; j)
&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;return&lt;/span&gt; i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;j;
&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;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&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:#66d9ef&#34;&gt;struct&lt;/span&gt; data_demo data &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;  {&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, add_demo, sub_demo};
&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;// 也可以如下初始化结构体 完全等价
&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;/*
&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;    struct data_demo data =
&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;    {
&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;        .result = 0,
&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;        .add = add_demo,
&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;        .sub = sub_demo
&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;    };
&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;    */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data.result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; data.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;30&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:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;add:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\t&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, data.result);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data.result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; data.&lt;span style=&#34;color:#a6e22e&#34;&gt;sub&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;20&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:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sub:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\t&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, data.result);
&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; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;运行结果&#34;&gt;运行结果：&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;运行结果&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E7%BB%93%E6%9E%84%E4%BD%93%E4%B8%AD%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88/img-1.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>常用的通信协议</title>
      <link>https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E7%9A%84%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE/</link>
      <pubDate>Mon, 09 May 2022 13:38:00 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E7%9A%84%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;常用通讯协议(SPI、IIC、UART)；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一usart和uart&#34;&gt;一、USART和UART:&lt;/h2&gt;
&lt;p&gt;USART:通用同步异步收发器，USART是一个串行通信设备，可以灵活地与外部设备进行全双工数据交换。&lt;/p&gt;
&lt;p&gt;UART: 通用异步收发器，异步串行通信口(UART)就是我们在嵌入式中常说的串口，它还是一种通用的数据通信议。&lt;/p&gt;
&lt;p&gt;异步通讯时二者无区别，同步通讯时USART可以提供主动时钟。&lt;/p&gt;
&lt;p&gt;均为全双工通信。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;起始位：先发出一个逻辑”0”的信号，表示传输数据的开始。
数据位：传输N bits。
校验位(可选)：数据位加上这一位后，使得“1”的位数应为偶数(偶校验)或奇数(奇校验)，以此来校验数据传送的正确性。
如传输“A”(01000001)为例,”A”字符的8个bit位中有两个1。当为奇数校验时该位为1；当为偶数校验时该位为0。
停止位：它是一帧数据的结束标志。可以是1bit、1.5bit、2bit的空闲电平。
空闲位：没有数据传输时线路上的电平状态。为逻辑1。
传输方向：即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。比如传输“A”如果是MSB那么就是01000001，如果是LSB那么就是10000010
帧间隔：即传送数据的帧与帧之间的间隔大小，可以以位为计量也可以用时间(知道波特率那么位数和时间可以换算)。比如传送”A”完后，这为一帧数据，再传”B”，那么A与B之间的间隔即为帧间隔。
波特率定义：有效数据信号调制载波的速率，每秒传输1或0的个数；
例如：串口传输速率为9600bps，每秒可传输多少字节？
起始位：1    数据位：8
停止位：1    校验位：0
传输1字节数据，需要传输10bit，因此：
9600 ÷ 10 = &lt;strong&gt;960Byte&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;二iic通讯协议&#34;&gt;二、IIC通讯协议：&lt;/h2&gt;
&lt;p&gt;IIC协议为半双工协议。&lt;/p&gt;
&lt;p&gt;全双工指在发送数据的同时也能够接收数据；&lt;/p&gt;
&lt;p&gt;半双工就是指一个时间段内只有一个动作发生；&lt;/p&gt;
&lt;p&gt;数据有效传输在scl信号的高电平期间，sda数据线保持稳定，在scl为低电平时允许sda数据线变化。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E7%9A%84%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;起始条件在scl为高电平期间，sda出现下降沿，则为起始信号。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E7%9A%84%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;结束条件在scl为高电平期间，sda出现上升沿，则为结束信号。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E7%9A%84%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE/img-3.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：注意起始和终止信号都是由主机发出的，总线在起始条件之后，视为忙状态，在停止条件之后被视为空闲状态。
应答（ACK，Acknowledgement）。即确认字符，在数据通信中，接收站发给发送站的一种传输类控制字符。主机每向从机发送完一个字节的数据，主机总是需要等待从机给出一个应答信号，来确认从机是否成功接收到了数据，从机应答主机所需要的时钟也是由主机提供的，应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期，低电平0表示应答，1表示非应答。，需要应答时，数据发出方将SDA总线设置为3态输入，由于IIC总线上有上拉电阻，因此此时总线默认高电平，若数据接收方正确接收到数据，则数据接收方将SDA总线拉低，以示正确应答。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;IIC传输时时从MSB开始传输到LSB结束。MSB是Most Significant Bit的缩写，最高有效位。在二进制数中，MSB是最高加权位。与十进制数字中最左边的一位类似。通常，MSB位于二进制数的最左侧，LSB位于二进制数的最右侧。LSB，英文 least significant bit，中文义最低有效位。&lt;/p&gt;
&lt;p&gt;写时序：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E7%9A%84%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE/img-4.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;​    ID_Address, REG_Address, W_REG_Data&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;产生start位；
传送器件地址ID_Address，器件地址的最后一位为数据的传输方向位，R/W，低电平0表示主机往从机写数据（W），1表示主机从从机读数据（R）。ACK应答，应答是从机发送给主机的应答，这里不用管；
传送写入器件寄存器地址，即数据要写入的位置。同样ACK应答不用管；
传送要写入的数据。ACK应答不用管；
产生stop信号；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;读时序：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E7%9A%84%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE/img-5.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;​    {ID_Address + REG_Address} + {ID_Address + R_REG_Data}&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;产生start信号
传送器件地址（写ID_Address），ACK。
传送字地址（写REG_Address），ACK。
再次产生start信号
再传送一次器件地址，ACK。
读取一个字节的数据，读数据最后结束前无应答ACK信号。
产生stop信号。&lt;/p&gt;</description>
    </item>
    <item>
      <title>判断大端和小端模式</title>
      <link>https://fan-pengfei.top/posts/%E5%88%A4%E6%96%AD%E5%A4%A7%E7%AB%AF%E5%92%8C%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F/</link>
      <pubDate>Mon, 09 May 2022 13:28:46 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%88%A4%E6%96%AD%E5%A4%A7%E7%AB%AF%E5%92%8C%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;测试自己的电脑是小端模式还是大端模式；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;方法一地址转换&#34;&gt;方法一：地址转换&lt;/h2&gt;
&lt;p&gt;将int 48存起来，然后取得其地址，再将这个地址转为char* ，这时候，如果是小端存储，那么char*指针就指向48；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;48对应的ASCII码为字符&lt;code&gt;0&lt;/code&gt;；&lt;/p&gt;
&lt;/blockquote&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;judge_bigend_littleend1&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:#66d9ef&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;48&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;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; p &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;i;
&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;char&lt;/span&gt; c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;((&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)p);
&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;if&lt;/span&gt; (c &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&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:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;小端&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;else&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:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;大端&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;方法二同方法一&#34;&gt;方法二：同方法一&lt;/h2&gt;
&lt;p&gt;定义变量int i=1;将 i 的地址拿到，强转成char*型，这时候就取到了 i 的低地址，这时候如果是1就是小端存储，如果是0就是大端存储。&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;judge_bigend_littleend2&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:#66d9ef&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;char&lt;/span&gt; c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;i);
&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;if&lt;/span&gt; (c)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;小端&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;else&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:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;大端&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;方法三利用联合体对齐规则&#34;&gt;方法三：利用联合体对齐规则&lt;/h2&gt;
&lt;p&gt;定义联合体，一个成员是多字节，一个是单字节，给多字节的成员赋一个最低一个字节不为0，其他字节为0 的值，再用第二个成员来判断，如果第二个字节不为0，就是小端，若为0，就是大端。&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;judge_bigend_littleend3&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;{
&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;union&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:#66d9ef&#34;&gt;int&lt;/span&gt; i;
&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;char&lt;/span&gt; c;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }un;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    un.i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;if&lt;/span&gt; (un.c &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;小端&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;else&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:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;大端&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>CAN通讯解析</title>
      <link>https://fan-pengfei.top/posts/can%E9%80%9A%E8%AE%AF%E8%A7%A3%E6%9E%90/</link>
      <pubDate>Sun, 08 May 2022 02:52:45 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/can%E9%80%9A%E8%AE%AF%E8%A7%A3%E6%9E%90/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;CAN通讯解析；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;控制器局域网&lt;/strong&gt; (&lt;strong&gt;Controller Area Network&lt;/strong&gt;，简称&lt;strong&gt;CAN&lt;/strong&gt;或者&lt;strong&gt;CAN bus&lt;/strong&gt;) 是一种功能丰富的车用总线标准。被设计用于在不需要主机（Host）的情况下，允许网络上的单片机和仪器相互通信。 它基于[消息传递协议，设计之初在车辆上采用复用通信线缆，以降低铜线使用量，后来也被其他行业所使用。&lt;/p&gt;
&lt;p&gt;CAN创建在基于信息导向传输协定的广播机制（Broadcast Communication Mechanism）上。其根据信息的内容，利用信息标志符（Message Identifier，每个标志符在整个网络中独一无二）来定义内容和消息的优先顺序进行传递，而并非指派特定站点地址（Station Address）的方式。&lt;/p&gt;
&lt;p&gt;因此，CAN拥有了良好的弹性调整能力，可以在现有网络中增加节点而不用在软、硬件上做出调整。除此之外，消息的传递不基于特殊种类的节点，增加了升级网络的便利性。&lt;/p&gt;
&lt;h2 id=&#34;架构&#34;&gt;架构：&lt;/h2&gt;
&lt;p&gt;CAN是一个用于连接电子控制单元（ECU）的多主机串行总线标准。电子控制单元有时也被称作节点。CAN网络上需要至少两个节点才可进行通信。节点的复杂程度可以只是简单的输入输出设备，也可以是包含有CAN交互器并搭载了软件的嵌入式组件。节点还可能是一个网关，允许普通计算机通过USB或以太网端口与CAN网络上的设备通信。&lt;/p&gt;
&lt;p&gt;所有节点通过两根平行的总线连接在一起。两条电线组成一条双绞线，并且接有120Ω的特性阻抗。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ISO 11898-2&lt;/strong&gt;，也称为高速度CAN。它在总线的两端均接有120Ω电阻。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/can%E9%80%9A%E8%AE%AF%E8%A7%A3%E6%9E%90/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;高速CAN网络 ISO 11898-2&lt;/p&gt;
&lt;p&gt;高速CAN总线在传输显性（0）信号时，会将CAN_H端抬向5V高电平，将CAN_L拉向0V低电平。当传输隐性（1)信号时，并不会驱动CAN_H或者CAN_L端。 显性信号CAN_H和CAN_L两端差分标称电压为2V。 终端电阻在没有驱动时，将差分标称电压降回0V。显性信号（0）的共模电压需要在1.5V到3.5V之间。隐性信号（1）的共模电压需要在+/-12V。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/can%E9%80%9A%E8%AE%AF%E8%A7%A3%E6%9E%90/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;高速CAN信令 ISO 11898-2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ISO 11898-3&lt;/strong&gt;，也被称作低速或者容错CAN。它使用线性主线，星形主线或者连接到一个线性主线上的多星结构主线著称。每个节点都有终端电阻作为全局终端电阻的一部分。全局终端电阻不应低于100 Ω。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/can%E9%80%9A%E8%AE%AF%E8%A7%A3%E6%9E%90/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;低速容错CAN网络 ISO 11898-3&lt;/p&gt;
&lt;p&gt;低速/容错CAN信号在传输显性信号（0）时，驱动CANH端抬向5V，将CANL端降向0V。在传输隐性信号（1）时并不驱动CAN 总线的任何一端。在电源电压Vcc为5V时，显性信号差分电压需要大于2.3V，隐性信号的差分电压需要小于0.6V。CAN总线两端未被驱动时，终端电阻使CANL端回归到RTH电压（当电源电压Vcc为5V时，RTH电压至少为Vcc-0.3V=4.7V），同时使CANH端回归至RTL电压（RTL电压最大为0.3V）。两根线需要能够承受-27V至40V的电压而不被损坏。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/can%E9%80%9A%E8%AE%AF%E8%A7%A3%E6%9E%90/img-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;低速CAN信令 ISO 11898-3&lt;/p&gt;
&lt;p&gt;在高速和低速CAN中,从隐性信号向显性信号过渡的速度更快，因为此时CAN线缆被主动积极地驱动。显性向隐性的过渡速度主要取决于CAN网络的长度和导线的电容。&lt;/p&gt;
&lt;p&gt;高速CAN通常被用于汽车和工业应用，在这些应用环境中，总线通常从一端横跨至另一端。容错CAN总线则经常被用在需要连接在一起的一组节点。&lt;/p&gt;
&lt;p&gt;ISO规格只要求总线共模电压必须保持在最小和最大范围内，但不定义如何将总线电压保持在这个范围。&lt;/p&gt;
&lt;p&gt;CAN总线必须使用终端电阻。终端电阻可以用来抑制信号反射，同时可以使总线电压回到隐性状态或者闲置状态。&lt;/p&gt;
&lt;p&gt;高速CAN在总线两端使用120Ω电阻。低速CAN在每个节点均使用电阻。也有其他类型的终端，例如ISO 11783中定义了终端偏压电路。&lt;/p&gt;
&lt;p&gt;终端偏压电路使用由4条导线组成的线缆，除了CAN信号线以外还有电源线和地线。这在每段总线两端提供自动偏压和终端功能。ISO11783网络是专为热拔插总线段和电子控制单元设计的。&lt;/p&gt;
&lt;h2 id=&#34;can通信节点&#34;&gt;CAN通信节点：&lt;/h2&gt;
&lt;p&gt;每个节点需要:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;中央处理器、微处理器或主处理器
处理主机决定收到的信息的意思以及想要传输的信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;传感器、驱动器和控制设备可以与主处理器连接。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CAN控制器；通常是集成单片机的一部分
接收：CAN控制器将从总线上接收的串位字节存储直到整个消息可用，之后主处理器可以获取这个消息（通常由于CAN控制器触发一个中断）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;发送：主处理器发送传递信息到CAN控制器，之后当总线空闲时将串位信息传递至总线。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;收发器；由ISO11898-2/3介质访问单元（MAU）标准定义
接收：把数据流从CAN总线层转换成CAN控制器可以使用的标准。 CAN控制器通常配有保护电路。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;传输：把来自CAN控制器的数据流转换至CAN总线层。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每个节点能够发送和接收信息，但不是同时进行的。 一个消息或帧主要包括标识符(ID)，它表示信息的优先级，最多八个数据字节。CRC、ACK和其他帧部分也是消息的一部分。改进了的CAN FD将每个帧拓展至最多64字节。 消息采用不归零(NRZ)格式串联传送到主线并可被所有节点接收。&lt;/p&gt;
&lt;p&gt;被CAN网络连接的设备通常是传感器，驱动器和其他控制设备。 这些设备通过一个中央处理器、一个CAN控制器和一个CAN接收器连接至总线。&lt;/p&gt;
&lt;h2 id=&#34;数据传输&#34;&gt;数据传输：&lt;/h2&gt;
&lt;p&gt;CAN数据传输如果出现争执，将会使用无损位仲裁解决办法。该仲裁法要求CAN网络上的所有节点同步，对每一位的采样都在同一时间。这就是为什么有人称之为CAN同步。然而，同步这个术语在此并不精确，因为数据以异步格式传输而不包含时钟信号。&lt;/p&gt;</description>
    </item>
    <item>
      <title>stm32启动过程</title>
      <link>https://fan-pengfei.top/posts/stm32%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/</link>
      <pubDate>Sun, 08 May 2022 02:14:32 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/stm32%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;了解stm32的启动过程，方便遇到问题时的调试；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;主要是两个问题&#34;&gt;主要是两个问题：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;STM32是如何启动的，如何执行到main函数；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何保证编译后的代码可以烧录到正确的地址；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作为一个计算机系统的核心，CPU的实际工作就是取指令和计算。大体上它可以看做是三个部分组成的：寄存器组、算术逻辑单元(ALU) 、指令队列。 在&lt;code&gt;Cortex-M4&lt;/code&gt;的寄存器中有一个特殊的寄存器PC(Program Counter,程序计数器)， 用于控制程序的执行。在每个时钟周期中CPU都会根据PC中的值，从地址空间中取一条指令放到指令队列中， 同时从指令队列中取出一条指令进行解析和运算(实际上ARM采用的是一种流水线的指令处理方式，与这里所讲的内容还是有很大差异的，但大体思想差不多)。 并把上次的运算结果写到寄存器中。&lt;/p&gt;
&lt;p&gt;CPU运算所用的指令和数据都来自地址空间。在&lt;code&gt;Cortex-M4&lt;/code&gt;的内存系统中， CPU可以访问4G的地址空间，根据所映射的物理对象不同大体上被划分成了6块。我们烧写到芯片内部的程序一般都在其中的Code段中， 在STM32中这个段对应的是一块FLASH。上电的时候，基本上只有这块FLASH中的内容是确定的，其它地址空间以及CPU内部的寄存器中的值都是随机的。 当然为了防止上电的时候外设产生意外，片上外设(&lt;code&gt;Peripheral&lt;/code&gt;)段中的值在上电的时候也会有初始值。&lt;/p&gt;
&lt;p&gt;所以，从处理器的角度来看，启动过程实际上是给各个寄存器赋初值的过程，更具体的是给PC寄存器赋初值的过程。从MCU和系统的角度来看， 启动过程是初始化处理器和外设的过程。&lt;/p&gt;
&lt;h2 id=&#34;以stm32f4为例&#34;&gt;以STM32F4为例：&lt;/h2&gt;
&lt;h3 id=&#34;stm32是如何启动的&#34;&gt;STM32是如何启动的：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;上电后系统进行复位，等到时钟稳定后才可以正常工作，这个过程通常需要几个毫秒。 图1中描述了处理器的复位过程，Cortex-M内核会先从地址&lt;code&gt;0x0000&lt;/code&gt;处读取栈地址，并写到CPU内部的SP寄存器中。 再从地址&lt;code&gt;0x0004&lt;/code&gt;读取&lt;code&gt;Reset Vector&lt;/code&gt;到PC寄存器中，进而跳转到&lt;code&gt;Reset Vector&lt;/code&gt;所指的地址上开始执行程序。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;cortex_m复位流程&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/stm32%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;图1 Cortex-M复位流程&lt;/p&gt;
&lt;p&gt;栈空间是处理器实现函数调用和中断服务的工具。函数调用和中断服务有一个共同的特点就是，它们都需要先把当前正在处理的内容暂时保存下来，转而执行要调用的函数， 或者中断服务函数，等待新的函数执行完毕返回后，在从原来保存的内容恢复回来继续执行原来的函数。而函数的调用是支持嵌套的，也就是说一个函数中可以调用子函数， 在子函数中又可以调用其它子函数。那么从函数的调用和返回的顺序上来看，最后调用的函数一定先返回。栈这种数据结构的特点就是其中的数据是后进先出的， 与函数调用和返回的顺序是一致的。因而，人们就专门在内存空间中划分出来一块用作栈空间，并从CPU中拿出一个宝贵的寄存器用于指示栈顶， 该寄存器被记为SP (Stack Pointer)。&lt;/p&gt;
&lt;p&gt;所以，前面所说的从CPU的角度看启动过程就是PC寄存器初始化的过程还不完善。虽然对PC寄存器进行初始化后，CPU就可以正常的取指令并进行运算了， 但这时所能完成的功能十分有限，并不能支持对我们很重要的函数和中断。因此，从CPU角度看启动过程是对PC和SP两个寄存器的初始化过程。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Cortex-M4&lt;/code&gt;中规定&lt;code&gt;0x0000&lt;/code&gt;起始的地址存放的是系统向量表(&lt;code&gt;vector table&lt;/code&gt;)。在STM32中&lt;code&gt;0x0000&lt;/code&gt;本身并不对应什么物理设备， ==通过配置引脚BOOT[1:0]我们可以控制&lt;code&gt;0x0000&lt;/code&gt;映射到地址空间中的其它地址中，也就实现了不同的启动方式。==一共有三种可选的启动方式如表1所示， 从主闪存或者系统存储器启动时，硬件上会把&lt;code&gt;0x0000 0000&lt;/code&gt;映射到&lt;code&gt;0x0800 0000&lt;/code&gt;或者&lt;code&gt;0x1FFF F000&lt;/code&gt;上，这样我们从地址&lt;code&gt;0x0000 0000&lt;/code&gt;访问的空间实际上就是主闪存或者系统存储器的空间。 从SRAM启动时，只能在&lt;code&gt;0x2000 0000&lt;/code&gt;开始的地址访问SRAM。一般我都是从主闪存启动的，也就是说系统的向量表应当烧写在&lt;code&gt;0x0800 0000&lt;/code&gt;的地址上。至于如何从SRAM启动需要查看其他资料&lt;code&gt;todo&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;启动模式选择引脚&lt;/p&gt;
&lt;p&gt;启动模式
偏移地址&lt;/p&gt;
&lt;p&gt;BOOT1
BOOT0&lt;/p&gt;
&lt;p&gt;X
0
主闪存(Main Flash Memory)
0x0800 0000&lt;/p&gt;
&lt;p&gt;0
1
系统存储器(system memory)
0x1FFF F000&lt;/p&gt;
&lt;p&gt;1
1
内置SRAM(Embedded SRAM)
0x2000 0000&lt;/p&gt;</description>
    </item>
    <item>
      <title>python向bin文件添加CRC32校验码</title>
      <link>https://fan-pengfei.top/posts/python%E5%90%91bin%E6%96%87%E4%BB%B6%E6%B7%BB%E5%8A%A0crc32%E6%A0%A1%E9%AA%8C%E7%A0%81/</link>
      <pubDate>Sat, 07 May 2022 05:01:21 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/python%E5%90%91bin%E6%96%87%E4%BB%B6%E6%B7%BB%E5%8A%A0crc32%E6%A0%A1%E9%AA%8C%E7%A0%81/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;python向bin文件添加CRC32校验码；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;1keil添加配置编译后调用脚本生成bin文件&#34;&gt;1、keil添加配置，编译后调用脚本生成bin文件&lt;/h2&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;D:&lt;span style=&#34;color:#ae81ff&#34;&gt;\K&lt;/span&gt;eil_v5&lt;span style=&#34;color:#ae81ff&#34;&gt;\A&lt;/span&gt;RM&lt;span style=&#34;color:#ae81ff&#34;&gt;\A&lt;/span&gt;RMCC&lt;span style=&#34;color:#ae81ff&#34;&gt;\b&lt;/span&gt;in&lt;span style=&#34;color:#ae81ff&#34;&gt;\f&lt;/span&gt;romelf.exe --bin -o fromelf --bin -o &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$L&lt;span style=&#34;color:#e6db74&#34;&gt;@L.bin&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#L&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/python%E5%90%91bin%E6%96%87%E4%BB%B6%E6%B7%BB%E5%8A%A0crc32%E6%A0%A1%E9%AA%8C%E7%A0%81/img-1.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;2keil添加配置调用python脚本向bin文件中插入crc32校验码&#34;&gt;2、keil添加配置，调用python脚本，向bin文件中插入crc32校验码&lt;/h2&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python ./crc32_bin.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;python脚本如下：&lt;/strong&gt;&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;strong&gt;这个脚本我是用在stm32 &lt;code&gt;Bootloader&lt;/code&gt;中的，因为经串口或其他方式接收到的程序未必是正确的，而且有时候会加入版本信息什么的，所以加入CRC校验可以方便的检验文件完整性。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>FreeRTOS基础知识</title>
      <link>https://fan-pengfei.top/posts/freertos%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/</link>
      <pubDate>Fri, 06 May 2022 08:58:30 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/freertos%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;FreeRTOS学习记录；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;freertos学习记录&#34;&gt;FreeRTOS学习记录&lt;/h1&gt;
&lt;h3 id=&#34;一任务管理&#34;&gt;一、任务管理&lt;/h3&gt;
&lt;h4 id=&#34;任务函数&#34;&gt;任务函数：&lt;/h4&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ATaskFunction&lt;/span&gt;( &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pvParameters );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;每一个任务函数都有自己的栈空间、自动变量；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;函数里通常是一个死循环；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一般函数有可能跳出死循环，则必须删除函数：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ATaskFunction&lt;/span&gt;( &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pvParameters )
&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;/* 可以像普通函数一样定义变量。用这个函数创建的每个任务实例都有一个属于自己的iVarialbleExample变
&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;	量。但如果iVariableExample被定义为static，这一点则不成立 – 这种情况下只存在一个变量，所有的任务实
&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;	例将会共享这个变量。 */&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;int&lt;/span&gt; iVariableExample &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;/* 任务通常实现在一个死循环中。 */&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;( ;; )
&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;/* 完成任务功能的代码将放在这里。 */&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;/* 如果任务的具体实现会跳出上面的死循环，则此任务必须在函数运行完之前删除。传入NULL参数表示删除
&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;	的是当前任务 */&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:#a6e22e&#34;&gt;vTaskDelete&lt;/span&gt;( NULL );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;任务创建函数&#34;&gt;任务创建函数：&lt;/h4&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;portBASE_TYPE &lt;span style=&#34;color:#a6e22e&#34;&gt;xTaskCreate&lt;/span&gt;( pdTASK_CODE pvTaskCode,
&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;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;signed&lt;/span&gt; portCHAR &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; pcName,
&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;unsigned&lt;/span&gt; portSHORT usStackDepth,
&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;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pvParameters,
&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;unsigned&lt;/span&gt; portBASE_TYPE uxPriority,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            xTaskHandle &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pxCreatedTask );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;pvTaskCode
任务只是永不退出的 C 函数，实现常通常是一个死循环。参数 pvTaskCode 是一个指向任务的实现函数的指针(效果上仅仅是函数 名)。&lt;/p&gt;</description>
    </item>
    <item>
      <title>union和struct存放格式</title>
      <link>https://fan-pengfei.top/posts/union%E5%92%8Cstruct%E5%AD%98%E6%94%BE%E6%A0%BC%E5%BC%8F/</link>
      <pubDate>Fri, 06 May 2022 08:55:37 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/union%E5%92%8Cstruct%E5%AD%98%E6%94%BE%E6%A0%BC%E5%BC%8F/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;union、struct所占的空间大小；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;union&#34;&gt;union:&lt;/h2&gt;
&lt;p&gt;​        &lt;strong&gt;当多个数据需要共享内存或者多个数据每次只取其一时，可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;联合体是一个结构；&lt;/strong&gt;
&lt;strong&gt;它的所有成员相对于基地址的偏移量都为0；&lt;/strong&gt;
&lt;strong&gt;此结构空间要大到足够容纳最”宽”的成员；&lt;/strong&gt;
&lt;strong&gt;其对齐方式要适合其中所有的成员；&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​       下面解释这四条描述：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;由于联合体中的所有成员是共享一段内存的，因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0，即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存，因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;例如：&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-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include
&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;using&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; std;
&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;union&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;A&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;int&lt;/span&gt; a[&lt;span style=&#34;color:#ae81ff&#34;&gt;5&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;char&lt;/span&gt; b;
&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;double&lt;/span&gt; c;
&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;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   cout
&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:#f92672&#34;&gt;**&lt;/span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;**&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:#f92672&#34;&gt;**&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#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:#f92672&#34;&gt;**&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#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:#f92672&#34;&gt;**&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#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:#f92672&#34;&gt;**&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;**&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:#f92672&#34;&gt;**&lt;/span&gt;c&lt;span style=&#34;color:#f92672&#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:#f92672&#34;&gt;**&lt;/span&gt;c&lt;span style=&#34;color:#f92672&#34;&gt;**&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:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;c&lt;span style=&#34;color:#f92672&#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;//例如：
&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;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;B&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:#66d9ef&#34;&gt;char&lt;/span&gt; a;
&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;short&lt;/span&gt; b;
&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;int&lt;/span&gt; c;
&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;//则sizeof(A)大小应该是4+4=8字节
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;a&lt;/strong&gt;
&lt;strong&gt;c&lt;/strong&gt;
&lt;strong&gt;c&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;b&lt;/strong&gt;
&lt;strong&gt;b&lt;/strong&gt;
&lt;strong&gt;b&lt;/strong&gt;
&lt;strong&gt;b&lt;/strong&gt;&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-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;B&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:#66d9ef&#34;&gt;char&lt;/span&gt; a;
&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;char&lt;/span&gt; b[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;char&lt;/span&gt; c[&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;}
&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;//则sizeof(A)大小应该是1+2+4=7字节
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;a
b
b
c
c
c
c&lt;/p&gt;</description>
    </item>
    <item>
      <title>常用脚本汇总</title>
      <link>https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E8%84%9A%E6%9C%AC%E6%B1%87%E6%80%BB/</link>
      <pubDate>Fri, 22 Apr 2022 02:44:42 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%B8%B8%E7%94%A8%E8%84%9A%E6%9C%AC%E6%B1%87%E6%80%BB/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;图片PNG文件转JPG文件；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;使用方法：将该脚本放置于png文件所在的文件夹中，然后运行该脚本，即可将png文件转化为jpg文件，并放置于JPG文件夹下；&lt;/strong&gt;&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:#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;from&lt;/span&gt; PIL &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Image
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dirname_read &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./&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;dirname_write &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./JPG/&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;names &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;listdir(dirname_read)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;count &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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; name &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; names:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    portion &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;splitext(name)  				&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;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; portion[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.png&amp;#34;&lt;/span&gt;:          				&lt;span style=&#34;color:#75715e&#34;&gt;# 判断扩展名是否为png&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        img &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Image&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;open(dirname_read&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;name) 		&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;        name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; portion[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.jpg&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;        to_save_path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dirname_write &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; name 		&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;        img &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; img&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;convert(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;RGB&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:#75715e&#34;&gt;# RGBA意思是红色，绿色，蓝色,Alpha指透明度。而JPG不支持透明度，所以要么丢弃Alpha,要么保存为.png文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        img&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;save(to_save_path, quality&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;95&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;        count &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;        print(to_save_path, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;------conut:&amp;#34;&lt;/span&gt;, count)  &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;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&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;continue&lt;/span&gt;
&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;Count_Sum:&amp;#34;&lt;/span&gt;, count)  						&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;</description>
    </item>
    <item>
      <title>PID中积分饱和及其解决办法</title>
      <link>https://fan-pengfei.top/posts/pid%E4%B8%AD%E7%A7%AF%E5%88%86%E9%A5%B1%E5%92%8C%E5%8F%8A%E5%85%B6%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/</link>
      <pubDate>Thu, 10 Mar 2022 02:41:07 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/pid%E4%B8%AD%E7%A7%AF%E5%88%86%E9%A5%B1%E5%92%8C%E5%8F%8A%E5%85%B6%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;PID控制中常出现的积分饱和概念及其解决方案；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;积分饱和的概念&#34;&gt;积分饱和的概念：&lt;/h2&gt;
&lt;p&gt;这种现象往往发生在误差有大幅变化（例如大幅增加），积分器因为误差的大幅增加有很大的累计量，因为积分器的输出满足下式：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pIYBAGBYOGKAMGJyAAAKa3yzFcw010.png&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/pid%E4%B8%AD%E7%A7%AF%E5%88%86%E9%A5%B1%E5%92%8C%E5%8F%8A%E5%85%B6%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;离散化形式表示为：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pIYBAGBYOJqATzZgAAALkxL3jOw485.png&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/pid%E4%B8%AD%E7%A7%AF%E5%88%86%E9%A5%B1%E5%92%8C%E5%8F%8A%E5%85%B6%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;所以随着时间的增加，每次累积较大的误差，很容易造成积分饱和并产生较大的过冲，而且当误差变为负时，其过冲仍维持一段时间之后才恢复正常的情形。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;通常会产生的输出如下图所示：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;o4YBAGBYOR-APSCrAAIJXwZqBuo640.png&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/pid%E4%B8%AD%E7%A7%AF%E5%88%86%E9%A5%B1%E5%92%8C%E5%8F%8A%E5%85%B6%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;从图中我们不难发现，这里有三个过程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;因为这个过程存在 较大幅度变化的误差，因此积分器累积了较大的值，从图中可以看到，积分器的面积比较大（阴影部分）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;此时积分已经饱和，产生了较大的过冲，并且在较长的一段时间内，一直处于过冲的状态；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;积分脱离饱和状态，产生了积极的调节作用，消除静差，系统输出达到设定值；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;如何防止积分饱和&#34;&gt;如何防止积分饱和：&lt;/h2&gt;
&lt;p&gt;为了防止PID控制器出现积分饱和，需要在算法加入抗积分饱和（&lt;code&gt;anti-integral windup&lt;/code&gt;）的算法；通常有以下几种措施；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;积分分离或者称为去积分算法；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在饱和的时候将积分器的累计值初始化到一个比较理想的值；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;若积分饱和因为目标值突然变化而产生，将目标值以适当斜率的斜坡变化可避免此情形；&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;将积分累计量限制上下限，避免积分累计量超过限制值；&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果 PID输出已经饱和，则重新计算积分累计量，使输出恰好为合理的范围；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考：&lt;/h2&gt;
&lt;p&gt;1、&lt;a href=&#34;https://www.elecfans.com/d/1544295.html&#34;&gt;一文详细解析到底什么是积分饱和&lt;/a&gt;；&lt;/p&gt;</description>
    </item>
    <item>
      <title>Jlink使用RTT输出调试信息(代替串口打印)</title>
      <link>https://fan-pengfei.top/posts/jlink%E4%BD%BF%E7%94%A8rtt%E8%BE%93%E5%87%BA%E8%B0%83%E8%AF%95%E4%BF%A1%E6%81%AF%E4%BB%A3%E6%9B%BF%E4%B8%B2%E5%8F%A3%E6%89%93%E5%8D%B0/</link>
      <pubDate>Tue, 15 Feb 2022 04:02:47 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/jlink%E4%BD%BF%E7%94%A8rtt%E8%BE%93%E5%87%BA%E8%B0%83%E8%AF%95%E4%BF%A1%E6%81%AF%E4%BB%A3%E6%9B%BF%E4%B8%B2%E5%8F%A3%E6%89%93%E5%8D%B0/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Jlink RTT调试技巧；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;使用jlink的-rtt功能-&#34;&gt;使用Jlink的 RTT功能 :&lt;/h2&gt;
&lt;p&gt;这个功能是不需要另外接其他引脚的，如果使用SW连接方式，仅仅两根线就可以。&lt;/p&gt;
&lt;p&gt;RTT 是Jlink的一种实时终端的方式连接输出调试信息，网上有很多说明之间按照做就可以，我仅仅是记录一下自己的步骤.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;就是下载RTT软件包，下载RTT文件： &lt;a href=&#34;http://download.segger.com/J-Link/RTT/RTT_Implementation_140925.zip&#34;&gt;http://download.segger.com/J-Link/RTT/RTT_Implementation_140925.zip&lt;/a&gt;  ；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/jlink%E4%BD%BF%E7%94%A8rtt%E8%BE%93%E5%87%BA%E8%B0%83%E8%AF%95%E4%BF%A1%E6%81%AF%E4%BB%A3%E6%9B%BF%E4%B8%B2%E5%8F%A3%E6%89%93%E5%8D%B0/img-1.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;添加RTT文件到自己的工程：
添加必要的头文件：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/jlink%E4%BD%BF%E7%94%A8rtt%E8%BE%93%E5%87%BA%E8%B0%83%E8%AF%95%E4%BF%A1%E6%81%AF%E4%BB%A3%E6%9B%BF%E4%B8%B2%E5%8F%A3%E6%89%93%E5%8D%B0/img-2.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;输出函数打印：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/jlink%E4%BD%BF%E7%94%A8rtt%E8%BE%93%E5%87%BA%E8%B0%83%E8%AF%95%E4%BF%A1%E6%81%AF%E4%BB%A3%E6%9B%BF%E4%B8%B2%E5%8F%A3%E6%89%93%E5%8D%B0/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;这个时候RTT在程序中就添加成功了，我们可以使用使用Jlink带的工具进行查看数据；&lt;/p&gt;
&lt;p&gt;如打开RTT Viewer 提升连接，点击OK 不出意外的话，你就可以看到调试信息了；&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/jlink%E4%BD%BF%E7%94%A8rtt%E8%BE%93%E5%87%BA%E8%B0%83%E8%AF%95%E4%BF%A1%E6%81%AF%E4%BB%A3%E6%9B%BF%E4%B8%B2%E5%8F%A3%E6%89%93%E5%8D%B0/img-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/jlink%E4%BD%BF%E7%94%A8rtt%E8%BE%93%E5%87%BA%E8%B0%83%E8%AF%95%E4%BF%A1%E6%81%AF%E4%BB%A3%E6%9B%BF%E4%B8%B2%E5%8F%A3%E6%89%93%E5%8D%B0/img-5.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>markdown绘制简单流程图</title>
      <link>https://fan-pengfei.top/posts/markdown%E7%BB%98%E5%88%B6%E7%AE%80%E5%8D%95%E6%B5%81%E7%A8%8B%E5%9B%BE/</link>
      <pubDate>Mon, 07 Feb 2022 09:26:35 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/markdown%E7%BB%98%E5%88%B6%E7%AE%80%E5%8D%95%E6%B5%81%E7%A8%8B%E5%9B%BE/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Markdown绘制简单流程图；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;typora流程图&#34;&gt;Typora流程图：&lt;/h1&gt;
&lt;h2 id=&#34;mermaid效果这个可以在typora编辑器中显示博客中渲染失败&#34;&gt;mermaid效果（这个可以在Typora编辑器中显示，博客中渲染失败）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入```，然后输入mermaid即可&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;·mermaid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;graph TD
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   B((开始)) --&amp;gt;C{判断}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   C --  a=1 --&amp;gt;D[执行语句1]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   C --  a=2  --&amp;gt;E[执行语句2]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   C --  a=3 --&amp;gt;F[执行语句3]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   C -- a=4  --&amp;gt;G[执行语句4]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   D--&amp;gt; AA((结束))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   E--&amp;gt; AA
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   F--&amp;gt; AA
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   G--&amp;gt; AA
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;如下图：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;a4e80fed35165401f57d392375ac726&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/markdown%E7%BB%98%E5%88%B6%E7%AE%80%E5%8D%95%E6%B5%81%E7%A8%8B%E5%9B%BE/img-1.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;语法&#34;&gt;语法：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;官网说明文档 &lt;a href=&#34;https://mermaid-js.github.io/mermaid/#/&#34;&gt;Mermaid&lt;/a&gt; .&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;flowchar效果只有这个可以在博客中显示流程图&#34;&gt;flowchar效果（只有这个可以在博客中显示流程图）&lt;/h2&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;···flow
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;st=&amp;gt;start: 开始节点
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;in=&amp;gt;inputoutput: 输入
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;e=&amp;gt;end: 结束节点
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;op=&amp;gt;operation: 操作节点
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond=&amp;gt;condition: 条件节点
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sub=&amp;gt;subroutine: 子例程
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;out=&amp;gt;inputoutput: 输出
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;st(right)-&amp;gt;in-&amp;gt;op-&amp;gt;cond
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond(yes,right)-&amp;gt;out-&amp;gt;e
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond(no)-&amp;gt;sub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;image-20220507220027459&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/markdown%E7%BB%98%E5%88%B6%E7%AE%80%E5%8D%95%E6%B5%81%E7%A8%8B%E5%9B%BE/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际例子1：&lt;/strong&gt;&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-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;···flow
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;st=&amp;gt;start: Start
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;i=&amp;gt;inputoutput: 输入年份n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond1=&amp;gt;condition: n能否被4整除？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond2=&amp;gt;condition: n能否被100整除？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond3=&amp;gt;condition: n能否被400整除？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;o1=&amp;gt;inputoutput: 输出非闰年
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;o2=&amp;gt;inputoutput: 输出非闰年
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;o3=&amp;gt;inputoutput: 输出闰年
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;o4=&amp;gt;inputoutput: 输出闰年
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;e=&amp;gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;st-&amp;gt;i-&amp;gt;cond1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond1(no)-&amp;gt;o1-&amp;gt;e
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond1(yes)-&amp;gt;cond2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond2(no)-&amp;gt;o3-&amp;gt;e
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond2(yes)-&amp;gt;cond3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond3(yes)-&amp;gt;o2-&amp;gt;e
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cond3(no)-&amp;gt;o4-&amp;gt;e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;实际例子2：&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>LCD显示太空人画面</title>
      <link>https://fan-pengfei.top/posts/lcd%E6%98%BE%E7%A4%BA%E5%A4%AA%E7%A9%BA%E4%BA%BA%E7%94%BB%E9%9D%A2/</link>
      <pubDate>Mon, 24 Jan 2022 09:52:39 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/lcd%E6%98%BE%E7%A4%BA%E5%A4%AA%E7%A9%BA%E4%BA%BA%E7%94%BB%E9%9D%A2/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;LCD 显示太空人动画；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个比较简单，就是把连续的画面播放起来就行；&lt;/p&gt;</description>
    </item>
    <item>
      <title>自制Jlink-OB(带串口)</title>
      <link>https://fan-pengfei.top/posts/%E8%87%AA%E5%88%B6jlink-ob%E5%B8%A6%E4%B8%B2%E5%8F%A3/</link>
      <pubDate>Sun, 23 Jan 2022 02:14:20 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E8%87%AA%E5%88%B6jlink-ob%E5%B8%A6%E4%B8%B2%E5%8F%A3/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;自制Jlink-ob(带串口)；&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>CRC校验原理</title>
      <link>https://fan-pengfei.top/posts/crc%E6%A0%A1%E9%AA%8C%E5%8E%9F%E7%90%86/</link>
      <pubDate>Sat, 08 Jan 2022 02:21:29 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/crc%E6%A0%A1%E9%AA%8C%E5%8E%9F%E7%90%86/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;之前经常用CRC校验，今天解释一下其原理；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;简单介绍&#34;&gt;简单介绍：&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Cyclic Redundancy Check循环冗余检验，是基于数据计算一组效验码，用于核对数据传输过程中是否被更改或传输错误。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;循环冗余校验检错方案（CRC）：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CRC校验原理看起来比较复杂，好难懂，因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题，其根本思想就是先在要发送的帧后面附加一个数（这个就是用来校验的校验码，但要注意，这里的数也是二进制序列的，下同），生成一个新帧发送给接收端。当然，这个附加的数不是随意的，它  要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除（注意，这里不是直接采用二进制除法，而是采用一种称之为“模2除法”）。到达接收端后，再把接收到的新帧除以（同样采用“模2除法”）这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数，做了“去余”处理（也就已经能整除了），所以结果应该是没有余数。如果有余数，则表明该帧在传输过程中出现了差错。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;【说明】&lt;/strong&gt;：“模2除法”与“算术除法”类似，但它既不向上位借位，也不比较除数和被除数的相同位数值的大小，只要以相同位数进行相除即可。模2加法运算为：1+1=0，0+1=1，0+0=0，无进位，也无借位；模2减法6运算为：1-1=0，0-1=1，1-0=1，0-0=0，也无进位，无借位。相当于二进制中的逻辑异或运算。也就是比较后，两者对应位相同则结果为“0”，不同则结果为“1”。如100101除以1110，结果得到商为11，余数为1，如图5-9左图所示。如11×11=101，如右图所示。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;最通俗的CRC校验原理剖析_深入理解计算机网络&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/crc%E6%A0%A1%E9%AA%8C%E5%8E%9F%E7%90%86/img-1.jpg&#34;&gt;
&lt;img alt=&#34;最通俗的CRC校验原理剖析_CRC_02&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/crc%E6%A0%A1%E9%AA%8C%E5%8E%9F%E7%90%86/img-2.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;“模2除法”和“模2乘法”示例&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;具体来说，CRC校验原理就是以下几个步骤：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;先选择（可以随机选择，也可按标准选择，具体在后面介绍）一个用于在接收端进行校验时，对接收的帧进行除法运算的除数（是二进制比较特串，通常是以多项方式表示，所以CRC又称多项式编码方法，这个多项式也称之为“生成多项式”）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;看所选定的除数二进制位数（假设为k位），然后在要发送的数据帧（假设为m位）后面加上k-1位“0”，然后以这个加了k-1个“0“的新帧（一共是m+k-1位）以“模2除法”方式除以上面这个除数，所得到的余数（也是二进制的比特串）就是该帧的CRC校验码，也称之为FCS（帧校验序列）。但要注意的是，余数的位数一定要是比除数位数只能少一位，哪怕前面位是0，甚至是全为0（附带好整除时）也都不能省略。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再把这个校验码附加在原数据帧（就是m位的帧，注意不是在后面形成的m+k-1位的帧）后面，构建一个新帧发送到接收端；最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数，如果没有余数，则表明该帧在传输过程中没出错，否则出现了差错。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;通过以上介绍，大家一定可以理解CRC校验的原理，并且不再认为很复杂吧。  从上面可以看出，CRC校验中有两个关键点：一是要预先确定一个发送端和接收端都用来作为除数的二进制比特串（或多项式）；二是把原始帧与上面选定的除进行二进制除法运算，计算出FCS。前者可以随机选择，也可按国际上通行的标准选择，但最高位和最低位必须均为“1”，如在IBM的SDLC（同步数据链路控制）规程中使用的CRC-16（也就是这个除数一共是17位）生成多项式g（x）= x^16 + x^15 + x^2 +1（对应二进制比特串为：11000000000000101）；而在ISO HDLC（高级数据链路控制）规程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16生成多项式g（x）= x^16+ x^15 + x^5 +1（对应二进制比特串为：11000000000100001）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;CRC校验码的计算示例&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;由以上分析可知，既然除数是随机，或者按标准选定的，所以CRC校验的关键是如何求出余数，也就是校验码（CRC校验码）。下面以一个例子来具体说明整个过程。现假设选择的CRC生成多项式为G（X） = X^4 + X^3 + 1，要求出二进制序列10110011的CRC校验码。下面是具体的计算过程：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;首先把生成多项式转换成二进制数，由G（X） = X^4+ X^3 + 1可以知道，它一共是5位（总位数等于最高位的幂次加1，即4+1=5），然后根据多项式各项的含义（多项式只列出二进制值为1的位，也就是这个二进制的第4位、第3位、第0位的二进制均为1，其它位均为0）很快就可得到它的二进制比特串为11001。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;因为生成多项式的位数为5，根据前面的介绍，得知CRC校验码的位数为4（校验码的位数比生成多项式的位数少1）。因为原数据帧10110011，在它后面再加4个0，得到101100110000，然后把这个数以“模2除法”方式除以生成多项式，得到的余数（即CRC码）为0100，如图所示。注意参考前面介绍的“模2除法”运算法则。
&lt;img alt=&#34;最通俗的CRC校验原理剖析_王达_03&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/crc%E6%A0%A1%E9%AA%8C%E5%8E%9F%E7%90%86/img-3.jpg&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CRC校验码计算示例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;把上步计算得到的CRC校验0100替换原始帧101100110000后面的四个“0”，得到新帧101100110100。再把这个新帧发送到接收端。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当以上新帧到达接收端后，接收端会把这个新帧再用上面选定的除数11001以“模2除法”方式去除，验证余数是否为0，如果为0，则证明该帧数据在传输过程中没有出现差错，否则出现了差错。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;通过以上CRC校验原理的剖析和CRC校验码的计算示例的介绍，大家应该对这种看似很复杂的CRC校验原理和计算方法应该比较清楚了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;算法原理&#34;&gt;算法原理：&lt;/h2&gt;
&lt;p&gt;假设数据传输过程中需要发送15位的二进制信息g=101001110100001，这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5+ 1，其中g中第k位的值，对应g(x)中x^k 的系数。将g(x)乘以x^m，既将g后加m个0，然后除以m阶多项式h(x)，得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。&lt;/p&gt;
&lt;p&gt;h(x)可以自由选择或者使用国际通行标准，一般按照h(x)的阶数m，将CRC算法称为CRC-m，比如CRC-32、CRC-64等。国际通行标准可以参看&lt;a href=&#34;http://en.wikipedia.org/wiki/Cyclic_redundancy_check&#34;&gt;标准&lt;/a&gt;；&lt;/p&gt;
&lt;p&gt;g(x)和h(x)的除运算，可以通过g和h做xor（异或）运算。比如将11001与10101做xor运算：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/crc%E6%A0%A1%E9%AA%8C%E5%8E%9F%E7%90%86/img-4.gif&#34;&gt;&lt;/p&gt;
&lt;p&gt;明白了xor运算法则后，举一个例子使用CRC-8算法求101001110100001的效验码。CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1，既h是9位的二进制串111010101。&lt;/p&gt;</description>
    </item>
    <item>
      <title>LVGL开发</title>
      <link>https://fan-pengfei.top/posts/lvgl%E5%BC%80%E5%8F%91/</link>
      <pubDate>Mon, 03 Jan 2022 05:17:26 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/lvgl%E5%BC%80%E5%8F%91/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近要做一个GUI界面，自己开发各种功能是极其麻烦的(对的，我之前是做过的)，需要注意很多问题，而且开发起来很多功能基本上是实现不了的，所以只能想其他办法了，因为之前用LVGL做过一个很简单的GUI界面，所以这次也打算用LVGL来做，也算是再复习一下这个界面的使用。
以下是关于LVGL的简介以及特点：
LVGL(Light and Versatile Graphics Library，轻巧而多功能的图形库)是一个免费的开放源代码图形库，它提供创建具有易于使用的图形元素，精美的视觉效果和低内存占用的嵌入式GUI所需的一切。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;lvgl主要特性&#34;&gt;LVGL主要特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;功能强大的构建块，例如按钮，图表，列表，滑块，图像等.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;带有动画，抗锯齿，不透明，平滑滚动的高级图形.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;各种输入设备，例如触摸板，鼠标，键盘，编码器等.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持UTF-8编码的多语言.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;多显示器支持，如TFT，单色显示器.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完全可定制的图形元素.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;独立于任何微控制器或显示器使用的硬件.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可扩展以使用很少的内存(64 kB闪存，16 kB RAM)进行操作.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;操作系统，支持外部存储器和GPU，但不是必需的.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;单帧缓冲区操作，即使具有高级图形效果.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用C语言编写，以实现最大的兼容性(与C ++兼容).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模拟器可在没有嵌入式硬件的PC上进行嵌入式GUI设计.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可移植到MicroPython.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可快速上手的教程、示例、主题.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;丰富的文档教程.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在MIT许可下免费和开源.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lvgl硬件要求&#34;&gt;LVGL硬件要求&lt;/h2&gt;
&lt;p&gt;基本上，每个现代控制器(肯定必须要能够驱动显示器)都适合运行LVGL。LVGL的最低运行要求很低：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;16、32或64位微控制器或处理器.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最低 16 MHz 时钟频率.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flash/ROM:：对于非常重要的组件要求 &amp;gt;64 kB(建议 &amp;gt; 180 kB).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RAM
静态 RAM 使用量：~2 kB，取决于所使用的功能和对象类型.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;堆栈： &amp;gt; 2kB(建议 &amp;gt; 8 kB).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动态数据(堆)：&amp;gt; 2 KB(如果使用多个对象，则建议 &amp;gt; 16 kB)。由 lv_conf.h 中的 LV_MEM_SIZE 宏进行设置.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;显示缓冲区：&amp;gt; “水平分辨率”像素(建议 &amp;gt; 10× “水平分辨率” ).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MCU 或外部显示控制器中的一帧缓冲区.&lt;/p&gt;</description>
    </item>
    <item>
      <title>小一升级版来了！</title>
      <link>https://fan-pengfei.top/posts/%E5%B0%8F%E4%B8%80%E5%8D%87%E7%BA%A7%E7%89%88%E6%9D%A5%E4%BA%86/</link>
      <pubDate>Wed, 22 Dec 2021 02:16:25 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%B0%8F%E4%B8%80%E5%8D%87%E7%BA%A7%E7%89%88%E6%9D%A5%E4%BA%86/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;小一升级版；&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>光电传感器判断转动方向</title>
      <link>https://fan-pengfei.top/posts/%E5%85%89%E7%94%B5%E4%BC%A0%E6%84%9F%E5%99%A8%E5%88%A4%E6%96%AD%E8%BD%AC%E5%8A%A8%E6%96%B9%E5%90%91/</link>
      <pubDate>Wed, 22 Dec 2021 01:47:01 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%85%89%E7%94%B5%E4%BC%A0%E6%84%9F%E5%99%A8%E5%88%A4%E6%96%AD%E8%BD%AC%E5%8A%A8%E6%96%B9%E5%90%91/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;​        最近接了一个项目，是做一个绕线机，一般用来绕变压器线圈，已经基本做好了，原理并不难，就是根据你输入的一些参数，比如漆包线的直径以及每一层的圈数还有就是一共要绕多少圈，然后由控制器控制步进电机根据光电传感器的信号来回运动，已达到均匀绕线的目的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其实这个项目拖了很长时间，因为自己拖延症太严重，而且中间又发生了很多事情，导致项目中间耽搁了很久，还好甲方没有在意，也没有太催我，上周终于下定决心要结束了这个项目，于是就用了一个下午还有晚上的时间完成了这个项目，因为手头没有合适的漆包线，于是就用了直径较细的焊锡丝代替，经过测试效果很好，因为步进电机的转动是通过细分的，所以可以做到很精细的控制，经过测试，精度可以达到0.0035mm，而甲方的要求是0.01mm，也算是完全符合要求了，于是我就把测试视频发给了甲方，甲方首先给予了肯定（那是必然呀，哈哈哈哈），然后给我发了一个红包，我一个疑惑，然后他就提出了一个新的需求，就是希望能够做到反转退线的功能，并且这种情况下能做到减计数。&lt;/p&gt;
&lt;p&gt;我思考了一下，觉得是可以做到的，用一个光电传感器是可以判断转动的次数，那用两个光电传感器就可以判断次数和转动方向，原理是根据两个光电传感器被遮挡的先后来判断转动方向，例如光电1先被遮挡，然后光电2又被遮挡，则认为是正转，反之则认为是反转，理论可行，就差一个实践了，于是就修改了一下硬件（因为第一版硬件只留出了一个光电接口，而且少画了一个二极管），又发去打了一次板，板子还没到，所以也还没开始验证，应该是可以的，所以就等之后板子到了再验证下。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;板子已经到了，经过验证，完全没问题，算是满足了甲方所有的要求，很开心，也收到了剩下的款项，基本这个项目是告一段落了；
下边是关于这个算法的程序：&lt;/p&gt;
&lt;/blockquote&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-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;HAL_GPIO_EXTI_Callback&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; GPIO_Pin)
&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;uint32_t&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;if&lt;/span&gt; (GPIO_Pin &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; guangdian_Pin)
&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;        i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;65535&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;while&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;--&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;        i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6553&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;while&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;--&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:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;HAL_GPIO_ReadPin&lt;/span&gt;(guangdian_GPIO_Port, guangdian_Pin) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;if&lt;/span&gt; (flag_stop &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#66d9ef&#34;&gt;if&lt;/span&gt; (cnt_sum &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;                    flag_dir &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; N0;
&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;if&lt;/span&gt; (cnt_sum &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; N2 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;                    flag_dir &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;flag_dir;
&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;if&lt;/span&gt; (time_k1_temp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Windows使用技巧</title>
      <link>https://fan-pengfei.top/posts/windows%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</link>
      <pubDate>Sat, 02 Oct 2021 08:29:25 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/windows%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Windows 使用技巧;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;应用程序自启动&#34;&gt;应用程序自启动&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;1、在Windows10桌面，右键点击桌面左下角的开始按钮，在弹出的菜单中选择”运行”菜单项.
2、这时就会打开Windows10的运行窗口，在窗口中输入命令shell:startup，然后点击确定按钮.
3、这时就可以打开Windows10系统的启动文件夹.
4、把需要开机启动的应用或是程序的快捷方式拖动到该文件夹中，这样以后电脑开机的时候，就会自动启动这些应用.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;添加右键新建markdown文档&#34;&gt;添加右键新建Markdown文档&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;1、在电脑桌面右键一个.txt文本(文档名随便，文档内容如下)；&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Windows Registry Editor Version 5.00
&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;[&lt;/span&gt;HKEY_CLASSES_ROOT&lt;span style=&#34;color:#ae81ff&#34;&gt;\.&lt;/span&gt;md&lt;span style=&#34;color:#f92672&#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:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MarkdownFile&amp;#34;&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:#e6db74&#34;&gt;&amp;#34;PerceivedType&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&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:#e6db74&#34;&gt;&amp;#34;Content Type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text/plain&amp;#34;&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;[&lt;/span&gt;HKEY_CLASSES_ROOT&lt;span style=&#34;color:#ae81ff&#34;&gt;\.&lt;/span&gt;md&lt;span style=&#34;color:#ae81ff&#34;&gt;\S&lt;/span&gt;hellNew&lt;span style=&#34;color:#f92672&#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:#f92672&#34;&gt;[&lt;/span&gt;HKEY_CLASSES_ROOT&lt;span style=&#34;color:#ae81ff&#34;&gt;\M&lt;/span&gt;arkdownFile&lt;span style=&#34;color:#f92672&#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:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Markdown File&amp;#34;&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;[&lt;/span&gt;HKEY_CLASSES_ROOT&lt;span style=&#34;color:#ae81ff&#34;&gt;\M&lt;/span&gt;arkdownFile&lt;span style=&#34;color:#ae81ff&#34;&gt;\D&lt;/span&gt;efaultIcon&lt;span style=&#34;color:#f92672&#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:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%SystemRoot%\system32\imageres.dll,-102&amp;#34;&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;[&lt;/span&gt;HKEY_CLASSES_ROOT&lt;span style=&#34;color:#ae81ff&#34;&gt;\M&lt;/span&gt;arkdownFile&lt;span style=&#34;color:#ae81ff&#34;&gt;\s&lt;/span&gt;hell&lt;span style=&#34;color:#f92672&#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:#f92672&#34;&gt;[&lt;/span&gt;HKEY_CLASSES_ROOT&lt;span style=&#34;color:#ae81ff&#34;&gt;\M&lt;/span&gt;arkdownFile&lt;span style=&#34;color:#ae81ff&#34;&gt;\s&lt;/span&gt;hell&lt;span style=&#34;color:#ae81ff&#34;&gt;\o&lt;/span&gt;pen&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2、修改文档的后缀为.reg；
3、双击打开这个.reg文档；
4、点击确定写进注册表；
5、在桌面右键刷新，然后新建就看到有markdown啦；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;取消右键新建文件以visio文件为例&#34;&gt;取消右键新建文件(以visio文件为例)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;1、WIN+R；
2、输入regedit，enter确认，打开注册表编辑器；
3、在第一项HKEY_CLASSES_ROOT中找到对应的后缀名(例如.vsdx)；
4、删去该项的子项-&amp;gt;ShellNew；
&lt;img alt=&#34;8e1686b424d6d058e33837cd304b045&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/windows%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/img-1.png&#34;&gt;
&lt;img alt=&#34;95bc7aa3a625bb0bed08dfa657c80af&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/windows%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/img-2.png&#34;&gt;
5、再次右键新建文件即可发现已经修改成功；&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Arduino</title>
      <link>https://fan-pengfei.top/posts/arduino/</link>
      <pubDate>Sat, 02 Oct 2021 08:16:16 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/arduino/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近做项目用到了Arduino的板子，在此记录一下开发过程中遇到的一些问题，其实我之前是很不情愿用Arduino，觉得底层都被封装起来了，而且那个IDE用起来真的是一言难尽。不过最近客户要求用Arduino进行开发，就硬着头皮上了，结果发现用VScode+Platformio开发Arduino还是顶好用的，而且有太多可以用的封装好的函数了，真香！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h3 id=&#34;一个io引脚驱动两个不同颜色的led&#34;&gt;一个IO引脚驱动两个不同颜色的LED&lt;/h3&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;用一个IO引脚驱动两个led灯&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/arduino/img-1.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这个电路可以实现，一个IO引脚驱动两个不同颜色的LED，不过自己只测试过红色和绿色的LED，其他颜色的并没有验证，因为似乎红色和绿色对电压的要求较低。&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>stc单片机使用技巧</title>
      <link>https://fan-pengfei.top/posts/stc%E5%8D%95%E7%89%87%E6%9C%BA%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</link>
      <pubDate>Thu, 30 Sep 2021 10:34:27 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/stc%E5%8D%95%E7%89%87%E6%9C%BA%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近做项目经常用到STC的单片机，在使用过程中遇到了较多的问题，而且在后续的硬件搭建过程中也积累了不少的经验，因此打算记录一下，方便以后的查询。&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>蜂鸣器驱动电路</title>
      <link>https://fan-pengfei.top/posts/%E8%9C%82%E9%B8%A3%E5%99%A8%E9%A9%B1%E5%8A%A8%E7%94%B5%E8%B7%AF/</link>
      <pubDate>Thu, 30 Sep 2021 10:34:27 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E8%9C%82%E9%B8%A3%E5%99%A8%E9%A9%B1%E5%8A%A8%E7%94%B5%E8%B7%AF/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近做项目用到了51单片机驱动蜂鸣器，但是一直无法驱动，后来以为是上拉电阻问题，结果发现加了上拉电阻会一直响，即使IO口输出为低电平。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​        后来发现还需要加一个下拉电阻以保证不受干扰。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E8%9C%82%E9%B8%A3%E5%99%A8%E9%A9%B1%E5%8A%A8%E7%94%B5%E8%B7%AF/img-1.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://blog.csdn.net/qq_25814297/article/details/118696321?spm=1001.2014.3001.5506&#34;&gt;https://blog.csdn.net/qq_25814297/article/details/118696321?spm=1001.2014.3001.5506&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  下面就 3.3V NPN 三极管驱动有源蜂鸣器设计，从实际产品中分析电路设计存在的问题，提出电路的改进方案，使读者能从小小的蜂鸣器电路中学会分析和改进电路的方法，从而设计出更优秀的产品，达到抛砖引玉的效果。&lt;/p&gt;
&lt;h1 id=&#34;常见错误接法&#34;&gt;常见错误接法&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;图片&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E8%9C%82%E9%B8%A3%E5%99%A8%E9%A9%B1%E5%8A%A8%E7%94%B5%E8%B7%AF/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;  图1 为典型的错误接法，当 BUZZER 端输入高电平时蜂鸣器不响或响声太小。当 I/O 口为高电平时，基极电压为 3.3/4.7*3.3V≈2.3V，由于三极管的压降 0.6~0.7V，则三极管射 极电压为 2.3-0.7=1.6V，驱动电压太低导致蜂鸣器无法驱动或者响声很小。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;图片&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E8%9C%82%E9%B8%A3%E5%99%A8%E9%A9%B1%E5%8A%A8%E7%94%B5%E8%B7%AF/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;图2 错误接法2&lt;/p&gt;
&lt;p&gt;  图2 为第二种典型的错误接法，由于上拉电阻R2，BUZZER 端在输出低电平时，由于 电阻R1和R2的分压作用，三极管不能可靠关断。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;图片&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E8%9C%82%E9%B8%A3%E5%99%A8%E9%A9%B1%E5%8A%A8%E7%94%B5%E8%B7%AF/img-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;  图3 为第三种错误接法，三极管的高电平门槛电压就只有 0.7V，即在 BUZZER 端输入 压只要超过0.7V就有可能使三极管导通，显然0.7V的门槛电压对于数字电路来说太低了， 电磁干扰的环境下，很容易造成蜂鸣器鸣叫。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;图片&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E8%9C%82%E9%B8%A3%E5%99%A8%E9%A9%B1%E5%8A%A8%E7%94%B5%E8%B7%AF/img-5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;  图 4 为第四种错误接法，当CPU的GPIO管脚存在内部下拉时，由于 I/O 口存在输入阻抗，也可能导致三极管不能可靠关断，而且和图3一样BUZZER端输入电压只要超过0.7V就有可能使三极管导通。&lt;/p&gt;
&lt;p&gt;  以上几种用法我觉得也不能说是完全不行，对于器件的各种参数要求会比较局限，不利于器件选型，抗干扰性能也比较差。&lt;/p&gt;
&lt;h1 id=&#34;npn-三极管控制有源蜂鸣器常规设计&#34;&gt;NPN 三极管控制有源蜂鸣器常规设计&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;图片&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E8%9C%82%E9%B8%A3%E5%99%A8%E9%A9%B1%E5%8A%A8%E7%94%B5%E8%B7%AF/img-6.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;  图 5 为通用有源蜂鸣器的驱动电路。电阻R1为限流电阻，防止流过基极电流过大损坏三极管。电阻R2有着重要的作用，第一个作用：R2 相当于基极的下拉电阻。如果A端被悬空则由于R2的存在能够使三极管保持在可靠的关断状态，如果删除R2则当BUZZER输入端悬空时则易受到干扰而可能导致三极管状态发生意外翻转或进入不期望的放大状态，造成蜂鸣器意外发声。第二个作用：R2可提升高电平的门槛电压。如果删除R2，则三极管的高电平门槛电压就只有0.7V，即A端输入电压只要超过0.7V 就有可能导通，添加R2的情况就不同了，当从A端输入电压达到约2.2V 时三极管才会饱和导通，具体计算过程如下：&lt;/p&gt;
&lt;p&gt;  假定β =120为晶体管参数的最小值，蜂鸣器导通电流是15mA。那么集电极电流IC=15mA。则三极管刚刚达到饱和导通时的基极电流是 IB=15mA/120=0.125mA。流经R2的电流是0.7V/3.3kΩ=0.212mA，流经R1的电流 IR1=0.212mA +0.125mA=0.337 mA。最后算出BUZZER端的门槛电压是0.7V+0.337mA× 4.7kΩ=2.2839V≈2.3V。&lt;/p&gt;
&lt;p&gt;  图中的C2为电源滤波电容，滤除电源高频杂波。C1可以在有强干扰环境下，有效的滤除干扰信号，避免蜂鸣器变音和意外发声，在 RFID射频通讯、Mifare卡的应用时，这里初步选用0.1uF 的电容，具体可以根据实际情况选择。&lt;/p&gt;
&lt;h1 id=&#34;改进方案&#34;&gt;改进方案&lt;/h1&gt;
&lt;p&gt;  蜂鸣器竟然有EMI 辐射？！在 NPN 3.3V 控制有源蜂鸣器时，在电路的 BUZZER 输入 高电平，让蜂鸣器鸣叫，检测蜂鸣器输入管脚（NPN 三极管的C极处信号，发现蜂鸣器在发声时，向外发生1.87KHz，-2.91V 的脉冲信号，如图 6 所示。&lt;/p&gt;</description>
    </item>
    <item>
      <title>GCC学习记录</title>
      <link>https://fan-pengfei.top/posts/gcc%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Thu, 02 Sep 2021 01:20:43 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/gcc%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;GCC常用命令；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;1-什么是gcc&#34;&gt;1. 什么是gcc&lt;/h2&gt;
&lt;p&gt;gcc的全称是GNU Compiler Collection，它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器（GNU C Compiler），现在除了c语言，还支持C++、java、Pascal等语言。gcc支持多种硬件平台。&lt;/p&gt;
&lt;h2 id=&#34;2-gcc的特点&#34;&gt;2. gcc的特点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;gcc是一个可移植的编译器，支持多种硬件平台。例如ARM、X86等等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gcc不仅是个本地编译器，它还能跨平台交叉编译。所谓的本地编译器，是指编译出来的程序只能够在本地环境进行运行。而gcc编译出来的程序能够在其他平台进行运行。例如嵌入式程序可在x86上编译，然后在arm上运行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gcc有多种语言前端，用于解析不同的语言。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gcc是按模块化设计的，可以加入新语言和新CPU架构的支持。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gcc是自由软件。任何人都可以使用或更改这个软件。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-gcc编译程序的过程&#34;&gt;3. gcc编译程序的过程&lt;/h2&gt;
&lt;p&gt;gcc编译程序主要经过四个过程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;预处理（Pre-Processing）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编译 （Compiling）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;汇编 （Assembling）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;链接 （Linking）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/gcc%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/img-1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;预处理实际上是将头文件、宏进行展开。编译阶段，gcc调用不同语言的编译器，例如c语言调用编译器ccl。gcc实际上是个工具链，在编译程序的过程中调用不同的工具。汇编阶段，gcc调用汇编器进行汇编。链接过程会将程序所需要的目标文件进行链接成可执行文件。汇编器生成的是可重定位的目标文件，学过操作系统，我们知道，在源程序中地址是从0开始的，这是一个相对地址，而程序真正在内存中运行时的地址肯定不是从0开始的，而且在编写源代码的时候也不能知道程序的绝对地址，所以&lt;strong&gt;重定位&lt;/strong&gt;能够将源代码的代码、变量等定位为内存具体地址。下面以一张图来表示这个过程，注意过程中文件的后缀变化，编译选项和这些后缀有关。&lt;/p&gt;
&lt;p&gt;这是GCC编译的四个步骤。&lt;/p&gt;
&lt;h2 id=&#34;4-gcc常用选项&#34;&gt;4. gcc常用选项&lt;/h2&gt;
&lt;p&gt;来看一下gcc常用选项&lt;/p&gt;
&lt;p&gt;选项名
作用&lt;/p&gt;
&lt;p&gt;-o
产生目标（.i、.s、.o、可执行文件等）&lt;/p&gt;
&lt;p&gt;-E
只运行C预编译器&lt;/p&gt;
&lt;p&gt;-S
告诉编译器产生汇编程序文件后停止编译，产生的汇编语言文件拓展名为.s&lt;/p&gt;
&lt;p&gt;-c
通知gcc取消连接步骤，即编译源码，并在最后生成目标文件&lt;/p&gt;
&lt;p&gt;-Wall
使gcc对源文件的代码有问题的地方发出警告&lt;/p&gt;
&lt;p&gt;-Idir
将dir目录加入搜索头文件的目录路径&lt;/p&gt;
&lt;p&gt;-Ldir
将dir目录加入搜索库的目录路径&lt;/p&gt;
&lt;p&gt;-llib
连接lib库&lt;/p&gt;
&lt;p&gt;-g
在目标文件中嵌入调试信息，以便gdb之类的调试程序调试&lt;/p&gt;
&lt;p&gt;现在我们有源文件hello.c，下面是一些gcc的使用示例：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc -E hello.c -o hello.i   对hello.c文件进行预处理，生成了hello.i 文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc -S hello.i -o hello.s    对预处理文件进行编译，生成了汇编文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc -c hello.s -o hello.o  对汇编文件进行编译，生成了目标文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc hello.o -o hello 对目标文件进行链接，生成可执行文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc hello.c -o hello 直接编译链接成可执行目标文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc -c hello.c 或 gcc -c hello.c -o hello.o 编译生成可重定位目标文件
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用gcc时可以加上-Wall选项。下面这个例子如果不加上-Wall选项，编译器不会报出任何错误或警告，但是程序的结果却不是预期的：&lt;/p&gt;</description>
    </item>
    <item>
      <title>VSCode格式化美化代码</title>
      <link>https://fan-pengfei.top/posts/vscode%E6%A0%BC%E5%BC%8F%E5%8C%96%E7%BE%8E%E5%8C%96%E4%BB%A3%E7%A0%81/</link>
      <pubDate>Wed, 25 Aug 2021 11:04:25 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/vscode%E6%A0%BC%E5%BC%8F%E5%8C%96%E7%BE%8E%E5%8C%96%E4%BB%A3%E7%A0%81/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;vscode代码美化；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1）文件 —&amp;gt; 首选项&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;因为 VSCode 默认启用了根据文件类型自动设置tabsize的选项，在设置中添加：&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;editor.detectIndentation&amp;#34;&lt;/span&gt;: false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2）编辑器配置&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在项目文件中新建 .editorconfig 文件为特定类型文件指定缩进大小、缩进类型（空格，或tab），是否自动插入末行等等。&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; true
&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:#f92672&#34;&gt;[&lt;/span&gt;*&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;charset &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; utf-8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;indent_style &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tab
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;indent_size &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &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;insert_final_newline &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;trim_trailing_whitespace &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; true
&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:#f92672&#34;&gt;[&lt;/span&gt;*.md&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;max_line_length &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; off
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;trim_trailing_whitespace &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3）安装 VsCode 格式化代码插件&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;搜索并安装 Beautify 格式化代码插件
打开要格式化的文件 —&amp;gt; F1 —&amp;gt; Beautify file —&amp;gt; 选择你要格式化的代码类型&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4）格式化对齐快捷键：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows： &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;K&lt;/code&gt; + &lt;code&gt;F&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows：&lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;Alt&lt;/code&gt; + &lt;code&gt;F&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mac： &lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;Option&lt;/code&gt; + &lt;code&gt;F&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ubuntu： &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;I&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>H750枚举U盘拖拽式BootLoader&#43;外部spi_flash</title>
      <link>https://fan-pengfei.top/posts/h750%E6%9E%9A%E4%B8%BEu%E7%9B%98%E6%8B%96%E6%8B%BD%E5%BC%8Fbootloader&#43;%E5%A4%96%E9%83%A8spi_flash/</link>
      <pubDate>Sun, 22 Aug 2021 07:31:15 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/h750%E6%9E%9A%E4%B8%BEu%E7%9B%98%E6%8B%96%E6%8B%BD%E5%BC%8Fbootloader&#43;%E5%A4%96%E9%83%A8spi_flash/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;程序已经写好了；
Github地址:&lt;a href=&#34;https://github.com/fan-pengfei/Bootloader_H750_SD/tree/master&#34;&gt;https://github.com/fan-pengfei/Bootloader_H750_SD/tree/master&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>oled使用技巧</title>
      <link>https://fan-pengfei.top/posts/oled%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</link>
      <pubDate>Fri, 20 Aug 2021 02:19:46 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/oled%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;OLED 局部刷新提高帧率.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;待续&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;</description>
    </item>
    <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>
    <item>
      <title>Git学习记录</title>
      <link>https://fan-pengfei.top/posts/git%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Wed, 18 Aug 2021 04:29:14 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/git%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Git相关的知识；
参考链接：&lt;a href=&#34;https://zhuanlan.zhihu.com/p/94008510&#34;&gt;https://zhuanlan.zhihu.com/p/94008510&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;git-常用命令&#34;&gt;Git 常用命令&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;初次使用时，在命令行中配置本地仓库的账号和邮箱：&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git config --global user.name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;username&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git config --global user.email &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;useremail&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;初始化Git,使用 cd 命令导航到要在终端中设置版本控制的目录，现在你可以像这样初始化 Git 存储库：&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;要开始对现有文件进行版本控制，你应该先跟踪这些文件并进行初始提交。要做到这一点，你首先需要将文件添加到 Git 中，并将它们附加到 Git 项目中。&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;first commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;还有一些更高级的方法可以将文件添加到 Git 中，从而使你的工作流程更高效。我们可以执行以下操作，而不是试图查找所有有更改的文件并逐个添加它们：&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;git add filename
&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;# 添加当前目录中的所有文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add -A
&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;# 添加当前目录中的所有文件更改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .
&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;# 选择要添加的更改（你可以 Y 或 N 完成所有更改）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;远程备份文件（Github）,因此，首先转到 &lt;a href=&#34;https://link.zhihu.com/?target=http%3A//github.com&#34;&gt;http://github.com&lt;/a&gt; 并创建一个存储库。然后，使用存储库的链接将其添加为本地 git 项目的来源，即该代码的存储位置；&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git remote add origin &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://github.com/fan-pengfei/bash_learning.git
&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>
    <item>
      <title>typora图片上传出错</title>
      <link>https://fan-pengfei.top/posts/typora%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0%E5%87%BA%E9%94%99/</link>
      <pubDate>Tue, 17 Aug 2021 13:00:31 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/typora%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0%E5%87%BA%E9%94%99/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Typora问题记录；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;图片上传出错问题解决办法&#34;&gt;图片上传出错问题解决办法：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;1、名字重复
2、服务器端口出错
3、图床owner\repo填写出错&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Windows10 Bat脚本</title>
      <link>https://fan-pengfei.top/posts/windows10-bat%E8%84%9A%E6%9C%AC/</link>
      <pubDate>Tue, 17 Aug 2021 12:41:10 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/windows10-bat%E8%84%9A%E6%9C%AC/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;常用bat脚本；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;windows-bat脚本&#34;&gt;Windows bat脚本：&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;依次执行多条命令，并且执行完执行完毕并不退出：&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/*upload.bat:博客自动上传脚本*/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;call hexo clean //
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;call hexo g //博客生成
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;call hexo d //博客上传
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pause //页面暂停
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;同时执行多条命令，并且执行完执行完毕并不退出（以下例子仅仅说明语法，并不代表可用）：&lt;/p&gt;
&lt;/blockquote&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/*upload.bat:博客自动上传脚本*/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;start hexo clean //
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;start hexo g //博客生成
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;start hexo d //博客上传
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pause //页面暂停
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;脚本运行结果：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/windows10-bat%E8%84%9A%E6%9C%AC/img-1.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hexo&#43;Yilia搭建自己的博客</title>
      <link>https://fan-pengfei.top/posts/hexo&#43;yilia%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E5%8D%9A%E5%AE%A2/</link>
      <pubDate>Tue, 17 Aug 2021 07:19:40 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/hexo&#43;yilia%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E5%8D%9A%E5%AE%A2/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;搭建自己的博客；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;缘起&#34;&gt;缘起&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;一直想着要搭建一个属于自己的博客，感觉这样子很酷很酷，也是正好记录一下自己学习中遇到的问题，就当做一个笔记本来用吧！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;原先想着用树莓派做服务器就可以搭建自己的的个人网站用来写博客，先在阿里云上购买了域名，其实最后是买了两个：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fan-pengfei.top
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fan-pengfei.xyz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;为啥买了两个呢？&lt;/p&gt;
&lt;h1 id=&#34;波折&#34;&gt;波折&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;其实是我自己太粗心大意了，在二月份的时候自己就买了.xyz这一个域名，后来忙其他的事就把这件事搁置了；注册新域名的时候发现这个已经被注册了（没想到是自己之前注册的），所以没办法，只能感慨与自己同名同姓的人真多，然后就注册了.top域名;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;注册完才发现，自己的域名控制台上竟然有两个域名，这才让我想起尘封已久的记忆，不过头一个快过期了，就用第二个搭建了这个个人网站；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://fan-pengfei.top&#34;&gt;https://fan-pengfei.top&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;前两天闲来无事，就又想折腾一下搭建自己博客的事；找了很多资料，终于还是将这个博客搭建起来了，挺简约的，自己很喜欢，毕竟博客就是用来记录自己学习到的知识，所以博客的内容应该更加重要。&lt;/p&gt;
&lt;h1 id=&#34;步骤&#34;&gt;步骤&lt;/h1&gt;
&lt;h2 id=&#34;一配置github&#34;&gt;一、配置Github&lt;/h2&gt;
&lt;p&gt;首先注册、登录： &lt;a href=&#34;https://github.com/&#34;&gt;https://github.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;记住自己的Username（很重要）；&lt;/p&gt;
&lt;p&gt;然后右上角选择 Create a new repository；&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Repository name&lt;/code&gt; -&amp;gt;填自己的名字, &lt;code&gt;yourname.github.io&lt;/code&gt;-&amp;gt;这个就是你博客的域名了(yourname与你的注册用户名一致)；&lt;/p&gt;
&lt;p&gt;例如，我的域名是&lt;code&gt;github.com/fan-pengfei&lt;/code&gt;，就填入&lt;code&gt;fan-pengfei.github.io&lt;/code&gt;；&lt;/p&gt;
&lt;h2 id=&#34;二配置环境&#34;&gt;二、配置环境&lt;/h2&gt;
&lt;p&gt;安装 Node.js： &lt;a href=&#34;https://nodejs.org/en/&#34;&gt;https://nodejs.org/en/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安装 Git： &lt;a href=&#34;https://github.com/waylau/git-for-win&#34;&gt;https://github.com/waylau/git-for-win&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安装完成后，在开始菜单里找到Git-&amp;gt;Git Bash，打开，并依次执行以下命令：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global user.name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;username&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global user.email &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;useremail&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中名称和邮箱都是Github注册时自己的名字和邮箱；&lt;/p&gt;
&lt;p&gt;安装 Hexo，所有必备的应用程序安装完成后，即可使用 npm 安装 Hexo:&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install -g hexo-cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;至此环境安装完毕（推荐使用cmder，超级好用的）;&lt;/p&gt;
&lt;h2 id=&#34;三电脑设置&#34;&gt;三、电脑设置&lt;/h2&gt;
&lt;p&gt;在电脑E盘（自己随意）目录下新建文件夹my_blog，进入my_blog，按住Shift键点击鼠标右键，选择&lt;code&gt;Cmder Here&lt;/code&gt;；因为我有安装Cmder，没有安装的点击“在此处打开命令窗口”，输入：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hexo init blog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;稍微等待下，速度有点慢，成功后将提示：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INFO  Start blogging with Hexo!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重新打开CMD，输入：&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen -t rsa -C &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Github的注册邮箱地址&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一路Enter过来就好，得到信息：&lt;/p&gt;</description>
    </item>
    <item>
      <title>构建荔枝派zero完整系统以及运行QT程序</title>
      <link>https://fan-pengfei.top/posts/%E6%9E%84%E5%BB%BA%E8%8D%94%E6%9E%9D%E6%B4%BEzero%E5%AE%8C%E6%95%B4%E7%B3%BB%E7%BB%9F%E4%BB%A5%E5%8F%8A%E8%BF%90%E8%A1%8Cqt%E7%A8%8B%E5%BA%8F/</link>
      <pubDate>Tue, 17 Aug 2021 07:19:26 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E6%9E%84%E5%BB%BA%E8%8D%94%E6%9E%9D%E6%B4%BEzero%E5%AE%8C%E6%95%B4%E7%B3%BB%E7%BB%9F%E4%BB%A5%E5%8F%8A%E8%BF%90%E8%A1%8Cqt%E7%A8%8B%E5%BA%8F/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;荔枝派使用记录；&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>我的第一个作品——小一</title>
      <link>https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E5%93%81%E5%B0%8F%E4%B8%80/</link>
      <pubDate>Sun, 16 Aug 2020 12:15:20 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E5%93%81%E5%B0%8F%E4%B8%80/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;自从前几个月学了51单片机和stm32，我就一直想着做一个自己的作品，后来思来想去，就产生了做一个小型钟表的想法。既然是自己的作品，那么从设计电路板，到焊接电子元件，再到程序的编写，再到最后的调试和Debug，都应该是自己独立完成。想法有了，然后就开始动手制作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;因为之前在焊洞洞板的时候，发现精细的电路是很难用洞洞板焊接的，所以就开始在网上找资料学习画PCB电路板，刚开始是找的凡亿教育的视频来看，虽然讲的很好，但是好像不太适合我这种刚入门的小白，在我苦苦盯着视频研究了大半天却一脸懵之后，我最后决定还是自己摸索，不懂的，直接问度娘，不得不说，度娘真的帮了我好多。&lt;/p&gt;
&lt;p&gt;然后又花了半天时间发现问题，解决问题，然后就突然什么都明白了，也理解了元件库，封装库，原理图和pcb文件之间的关系，也学会了自己画封装库和元件库，一切好像都是水到渠成。最后就又花了几天的时间绘制并打样了我的第一块电路板（不得不说，嘉立创的五元包邮的板子真的太香了）。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E5%93%81%E5%B0%8F%E4%B8%80/img-1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E5%93%81%E5%B0%8F%E4%B8%80/img-2.jpg&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这个板子很简单，却为小一的诞生奠定了基础。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;画了这个小核心板之后，就开始画小一了，因为需要先确定下所使用的芯片，所以在画板子之前，我开始选择所需要的芯片，最后决定主控芯片选择宏晶公司的stc15w408as，因为这个芯片小体积价格便宜却有着强大的功能，而且外围电路也极其简单。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E5%93%81%E5%B0%8F%E4%B8%80/img-3.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;考虑到我想要实现的功能，又选择了Ds1302时钟芯片，LM75a温度测量芯片，微型蜂鸣器，纽扣电池，以及实现程序下载的CH340G芯片。&lt;/p&gt;
&lt;p&gt;画了很久才终于画出了pcb电路图，主要是布线和器件布局太麻烦，一动不动画了好几个下午，最后终于成功了，便把pcb文件发给嘉立创，几天后，元件和电路板几乎同时到了，让我很不开心的是，等我收到板子之后，才发现板子有很多的错误，比如开关选择的型号不对；电路板上丝印很不清晰，甚至都重合在一起，无法辨识；有些线还连接有错误，我很是沮丧，最后我只好用来练习焊接贴片元件，物尽其用。&lt;/p&gt;
&lt;p&gt;然后就是修改原理图和pcb文件，然后把pcb文件又一次发个嘉立创，又过了几天，板子才到。我迫不及待的开始焊接，好难啊，即使我已经买了936焊台，但是因为我贴片元件焊接的经验实在是太少了，所以还是焊了好长的时间，最后终于焊好了，我在内心祈祷着，很怕电源一接通，就会短路，板子会烧掉。结果还好，电源指示灯成功点亮，然后就开始尝试下载程序，结果却是失败，最后又找了好久才发现问题所在。原因是我没有考虑到单片机下载程序时需要冷启动，最后又飞了好几根线，才终于下载成功。开心爆了！！！&lt;/p&gt;
&lt;p&gt;然后又依次下载了一些测试程序，结果又发现了一些问题，比如走时不太准，纽扣电池掉电太快，又想了好久才解决这些问题。走时不准是因为我的手上有静电，会使走时受到干扰；纽扣电池掉电太快，是因为有一根线连错了，然后又飞了一根线，加了两个电容，然后终于可以了，可以实现所有的功能了。这些事情说着简单，其实真的很难，那些问题都太奇怪了，网上根本找不到资料，都是一点点试出来的，太难了。然后就是漫长的软件开发过程了，这可是比硬件更难的啊。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E5%93%81%E5%B0%8F%E4%B8%80/img-4.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E5%93%81%E5%B0%8F%E4%B8%80/img-5.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E5%93%81%E5%B0%8F%E4%B8%80/img-6.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;软件开发又花了好长的时间，写了好久，然后终于可以写好了，现在当然还是有一些bug，不过都是小问题，大概的已经OK了。程序加起来有好几千行，一个模块是一个C文件和H文件，模块化程序，可以让以后移植程序变得很方便。最后大概实现以下功能：&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-bash&#34; data-lang=&#34;bash&#34;&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;温度测量（分辨率0.125℃，测量范围:-55℃～+125℃）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;可设置闹钟（也可作为定时器，可设置的时间范 围:1s～24小时，到设定时间有蜂鸣器提醒）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;秒表（最小精度1ms，可中途暂停，可清零）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;电压表（范围:0～5V,精确度:10位精度AD转换）（改程序ing，因为有bug）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E5%93%81%E5%B0%8F%E4%B8%80/img-7.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%9C%E5%93%81%E5%B0%8F%E4%B8%80/img-8.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;基本不可能有其他功能了，因为STC15W408AS只有8kflash,而现在的程序文件已经7.56k了，只能等以后换用更强大的芯片，才能有更多的功能了。演示视频我放在下面了，也算是比较成功吧，我还是超级满意的呀。&lt;/p&gt;
&lt;p&gt;因为飞线很不美观，所以我打算升级小一，PCB电路图已经画好了，应该是不会再有前两版的那些错误了，而且加入了新的功能，比如可以用锂电池供电，给锂电池充电等功能。&lt;/p&gt;
&lt;p&gt;哈哈，超开心，小一是我真正意义上的第一件作品，希望我以后会有更多的作品，小一会有更多的兄弟姐妹，也会升级小一，给他更强大的大脑，拥有更多的功能。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;有兴趣的兄弟姐妹，可以跟我交流，我可以帮你们解决一些我力所能及的问题。&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>我的第一篇博客</title>
      <link>https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E7%AF%87%E5%8D%9A%E5%AE%A2/</link>
      <pubDate>Sun, 16 Aug 2020 04:56:20 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E7%AF%87%E5%8D%9A%E5%AE%A2/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;上大学后，第一次接触到单片机和电路设计，我便觉得这将是我一生所爱。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;从小学到初中，我一直都算是一个爱折腾的小孩子，对什么都特别的有兴趣，拆过很多东西，电器，玩具，不计其数。那时候，什么也不懂，就自己折腾着玩。&lt;/p&gt;
&lt;p&gt;记得有一段时间，自己很想有一架自己的遥控飞机，刚开始就觉得有翅膀，有电机，就能飞起来，甚至还用塑料片子和泡沫做了一架原型，最后当然失败了，然后又自己用手机在网上搜索，才明白原来做一个遥控飞机是那么的复杂，要有舵机，起落架，能产生升力的机翼，还要有无刷电机，遥控装置，这些对于当时的我来说都是遥不可及的东西，最后这个做飞机的事情也不了了之了。&lt;/p&gt;
&lt;p&gt;到了初三的时候，用仅有的钱在淘宝上买了无刷电机和电调，但是却无论如何无法让电机转起来，一直不知道是什么原因，后来就上网上找资料，最后发现是缺少一个控制的东西，然后就在淘宝买了一个舵机测试仪，最后终于转起来了，（直到不久前，我才明白舵机控制仪的原理，是通过旋钮，来控制输出一定占空比的脉冲，然后当做信号驱动电机或者舵机，用来控制电机转速，或者说舵机转动的角度，前几天我已经用单片机输出脉冲成功驱动我买到的舵机。）当时真的是激动极了，而且那无刷电机的转速超过我玩过的任何一个电机。当时拍的视频，现在还能找到。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E7%AF%87%E5%8D%9A%E5%AE%A2/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;后来有一段时间又迷上了土豆炮，是偶然间在网上看见的，然后就开始自己制作，原理很简单，就是在密闭容器内放入可燃气体，然后用电火花将气体点燃即可。燃料燃烧，气体膨胀，就会将填充的土豆发射出去，威力挺大。第一次做就做成功了，土豆炮弹的威力让我很是满意。后来改进了好多的版本，有迷你版本的，是用打火机做的，特别小巧，用花露水做为燃料，可以发射牙签或者火柴，也能飞个好几米。也有比较大的，可以发射干电池，用杀虫剂喷雾作为燃料，威力很大，近距离甚至可以打碎数厘米的瓦片，就是发射速度比较慢，因为燃料和炮弹都是手工装填，直到现在这个问题我也没有找到解决办法。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E7%AF%87%E5%8D%9A%E5%AE%A2/img-2.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;这些东西都很有意思，我在不懂任何电路知识的时候，甚至自己做过一个三极管自激电路，可以用来产生震荡，然后驱动变压器，或者一个超短距离的无线输电，当时根本不懂为什么，只是按照网上的接线方法，找一些相似的元件，然后连接起来就可以了，成功当然会让我很开心，失败也不会让我很沮丧，只是觉得好玩罢了。可能实践有助于知识的掌握理解，前些天我学习三极管的知识的时候，很快就能理解三极管的原理和应用。&lt;/p&gt;
&lt;p&gt;在初中的时候，因为是留级生，学习压力很小很小，然后就开始做了很多的小手枪，有用橡皮筋作为动力的，有用弹簧作为动力的，甚至还有一个用磁铁作为动力的。当时我的想法真的是天马行空，好多好多奇奇怪怪的想法。因为有时候会拆很多东西，不懂的就查资料，也学得了很多奇奇怪怪的知识，比如饮水机里的制冷片，对的，饮水机制冷的原理跟冰箱完全不同，饮水机用的是半导体制冷片，只要通电，就能一面发热，一面制冷，特别神奇。而且可以根据温差发电，这些我都验证过，真的是太神奇了。还有什么焦耳小偷，ZVS电路，斯特林发动机等等，可能我后来对电子一类的感兴趣就跟这有很大的关系吧，因为这些东西真的有趣。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E7%AF%87%E5%8D%9A%E5%AE%A2/img-3.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;因为爱折腾，也做过好多傻事，比如我知道502的味道，有点甜，知道花露水的味道，很上头；在有一次做水火箭的时候，压力过大，然后瓶盖被崩出来，正对着我的脑门来了一下，肿了好几天。胳膊被烧过好几次，汗毛烧了又长，长了又烧，可能也习惯了，头发也被烧过两次，还好最后都长回来了。&lt;/p&gt;
&lt;p&gt;上了大学，学了自动化这个专业，好像跟我的兴趣挺符合的，又入了单片机这个坑，感觉很棒，兴趣能成为工作当然是很棒的一件事。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这是我的第一篇文章，以后，我会写一些我学习的过程，以及学习中的一些问题和思考，会一直写的，因为一直在学习。&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
  </channel>
</rss>
