<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>RinChord的小本本</title>
        <link>https://blog.rinchord.top/</link>
        <description>Recent content on RinChord的小本本</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Sat, 14 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.rinchord.top/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>I2S协议理解</title>
        <link>https://blog.rinchord.top/p/i2s%E5%8D%8F%E8%AE%AE%E7%90%86%E8%A7%A3/</link>
        <pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/i2s%E5%8D%8F%E8%AE%AE%E7%90%86%E8%A7%A3/</guid>
        <description>


  &lt;blockquote&gt;
    &lt;p&gt;参考资料：&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://docs.espressif.com/projects/esp-idf/zh_CN/v5.4/esp32/api-reference/peripherals/i2s.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;文档 (中文)&lt;/a&gt;&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h1 id=&#34;i2s协议&#34;&gt;I2S协议
&lt;/h1&gt;


  &lt;blockquote&gt;
    &lt;p&gt;I2S（Inter-IC Sound，集成电路内置音频总线）是一种同步串行通信协议&lt;br&gt;
通常用于在两个数字音频设备之间传输音频数RGBL&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h2 id=&#34;简介&#34;&gt;简介
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;I2S各模式下所需管脚数量（ESP32）&lt;/strong&gt;&lt;br&gt;
参考来源：https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/peripherals/i2s.html&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;标准模式&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MCLK&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;主时钟线。该信号线可选，具体取决于从机，主要用于向 I2S 从机提供参考时钟。&lt;/li&gt;
&lt;li&gt;通常为256×Fs或512×Fs，用于内部PLL锁相&lt;/li&gt;
&lt;li&gt;如果从机设备能通过 BCLK（位时钟）自适应时钟，或自带高精度晶振，或低精度应用，则无需主机提供 MCLK&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BCLK/SCLK&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;位时钟线，用于数据线的位时钟（BCLK - Bit Clock）。也称为串行时钟线（Serial Clock）。&lt;/li&gt;
&lt;li&gt;每次脉冲传输一位数据，决定数据速率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LRCK / WS&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;字（声道）选择线。通常用于识别声道（除 PDM 模式外）。&lt;/li&gt;
&lt;li&gt;当 LRCK 为“0”时，传输左声道数据；当为“1”时，传输右声道数据。&lt;/li&gt;
&lt;li&gt;其频率等于音频的采样率（如 44.1kHz），用于标识一个完整数据帧的开始&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DIN&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;串行数据&lt;strong&gt;输入&lt;/strong&gt;线。如果 DIN 和 DOUT 被配置到相同的 GPIO，数据将在内部回环。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DOUT&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;串行数据&lt;strong&gt;输出&lt;/strong&gt;线。如果 DIN 和 DOUT 被配置到相同的 GPIO，数据将在内部回环。&lt;/li&gt;
&lt;li&gt;传输音频采样值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PDM 通信模式&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLK&lt;/strong&gt;：PDM 时钟线。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DIN/DOUT&lt;/strong&gt;：串行数据输入/输出线。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每个 I2S 控制器都具备以下功能，可由 I2S 驱动进行配置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可用作系统主机或从机&lt;/li&gt;
&lt;li&gt;可用作发射器或接收器&lt;/li&gt;
&lt;li&gt;DMA 控制器支持流数据采样，CPU 无需单独复制每个采样数据&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;术语解释&#34;&gt;术语解释
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;采样率&lt;/strong&gt;：单声道每秒采样数据数量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCLK&lt;/strong&gt;：源时钟频率，即时钟源的频率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCLK&lt;/strong&gt;：主时钟频率，BCLK 由其产生。MCLK 信号通常作为参考时钟，用于同步 I2S 主机和从机之间的 BCLK 和 WS。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BCLK&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;位时钟频率，一个 BCLK 时钟周期代表数据管脚上的一个数据位。&lt;/li&gt;
&lt;li&gt;通过 i2s_std_slot_config_t::slot_bit_width 配置的通道位宽即为一个声道中的 BCLK 时钟周期数量，&lt;/li&gt;
&lt;li&gt;因此一个声道中可以有 8/16/24/32 个 BCLK 时钟周期。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LRCK / WS&lt;/strong&gt;：左/右时钟或字选择时钟。在非 PDM 模式下，其频率等于采样率。&lt;/li&gt;
&lt;/ul&gt;



  &lt;blockquote class=&#34;alert alert-tip&#34;&gt;
    &lt;p class=&#34;alert-heading&#34;&gt;
      💡
      
        通常，MCLK 应该同时是 采样率 和 BCLK 的倍数。
      
    &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;br&gt;
标准模式中有且仅有左右两个声道，驱动中将声道称为 slot。这些声道可以支持 8/16/24/32 位宽的采样数据&lt;br&gt;
声道可用的通信格式有 Philips 格式\ MSB 格式\ PCM 帧同步&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Philips 格式&lt;/strong&gt;&lt;br&gt;
数据信号与 WS 信号相比有一个位的位移。WS 信号的占空比为 50%。&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/wavedrom%20%281%29-1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;wavedrom.png&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MSB 格式&lt;/strong&gt;&lt;br&gt;
与 Philips 格式基本相同，但其数据没有位移。&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/i2s%E5%8D%8F%E8%AE%AE%E7%90%86%E8%A7%A3/wavedrom-1.png&#34;
	width=&#34;680&#34;
	height=&#34;226&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;wavedrom.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;300&#34;
		data-flex-basis=&#34;722px&#34;
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PCM 帧同步&lt;/strong&gt;&lt;br&gt;
数据有一个位的位移，同时 WS 信号变成脉冲，持续一个 BCLK 周期。&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/i2s%E5%8D%8F%E8%AE%AE%E7%90%86%E8%A7%A3/wavedrom.png&#34;
	width=&#34;720&#34;
	height=&#34;226&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;wavedrom.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;318&#34;
		data-flex-basis=&#34;764px&#34;
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;PDM模式&lt;/strong&gt;&lt;br&gt;
PDM（Pulse-density Modulation，脉冲密度调制）通过采样的方式将模拟信号数字化为 1 位精度的数字信号。&lt;br&gt;
它以脉冲密度的方式呈现模拟信号的大小，即密度越高，对应的模拟信号值越大。&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/wavedrom%20%281%29.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;wavedrom (1).png&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PDM转换PCM&lt;/strong&gt;&lt;br&gt;
PDM (脉冲密度调制)格式的数据通常可以经过以下几个步骤转换为 PCM (脉冲编码调制)格式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;低通滤波：用于还原模拟信号波形。一般采用 FIR 滤波器；&lt;/li&gt;
&lt;li&gt;下采样：用于将 PDM 的过采样率降低到期望的 PCM 采样率。下采样可以用简单的抽值法实现；&lt;/li&gt;
&lt;li&gt;高通滤波：用于去除信号的直流部分；&lt;/li&gt;
&lt;li&gt;放大：用于调整转换后的 PCM 数据的増益。一般由转换后的 PCM 信号乘以一个系数得到最终 PCM 信号。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



  &lt;blockquote class=&#34;alert alert-tip&#34;&gt;
    &lt;p class=&#34;alert-heading&#34;&gt;
      💡
      
        &lt;br&gt;
      
    &lt;/p&gt;
    &lt;p&gt;无论原始 PDM 格式还是 PCM 格式，PDM 模式下的一个数据单元总是 16 比特的位宽。&lt;br&gt;
例如，用原始 PDM 格式发送数据，那么您数组中的数据应该像这样排列：CH0 0x1234，CH1 0x5678，CH0 0x9abc，CH1 0xdef0。RX 方向同理。&lt;/p&gt;
  &lt;/blockquote&gt;

&lt;h2 id=&#34;通道状态&#34;&gt;通道状态
&lt;/h2&gt;&lt;p&gt;I2S通道有三种状态，分别为 &lt;strong&gt;registered&lt;/strong&gt;（已注册）、 &lt;strong&gt;ready&lt;/strong&gt;（&lt;strong&gt;准备就绪&lt;/strong&gt;） 和 running（运行中），它们的关系如下图所示：&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/i2s%E5%8D%8F%E8%AE%AE%E7%90%86%E8%A7%A3/i2s_state_machine.png&#34;
	width=&#34;714&#34;
	height=&#34;530&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;i2s_state_machine.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;134&#34;
		data-flex-basis=&#34;323px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;// TODO&lt;/p&gt;
&lt;h2 id=&#34;example&#34;&gt;EXAMPLE
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/peripherals/i2s.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/peripherals/i2s.html&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>ESP-IDF项目风格</title>
        <link>https://blog.rinchord.top/p/esp-idf%E9%A1%B9%E7%9B%AE%E9%A3%8E%E6%A0%BC/</link>
        <pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/esp-idf%E9%A1%B9%E7%9B%AE%E9%A3%8E%E6%A0%BC/</guid>
        <description>


  &lt;blockquote&gt;
    &lt;p&gt;参考文档&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/build-system.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/build-system.html&lt;/a&gt;&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h1 id=&#34;项目架构与风格&#34;&gt;项目架构与风格
&lt;/h1&gt;&lt;h2 id=&#34;基本概念&#34;&gt;基本概念
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;项目&lt;/strong&gt;&lt;br&gt;
特指一个目录，其中包含了构建 &lt;strong&gt;应用程序&lt;/strong&gt; （即可执行文件）所需的全部文件和配置，还包含了其他支持型文件，&lt;br&gt;
例如分区表、数据分区或文件系统分区，以及引导加载程序。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目配置&lt;/strong&gt;&lt;br&gt;
保存在项目根目录下名为 &lt;code&gt;sdkconfig&lt;/code&gt; 的文件中，&lt;br&gt;
可以通过 &lt;code&gt;idf.py menuconfig&lt;/code&gt; 进行修改，且一个项目只能包含一个项目配置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;应用程序&lt;/strong&gt;&lt;br&gt;
是由 &lt;code&gt;ESP-IDF&lt;/code&gt; 构建得到的可执行文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个项目通常会构建两个应用程序：
&lt;ul&gt;
&lt;li&gt;项目应用程序（可执行的主文件，即用户自定义的固件）&lt;/li&gt;
&lt;li&gt;引导加载程序（启动并初始化项目应用程序）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;组件&lt;/strong&gt;&lt;br&gt;
组件是 &lt;code&gt;COMPONENT_DIRS&lt;/code&gt; 列表中包含 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 文件的任何目录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;组件将会被编译成静态库（.a 文件）并链接到应用程序。&lt;/li&gt;
&lt;li&gt;部分组件由 &lt;code&gt;ESP-IDF&lt;/code&gt; 官方提供，其他组件则来源于其它开源项目。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;&lt;br&gt;
特指运行构建后应用程序的硬件设备。&lt;br&gt;
运行 &lt;code&gt;idf.py --list-targets&lt;/code&gt; 可以查看当前 &lt;code&gt;ESP-IDF&lt;/code&gt; 版本中支持目标的完整列表。&lt;/p&gt;
&lt;h2 id=&#34;项目基本结构&#34;&gt;项目基本结构
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;main/&lt;/strong&gt;&lt;br&gt;
它是一种特殊的&lt;strong&gt;组件&lt;/strong&gt;，main组件内包含项目的入口文件&lt;br&gt;
在项目的入口文件中定义了&lt;code&gt;app_main()&lt;/code&gt;作为程序的入口函数&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;build/&lt;/strong&gt;&lt;br&gt;
存放构建输出的目录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CMake 会配置项目，并在此目录下生成临时的构建文件。&lt;/li&gt;
&lt;li&gt;随后，在主构建进程的运行期间，该目录还会保存临时目标文件、库文件以及最终输出的二进制文件。&lt;/li&gt;
&lt;li&gt;此目录通常不会添加到项目的源码管理系统中，也不会随项目源码一同发布。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;sdkconfig&lt;/strong&gt;&lt;br&gt;
执行 &lt;code&gt;idf.py menuconfig&lt;/code&gt; 时会创建或更新此文件，文件中保存了项目中所有组件（包括 ESP-IDF 本身）的配置信息。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sdkconfig.old&lt;/code&gt; 文件是前者的备份&lt;/li&gt;
&lt;li&gt;本文件存储了IDF Menu Config的配置项&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;component/&lt;/strong&gt;&lt;br&gt;
可选目录，包含了项目的部分自定义组件，可以在顶层CMakeLists.txt中设置 &lt;code&gt;EXTRA_COMPONENT_DIRS&lt;/code&gt; 变量来手动查找其他位置的组件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;该目录包含构成项目的标准组件，各个组件之间应低耦合，最终在main的入口文件中调用并实现任务创建等基本行为&lt;/li&gt;
&lt;li&gt;有助于构造可复用的代码或导入第三方组件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;managed_components/&lt;/strong&gt;&lt;br&gt;
由 IDF 组件管理器创建，用于存储由 IDF 组件管理器管理的组件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请勿手动修改 &amp;ldquo;&lt;code&gt;managed_components&lt;/code&gt;&amp;rdquo; 目录下的内容。如果需要进行更改，可以将组件复制到 &lt;code&gt;components&lt;/code&gt; 目录下。&lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;code&gt;managed_components&lt;/code&gt;&amp;rdquo; 目录通常不在 Git 中进行版本控制，也不会与项目源代码一起分发。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;CMakeLists.txt&lt;/strong&gt;&lt;br&gt;
组织IDF项目的核心文件&lt;/p&gt;
&lt;h3 id=&#34;cmake文件结构&#34;&gt;CMake文件结构
&lt;/h3&gt;&lt;h4 id=&#34;顶层cmakelist&#34;&gt;顶层CMakeList
&lt;/h4&gt;&lt;p&gt;每个项目都有一个顶层 CMakeLists.txt 文件，包含整个项目的构建设置。默认情况下，项目 CMakeLists 文件会非常小。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;最小项目示例&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-CMake&#34; data-lang=&#34;CMake&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cmake_minimum_required&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;VERSION&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;3.16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;   &lt;span class=&#34;c&#34;&gt;# 选择该项目使用的最低CMake版本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$ENV{&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;IDF_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/tools/cmake/project.cmake&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# IDF的标准模板，会导入 CMake 的其余功能来完成配置项目、检索组件等任务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;project&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;myProject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# 会创建项目本身，并指定项目名称。该名称会作为最终输出的二进制文件的名字
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;可选项目变量&lt;/strong&gt;&lt;br&gt;
参考文档:  &lt;a class=&#34;link&#34; href=&#34;https://github.com/espressif/esp-idf/blob/v5.5.1/tools/cmake/project.cmake&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/espressif/esp-idf/blob/v5.5.1/tools/cmake/project.cmake&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;COMPONENT_DIRS&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：组件的搜索目录，默认为&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IDF_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;components&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PROJECT_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;components&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、和&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;EXTRA_COMPONENT_DIRS&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。如果你不想在这些位置搜索组件，请覆盖此变量。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;EXTRA_COMPONENT_DIRS&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：用于搜索组件的其它可选目录列表。路径可以是相对于项目目录的相对路径，也可以是绝对路径。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;COMPONENTS&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：用于指定要构建到项目中的组件名称列表，默认为&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPONENT_DIRS&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;目录下检索到的所有组件。使用此变量可以“精简”项目，从而缩短构建时间。请注意，如果一个组件通过&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPONENT_REQUIRES&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;指定了它依赖的另一个组件，则会自动将其添加到&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPONENTS&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;中，所以&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPONENTS&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;列表可能会非常短。另外，还可以通过设置&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MINIMAL_BUILD&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;构建属性&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;来指定&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPONENTS&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;中的&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;组件。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;BOOTLOADER_IGNORE_EXTRA_COMPONENT&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：可选组件列表，位于&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bootloader_components&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;目录中，引导加载程序编译时会忽略该列表中的组件。使用这一变量可以将一个组件有条件地包含在项目中。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;BOOTLOADER_EXTRA_COMPONENT_DIRS&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：可选的附加路径列表，引导加载程序编译时将从这些路径中搜索要编译的组件。注意，这是一个构建属性。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;组件cmakelist&#34;&gt;组件CMakeList
&lt;/h4&gt;&lt;p&gt;这个文件用来在IDF中注册组件自身的相关源代码,以便于后续与项目其他部分进行链接.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;esp-idf的外部组件注册行为发生在该外部组件的根目录cmakelist文件中&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当 CMake 运行项目配置时，它会记录本次构建包含的组件列表，它可用于调试某些组件的添加/排除&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果组件存在重名,IDF搜索组件的优先级:
&lt;ul&gt;
&lt;li&gt;项目目录下的组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EXTRA_COMPONENT_DIRS&lt;/code&gt; 中的组件&lt;/li&gt;
&lt;li&gt;项目目录下 &lt;code&gt;managed_components/&lt;/code&gt; 目录中的组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IDF_PATH/components&lt;/code&gt; 目录下的组件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;将ESP-IDF组件复制到项目目录下,就可以在不修改IDF源代码的前提下修改IDF的内部组件&lt;/li&gt;
&lt;li&gt;需要fullclean后重新构建项目才能看到新组件的路径&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建一个新组件后,可以使用IDF的内置函数将其快速添加到构建系统中.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-CMake&#34; data-lang=&#34;CMake&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;idf_component_register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;SRCS&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;foo.c&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;bar.c&amp;#34;&lt;/span&gt;    &lt;span class=&#34;c&#34;&gt;# 该组件中需要加入构建系统的源代码文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s&#34;&gt;INCLUDE_DIRS&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;include&amp;#34;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;# 添加头文件到全局include搜索路径中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s&#34;&gt;REQUIRES&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;mbedtls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;       &lt;span class=&#34;c&#34;&gt;# 添加组件前置依赖关系, 声明该组件需要使用什么其他组件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;这个函数将会生成一个与根目录文件夹名称一致的库,并在最终链接至应用程序中&lt;/li&gt;
&lt;li&gt;使用相对路径&lt;/li&gt;
&lt;li&gt;支持一些额外的参数,参考这里&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/build-system.html#cmake-component-register&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/build-system.html#cmake-component-register&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;组件变量参考&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT_DIR：组件目录，即包含 CMakeLists.txt 文件的绝对路径，它与 CMAKE_CURRENT_SOURCE_DIR 变量一样，路径中不能包含空格。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT_NAME：组件名，与组件目录名相同。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT_ALIAS：库别名，由构建系统在内部为组件创建。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT_LIB：库名，由构建系统在内部为组件创建。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT_VERSION：组件版本，由 idf_component.yml 指定并由 IDF 组件管理器设置。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;可以把KConfig添加到与CMakelist.txt同级的组件根目录中,就可以为该组件添加一些独有配置了.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;组件依赖&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;main组件默认依赖所有组件,无需传递&lt;code&gt;REQUIRES&lt;/code&gt; 或 &lt;code&gt;PRIV_REQUIRES&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;即便不声明 &lt;code&gt;REQUIRES&lt;/code&gt; 或 &lt;code&gt;PRIV_REQUIRES&lt;/code&gt;, 各组件也会默认依赖一些基础组件&lt;br&gt;
通用组件包括：cxx、newlib、freertos、esp_hw_support、heap、log、soc、hal、esp_rom、esp_common、esp_system。&lt;/li&gt;
&lt;li&gt;如果将 &lt;code&gt;COMPONENTS&lt;/code&gt; 变量设置为项目直接使用的最小组件列表，那么构建系统会扩展到包含所有组件。完整的组件列表为：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;COMPONENTS&lt;/code&gt; 中明确提及的组件。&lt;/li&gt;
&lt;li&gt;这些组件的依赖项（以及递归运算后的组件）。每个组件都依赖的 通用组件。&lt;/li&gt;
&lt;li&gt;会显著缩短构建时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;添加自定义bootloader&#34;&gt;添加自定义Bootloader
&lt;/h3&gt;&lt;p&gt;// TODO&lt;/p&gt;
&lt;h2 id=&#34;不使用idf标准cmake函数添加外部组件&#34;&gt;不使用IDF标准CMake函数添加外部组件
&lt;/h2&gt;&lt;p&gt;// TODO&lt;/p&gt;
&lt;h2 id=&#34;编写多目标&#34;&gt;编写多目标
&lt;/h2&gt;


  &lt;blockquote class=&#34;alert alert-warning&#34;&gt;
    &lt;p class=&#34;alert-heading&#34;&gt;
      ℹ️
      
        Warning
      
    &lt;/p&gt;
    &lt;p&gt;猜你在找:esp-idf 测试&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.espressif.com/projects/esp-idf/zh_CN/release-v5.3/esp32/api-guides/build-system.html#cmake-buildsystem-api&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.espressif.com/projects/esp-idf/zh_CN/release-v5.3/esp32/api-guides/build-system.html#cmake-buildsystem-api&lt;/a&gt;&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/espressif/esp-idf/tree/7024ea10/examples/build_system/cmake/idf_as_lib&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/espressif/esp-idf/tree/7024ea10/examples/build_system/cmake/idf_as_lib&lt;/a&gt;&lt;br&gt;
需要注意,似乎IDF从6.0版本才支持自定义多主目标&lt;br&gt;
我使用的SDK版本是5.3,所以需要使用CMake来手动配置多目标。&lt;/p&gt;
  &lt;/blockquote&gt;

&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-CMake&#34; data-lang=&#34;CMake&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cmake_minimum_required&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;VERSION&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;3.16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;project&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;my_custom_app&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 导入提供 ESP-IDF CMake 构建系统 API 的 CMake 文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$ENV{&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;IDF_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/tools/cmake/idf.cmake&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 在构建中导入 ESP-IDF 组件，可以视作等同 add_subdirectory()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 但为 ESP-IDF 构建增加额外的构建过程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 具体构建过程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;idf_build_process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;esp32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 创建项目可执行文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 使用其别名 idf::newlib 将其链接到 newlib 组件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;add_executable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;.elf&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;main.c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;target_link_libraries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;.elf&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;idf::newlib&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 让构建系统知道项目到可执行文件是什么，从而添加更多的目标以及依赖关系等
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;idf_build_executable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;.elf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
        </item>
        <item>
        <title>简单了解CAN</title>
        <link>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/</link>
        <pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/</guid>
        <description>


  &lt;blockquote&gt;
    &lt;p&gt;参考内容&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://www.analog.com/cn/glossary/can.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.analog.com/cn/glossary/can.html&lt;/a&gt;&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://www.analog.com/cn/technical-articles/understanding-can-transceiver-how-validate-multinode-can-system-performance.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.analog.com/cn/technical-articles/understanding-can-transceiver-how-validate-multinode-can-system-performance.html&lt;/a&gt;&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://blog.steven53.top/p/stm32-0x0b/#%E4%BD%8D%E6%97%B6%E5%BA%8F&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://blog.steven53.top/p/stm32-0x0b/#%E4%BD%8D%E6%97%B6%E5%BA%8F&lt;/a&gt;&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h1 id=&#34;can&#34;&gt;CAN
&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/7ee4eb34f0c14dd57179d60572ec867d.png&#34;
	width=&#34;817&#34;
	height=&#34;282&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;7ee4eb34f0c14dd57179d60572ec867d.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;289&#34;
		data-flex-basis=&#34;695px&#34;
	
&gt;&lt;br&gt;
&lt;strong&gt;介绍&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;两根通信线: CANH 和 CANL, 使用差分信号进行通信，抗干扰，无需时钟线&lt;/li&gt;
&lt;li&gt;总线上挂载多设备，异步通信，冲突时通过报文ID进行仲裁&lt;/li&gt;
&lt;li&gt;在2.0协议帧下，可以传输 0 ~ 8 Byte&lt;/li&gt;
&lt;li&gt;广播式通信、请求-响应式通信&lt;/li&gt;
&lt;li&gt;应答机制、CRC校验机制&lt;/li&gt;
&lt;li&gt;can2.0 最高速率 1Mbit/s&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;名词解释：&lt;br&gt;
差分线:&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Differential_signalling&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://en.wikipedia.org/wiki/Differential_signalling&lt;/a&gt;&lt;br&gt;
两根等长且平行的线，它们同一时刻的电压差描述了 1 bit 的数字信号&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;抗干扰能力强。干扰噪声一般会等值、同时的被加载到两根信号线上，而其差值为0，即，噪声对信号的逻辑意义不产生影响。&lt;/li&gt;
&lt;li&gt;有效抑制电磁干扰（EMI）。由于两根线靠得很近且信号幅值相等，这两根线与地线之间的耦合电磁场的幅值也相等，同时他们的信号极性相反，其电磁场将相互抵消。因此对外界的电磁干扰也小。&lt;/li&gt;
&lt;li&gt;时序定位准确。差分信号的接收端是两根线上的信号幅值之差发生正负跳变的点，作为判断逻辑0/1跳变的点的。而普通单端信号以阈值电压作为信号逻辑0/1的跳变点，受阈值电压与信号幅值电压之比的影响较大，不适合低幅度的信号。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;协议硬件要求&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;总线起点                         总线终点
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CAN_H ──┬───────────────────────┬──
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        120Ω                    120Ω
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CAN_L ──┴───────────────────────┴──
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;使用特性阻抗为 120Ω 双绞线分别连接所有设备的 CANH 和 CANL&lt;/li&gt;
&lt;li&gt;在总线最远的两个点放置两个 120R 阻抗匹配电容，
&lt;ul&gt;
&lt;li&gt;实际测得总线电阻约 60R&lt;/li&gt;
&lt;li&gt;中间其他节点不装总线电阻&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;协议细节&#34;&gt;协议细节
&lt;/h2&gt;&lt;h3 id=&#34;基本bit&#34;&gt;&lt;strong&gt;基本bit&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;如果 CANH-CANL 电压大于 1.5V，CAN接收器将其视为逻辑 0&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这意味着收发器主动产生了两根总线上的压差&lt;br&gt;
如果 CANH-CANL 电压小于 200mV, CAN接收器将其视为逻辑 1&lt;/li&gt;
&lt;li&gt;这意味着收发器释放了总线，让总线处于默认电压&lt;br&gt;
接收器根据接收到的逻辑在 TXD 和 RXD 上回送数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;节点A发送：1  1  0  1&lt;br&gt;
节点B发送：1  0  0  1&lt;br&gt;
总线结果 ：1  0  0  1&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以理解为一种线与操作，只要有某个收发器在总线上产生了0，整个总线就体现为0&lt;/li&gt;
&lt;li&gt;如果某设备试图发送1，但是读到了0，这意味着总线上有其他设备正在发送报文，将停止发送&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;数据帧结构&#34;&gt;&lt;strong&gt;数据帧结构&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;can有两种数据帧，一种是基本帧，一种是扩展帧，此外还有过载帧和错误帧&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基本帧&lt;/strong&gt;&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/can1.png&#34;
	width=&#34;826&#34;
	height=&#34;185&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;drawio&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;446&#34;
		data-flex-basis=&#34;1071px&#34;
	
&gt;&lt;br&gt;
&lt;strong&gt;SOF&lt;/strong&gt;（1位）: 帧起始位, 固定为显性 0。&lt;br&gt;
&lt;strong&gt;CAN ID&lt;/strong&gt;（11位）: 报文标识符，发送时高位在前, 数值越小，仲裁优先级越高。&lt;br&gt;
&lt;strong&gt;RTR&lt;/strong&gt;（1位）: 0：数据帧。1：远程帧，请求其他节点发送数据。&lt;br&gt;
&lt;strong&gt;IDE&lt;/strong&gt;（1位）: 0：11位标准帧。1：表示采用扩展帧结构。&lt;br&gt;
&lt;strong&gt;r0&lt;/strong&gt;（1位）:保留位，经典CAN标准帧中通常为 0。&lt;br&gt;
&lt;strong&gt;DLC&lt;/strong&gt;（4位）: 表示数据长度。经典CAN数据长度为0～8字节。&lt;br&gt;
&lt;strong&gt;Data&lt;/strong&gt;（0～64位）: 实际负载数据，即0～8字节。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CRC&lt;/strong&gt;（15位）: 用于检测报文在传输中是否出错。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CRC界定符&lt;/strong&gt;（1位）: 固定为1。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ACK&lt;/strong&gt;（1位）: 发送节点发送隐性 1。正确接收报文的节点将其覆盖为显性 0，表示确认收到。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ACK界定符&lt;/strong&gt;（1位）: 固定为1。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;EOF&lt;/strong&gt;（7位）:帧结束，7*1。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IFS&lt;/strong&gt; 帧间隔&lt;br&gt;
正常情况下，IFS至少包含连续 3*1。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3位结束后：
&lt;ul&gt;
&lt;li&gt;没有节点发送：总线继续保持隐性，称为总线空闲。&lt;/li&gt;
&lt;li&gt;有节点发送：发送显性SOF，开始下一帧。&lt;/li&gt;
&lt;li&gt;多个节点同时发送：进入仲裁。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;扩展帧&lt;/strong&gt;&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/efccac50fe0579b30c1492e02aba612d.png&#34;
	width=&#34;838&#34;
	height=&#34;112&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;efccac50fe0579b30c1492e02aba612d.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;748&#34;
		data-flex-basis=&#34;1795px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;扩展帧与基本帧结构基本一样，只有少量区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SRR位固定为1&lt;/li&gt;
&lt;li&gt;IDE为1，代表扩展帧&lt;/li&gt;
&lt;li&gt;18位扩展ID&lt;/li&gt;
&lt;li&gt;RTR：0：扩展数据帧。1：扩展远程帧。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;因为SRR固定为1，这导致前11位ID相同的基本帧和扩展帧中，基本帧会赢得仲裁。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;错误帧&lt;/strong&gt;&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/b34334629c975b2c6c0b50eca3dc3089.png&#34;
	width=&#34;354&#34;
	height=&#34;236&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;b34334629c975b2c6c0b50eca3dc3089.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;150&#34;
		data-flex-basis=&#34;360px&#34;
	
&gt;&lt;br&gt;
CAN采取 bit stuffing 模式，即：总线上不允许出现连续6个相同位&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果出现6个相同位，将在第六位前插入一个相反位。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主动/被动错误标志不采用bit stuffing, 所以其他can设备将轻易地发现此错误&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果其他设备刚好在某设备发送完错误标志后开始连续发送，错误标志段可能最长为12bit&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;错误状态转换&lt;/strong&gt; (Error State Transition)： CAN控制器硬件内部有三个状态，由两个计数器：发送错误计数器 (TEC, Transmit Error Counter) 和 接收错误计数器 (REC, Receive Error Counter) 决定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主动错误状态 (Error Active)：正常状态，发错误帧用 6个0。&lt;/li&gt;
&lt;li&gt;被动错误状态 (Error Passive)：错误较多，发错误帧用 6个1。&lt;/li&gt;
&lt;li&gt;总线关闭状态 (Bus Off)：错误过多，硬件直接断开与总线的物理连接，不再发送任何数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;仲裁&#34;&gt;&lt;strong&gt;仲裁&lt;/strong&gt;
&lt;/h3&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;前面提到：总线上如果有多个设备一起发信，只要有一个设备发 0 ，总线电平都是 0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于该节点而言，只会有三种情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;总线为0，自己发1&lt;/li&gt;
&lt;li&gt;总线为0，自己发0
&lt;ul&gt;
&lt;li&gt;总线上可能会有其他试图发 1 的设备，但是被当前设备覆盖成 0 了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;总线为1，自己发1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;节点会一边发一边读总线，在第二种情况和第三种情况下，发的东西和读到的东西是一样的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;此时，仲裁通过&lt;/li&gt;
&lt;li&gt;如果节点没有通过仲裁，因为can协议帧的头就是 canID, 这意味着赢了它的那个节点ID一定比它大。
&lt;ul&gt;
&lt;li&gt;根据协议，当前节点需要停止发送。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;综上所述，can仲裁并不需要什么额外步骤，接收方可以持续监听，这就很高效。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;



  &lt;blockquote&gt;
    &lt;p&gt;举例：两节点ID分别为 9(1001) 和 10(1010)&lt;br&gt;
假设两节点同时发送数据。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一个时间段，两者同步发送&lt;code&gt;1&lt;/code&gt;，总线为&lt;code&gt;1&lt;/code&gt;，均继续发送。&lt;/li&gt;
&lt;li&gt;第二个时间段:&lt;/li&gt;
&lt;li&gt;两者同步发送&lt;code&gt;0&lt;/code&gt;，总线为&lt;code&gt;0&lt;/code&gt;，均继续发送。&lt;/li&gt;
&lt;li&gt;9发送&lt;code&gt;0&lt;/code&gt;，10发送&lt;code&gt;1&lt;/code&gt;，总线状态&lt;code&gt;0&lt;/code&gt;: 9继续发送，10看到总线状态与自己发送的不一致，于是中断之后所有发送。仲裁完成。9之后继续正常发送&lt;/li&gt;
&lt;/ul&gt;

  &lt;/blockquote&gt;

&lt;h2 id=&#34;时序同步&#34;&gt;时序同步
&lt;/h2&gt;&lt;p&gt;can是没有时钟线的，但是一条总线上的所有节点必须要保证时钟同步才能确保信息的正常收发&lt;br&gt;
晶振也是不准的，我们需要一套更有效的校准手段&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/36c2ddf61f570fbabd39c9bbab2cce7b.png&#34;
	width=&#34;1024&#34;
	height=&#34;345&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;36c2ddf61f570fbabd39c9bbab2cce7b.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;296&#34;
		data-flex-basis=&#34;712px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;我们把每Bit的时间进行进一步细分，使用Tq单位描述其&lt;/p&gt;
$$\Large T_{\text{bit}} = T_{SS} + T_{PTS} + T_{PBS1} + T_{PBS2}$$&lt;p&gt;名词解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;$T_{\text{bit}}$：位时间 (Bit Time)。传送1个比特的总时间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$T_{SS}$：同步段 (Synchronization Segment)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;取值：固定为 $1 \times T_q$。&lt;/li&gt;
&lt;li&gt;边沿跳变应该发生在这一段时间里&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$T_{PTS}$：传播时间段 (Propagation Time Segment)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;取值：1~8$T_q$&lt;/li&gt;
&lt;li&gt;用于补偿信号在物理导线上传播的物理延迟。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$T_{PBS1}$：相位缓冲段1 (Phase Buffer Segment 1)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;取值：1~8$T_q$&lt;/li&gt;
&lt;li&gt;用来做同步调整的“缓冲区1”，可以被拉长。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$T_{PBS2}$：相位缓冲段2 (Phase Buffer Segment 2)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;取值：1~8$T_q$&lt;/li&gt;
&lt;li&gt;用来做同步调整的“缓冲区2”，可以被缩短。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;执行流程&#34;&gt;&lt;strong&gt;执行流程&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;CAN通过每个电平跳变边沿来同步各节点时钟，带有自校准功能&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;硬同步&lt;/strong&gt;（帧开始时同步）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开始发送，发送方开始计时，在SS时间段中将数据线驱动为逻辑低电平&lt;/li&gt;
&lt;li&gt;在检测到SOF (Start Of Frame)下降沿时，接收方同步开始从SS段计时&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;再同步&lt;/strong&gt;（逻辑电平跳变边沿不在SS段时再同步）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;除了帧开始时的第一个下降沿，后续每个数据位都可以进行再同步&lt;/li&gt;
&lt;li&gt;如果逻辑跳变发生在SS段前或后，则对应增加PBS1或者减少PBS2&lt;/li&gt;
&lt;li&gt;SJW：最大补偿的Tq数，用于防止单次补偿过度&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/a8bb677dea0acc6e17198c5ad289f45b.png&#34;
	width=&#34;1024&#34;
	height=&#34;791&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;a8bb677dea0acc6e17198c5ad289f45b.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;129&#34;
		data-flex-basis=&#34;310px&#34;
	
&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;stm32的can外设&#34;&gt;stm32的can外设
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/d23395b9d78483003af5ca726cd1efd1.png&#34;
	width=&#34;1024&#34;
	height=&#34;560&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;d23395b9d78483003af5ca726cd1efd1.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;182&#34;
		data-flex-basis=&#34;438px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;发送&#34;&gt;发送
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;can外设有三个发送缓存（邮箱）&lt;/li&gt;
&lt;li&gt;can外设自动在总线空闲时从三个邮箱中选择一个进行发送&lt;/li&gt;
&lt;li&gt;可以配置优先级 &lt;code&gt;TXFP&lt;/code&gt; (TX Fifo Priority)
&lt;ul&gt;
&lt;li&gt;1: 先请求先发送&lt;/li&gt;
&lt;li&gt;0: 按报文ID优先级发送&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;可以配置 &lt;code&gt;NART&lt;/code&gt; (Not Allow ReTransmit)=1 禁止发送失败后自动重传&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;状态转移图：&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/9cd3a17560b7a0629796f5af3183e23e.png&#34;
	width=&#34;1024&#34;
	height=&#34;682&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;9cd3a17560b7a0629796f5af3183e23e.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;150&#34;
		data-flex-basis=&#34;360px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RQCP：发送请求已经完成&lt;/li&gt;
&lt;li&gt;TXOK：发送成功&lt;/li&gt;
&lt;li&gt;TME：发送邮箱空&lt;/li&gt;
&lt;li&gt;ABRQ：终止发送&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;接收&#34;&gt;接收
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;can外设有两个三级接收FIFO缓存&lt;/li&gt;
&lt;li&gt;收发控制器接收到报文，将其送入过滤器匹配&lt;/li&gt;
&lt;li&gt;如果报文符合过滤条件，则会被放入过滤器指定的一个FIFO&lt;/li&gt;
&lt;li&gt;配置RFLM (Recieve Fifo Lock Mode)：如果FIFO已满，有新的报文到达，可以
&lt;ul&gt;
&lt;li&gt;1: FIFO上锁，新到来的报文被丢弃&lt;/li&gt;
&lt;li&gt;0: FIFO未上锁，丢弃队列中末尾（最晚到达）的报文，再放入新的报文&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;状态转移图：&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/fbb241feeefc0acdc9c87838d904b59b.png&#34;
	width=&#34;1024&#34;
	height=&#34;870&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;fbb241feeefc0acdc9c87838d904b59b.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;117&#34;
		data-flex-basis=&#34;282px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;过滤器&#34;&gt;过滤器
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3can/500b5e309c2aa18b38458ad35d41f359.png&#34;
	width=&#34;1309&#34;
	height=&#34;1143&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;500b5e309c2aa18b38458ad35d41f359.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;114&#34;
		data-flex-basis=&#34;274px&#34;
	
&gt;&lt;br&gt;
每一个过滤器有两个32位的寄存器，和以下几个过滤器配置位&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FSCx&lt;/strong&gt;(Filter Bank Scale)：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0: 每个过滤器使用4个16位寄存器，仅支持标准CAN地址长度 （将32位的寄存器拆成两个16位的使用，能更好的利用资源）&lt;/li&gt;
&lt;li&gt;1: 每个过滤器使用2个32位寄存器，支持标准和扩展CAN地址长度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FBMx&lt;/strong&gt;(Filter Bank Mode):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0: 掩码模式 将新收到的报文ID和过滤器中的ID进行比较，但是仅比较Mask中为1的位（类似IP地址掩码）&lt;/li&gt;
&lt;li&gt;1: 列表模式 将新收到的报文ID和过滤器中的ID进行比较，一个过滤器允许两个特定的报文ID&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FACT&lt;/strong&gt;(Filter ACTive): 过滤器使能开关&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FFA&lt;/strong&gt;(Filter Fifo Assignment): 通过过滤器的报文进入哪一个FIFO&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;掩码机制&lt;/strong&gt;&lt;br&gt;
配置为掩码模式时，过滤器将输入的报文ID和寄存器中的ID进行比较，但是仅比较二进制下，Mask中为1的位，其它位无论是什么都可以。&lt;br&gt;
用公式来描述，满足以下公式的数据包，可以通过过滤器 &lt;code&gt;CAN_ID &amp;amp; MASK == FILTER_ID &amp;amp; MASK&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;基于 AND 运算逻辑，我的理解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mask：我们关心的位需要写1， 不关心的位需要写0&lt;/li&gt;
&lt;li&gt;Filter： 需要填写我们关心的位，其余位全部填充 0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们要接收 0x100 到 0x1FF：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最小值 0x100 = 0b0001 0000 0000&lt;/li&gt;
&lt;li&gt;最大值 0x1FF = 0b0001 1111 1111&lt;/li&gt;
&lt;li&gt;规律：前 4 位（高 4 位）必须固定为 0001，后 8 位（低 8 位）无所谓。&lt;/li&gt;
&lt;li&gt;所以：
&lt;ul&gt;
&lt;li&gt;Filter 设为：0b0001 0000 0000（即 0x100）&lt;/li&gt;
&lt;li&gt;Mask 设为：0b1111 0000 0000（即 0xF00。前 4 位是 1 表示必须匹配，后 8 位是 0 表示忽略）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>在家里的主机上部署PVE小记</title>
        <link>https://blog.rinchord.top/p/%E5%9C%A8%E5%AE%B6%E9%87%8C%E7%9A%84%E4%B8%BB%E6%9C%BA%E4%B8%8A%E9%83%A8%E7%BD%B2pve%E5%B0%8F%E8%AE%B0/</link>
        <pubDate>Sat, 20 Sep 2025 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/%E5%9C%A8%E5%AE%B6%E9%87%8C%E7%9A%84%E4%B8%BB%E6%9C%BA%E4%B8%8A%E9%83%A8%E7%BD%B2pve%E5%B0%8F%E8%AE%B0/</guid>
        <description>&lt;h1 id=&#34;什么是pve&#34;&gt;什么是PVE？
&lt;/h1&gt;


  &lt;blockquote&gt;
    &lt;p&gt;Proxmox Virtual Environment is a complete open-source platform for enterprise virtualization. With the built-in web interface you can easily manage VMs and containers, software-defined storage and networking, high-availability clustering, and multiple out-of-the-box tools using a single solution.&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h2 id=&#34;下载pve&#34;&gt;下载PVE
&lt;/h2&gt;&lt;p&gt;请在&lt;a class=&#34;link&#34; href=&#34;https://www.proxmox.com/en/downloads&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;这里&lt;/a&gt;下载&lt;code&gt;.iso&lt;/code&gt;格式（因为我们要把PVE装到物理机上）的&lt;br&gt;
&lt;code&gt;Proxmox VE x.x ISO Installer&lt;/code&gt;文件&lt;/p&gt;
&lt;h2 id=&#34;刻录u盘&#34;&gt;刻录U盘
&lt;/h2&gt;&lt;p&gt;下载最新版本的&lt;code&gt;Rufus&lt;/code&gt;，并直接选择你刚才下载的&lt;code&gt;.iso&lt;/code&gt;文件，此时Rufus会提示选择dd格式，确定即可。&lt;/p&gt;
&lt;h2 id=&#34;调整安装设备bios设置&#34;&gt;调整安装设备BIOS设置
&lt;/h2&gt;&lt;p&gt;关闭安全启动，如有超频设置也请尽可能恢复原有配置。&lt;/p&gt;
&lt;h2 id=&#34;引导启动&#34;&gt;引导启动
&lt;/h2&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;img src=&#34;https://blog.rinchord.top/p/%E5%9C%A8%E5%AE%B6%E9%87%8C%E7%9A%84%E4%B8%BB%E6%9C%BA%E4%B8%8A%E9%83%A8%E7%BD%B2pve%E5%B0%8F%E8%AE%B0/07d67322f51a4886a95be3a3b1ff6ebd.png&#34;
	width=&#34;325&#34;
	height=&#34;61&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;e0d786be86b1e0d15451615a81be6bf6.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;532&#34;
		data-flex-basis=&#34;1278px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;点击左侧选择你想要部署PVE的物理硬盘&lt;/li&gt;
&lt;li&gt;点击右侧打开硬盘区域划分窗口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E5%9C%A8%E5%AE%B6%E9%87%8C%E7%9A%84%E4%B8%BB%E6%9C%BA%E4%B8%8A%E9%83%A8%E7%BD%B2pve%E5%B0%8F%E8%AE%B0/c6fbb174558f4f588baec36393be98b8.png&#34;
	width=&#34;327&#34;
	height=&#34;371&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;31f86191b414a2a109b47cd2a5e7351d.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;88&#34;
		data-flex-basis=&#34;211px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Filesystem&lt;/code&gt; （文件系统）：可以设置磁盘分区格式，一般为默认的EXT4&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hdsize&lt;/code&gt; （硬盘容量）：定义目标硬盘的容量大小，通过设置这个参数，你可以配置硬盘预留部分空间给他用。
&lt;ul&gt;
&lt;li&gt;建议不要预留空间，不要在系统盘上再建立其他卷组，要完整使用目标硬盘空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swapsize&lt;/code&gt; （交换分区容量）：定义swap逻辑卷的容量大小，默认和服务器物理内存容量大小一致，最小值为4GB，最大值为8GB，最大值不能大过&lt;code&gt;hdsize/8&lt;/code&gt;。注意，如设置为0，将不会创建swap逻辑卷。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxroot&lt;/code&gt; 用于保存PVE操作系统镜像的独立空间，最大值限制为&lt;code&gt;hdsize/4&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;（作为参考：Windows 10的安装镜像大小约7GB）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minfree&lt;/code&gt; 预留空间：定义pve卷组容量中除了&lt;code&gt;swap&lt;/code&gt;、&lt;code&gt;root&lt;/code&gt;以及&lt;code&gt;data&lt;/code&gt;逻辑卷容量之外剩余的可用容量大小，也就是说&lt;code&gt;minfree&lt;/code&gt;大小可以按照下面方式来计算
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;minfree = pve - swapsize - rootsize - datasize&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxvz&lt;/code&gt; 用于保存数据之用，例如创建的虚拟机硬盘空间，虚拟机文件容量大小不能超过&lt;code&gt;maxvz&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;



  &lt;blockquote&gt;
    &lt;p&gt;如果已经安装好了又想调整分区大小，可以考虑重装系统。因为lvm分区只能扩容不能缩减容量。而重装系统操作也不太麻烦，只需要把所有虚拟机通过拍快照的方式备份到别的磁盘，然后在新系统上还原即可。&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h3 id=&#34;时区配置&#34;&gt;时区配置
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E5%9C%A8%E5%AE%B6%E9%87%8C%E7%9A%84%E4%B8%BB%E6%9C%BA%E4%B8%8A%E9%83%A8%E7%BD%B2pve%E5%B0%8F%E8%AE%B0/95d617e4abe242e39ed9c99bec664ba1.png&#34;
	width=&#34;410&#34;
	height=&#34;210&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;ae75bce80340ecc18f78779f398fbadd.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;195&#34;
		data-flex-basis=&#34;468px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Country&lt;/code&gt; 国家/地区：匹配与你物理距离最近的镜像站，如实配置即可&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Time zone&lt;/code&gt; 配置系统时区&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Keyboard Layout&lt;/code&gt; 键盘布局&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;用户名及密码&#34;&gt;用户名及密码
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E5%9C%A8%E5%AE%B6%E9%87%8C%E7%9A%84%E4%B8%BB%E6%9C%BA%E4%B8%8A%E9%83%A8%E7%BD%B2pve%E5%B0%8F%E8%AE%B0/9e2ed409152048dea3d04a709d09212d.png&#34;
	width=&#34;331&#34;
	height=&#34;181&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;06d18119a10fb05b5bacf7f572d23b8f.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;182&#34;
		data-flex-basis=&#34;438px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入你的密码并重复！&lt;em&gt;&lt;strong&gt;请妥善保管&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;输入你正常使用的邮箱，这样一来，如果你的PVE出了什么问题，你将会收到邮件提示（前提是你的PVE成功连接到了外网）
&lt;ul&gt;
&lt;li&gt;警告有两类
&lt;ul&gt;
&lt;li&gt;系统警告，比如磁盘SMART警告&lt;/li&gt;
&lt;li&gt;执行cron任务失败警告（包括自己配置的cron任务）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;配置网络信息&#34;&gt;配置网络信息
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E5%9C%A8%E5%AE%B6%E9%87%8C%E7%9A%84%E4%B8%BB%E6%9C%BA%E4%B8%8A%E9%83%A8%E7%BD%B2pve%E5%B0%8F%E8%AE%B0/2de0f7391d2944b990f4339106647a1b.png&#34;
	width=&#34;525&#34;
	height=&#34;263&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;211caad4f29127f04a3acaa331c8215e.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;199&#34;
		data-flex-basis=&#34;479px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Management Interface&lt;/code&gt; （管理端口）：这里需要填写分配给 PVE 用于管理的&lt;strong&gt;物理网口&lt;/strong&gt;。确保在启动时已将网线接入此管理网口，并在电脑上配置固定 IP 以访问 PVE 的 WebUI。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Hostname (FQDN)&lt;/code&gt;（主机名）：这里需要填入 PVE 的 &lt;code&gt;Hostname&lt;/code&gt;。正确设置主机名后，可以方便局域网中的各个设备相互识别，这里作者娘建议将PVE的&lt;code&gt;Hostname&lt;/code&gt;设置为 &lt;code&gt;pve.&amp;lt;my_name&amp;gt;.local&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IP Address (CIDR)&lt;/code&gt; （IP地址）：这里要求填入 PVE宿主机 的静态IP，如果你在引导开机前便将网线接入设备，这里应该会被自动填充&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gatway&lt;/code&gt; （网关）：这里要填写PVE宿主机的网关地址，如果你在引导开机前便将网线接入设备，这里应该会被自动填充&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DNS Server&lt;/code&gt; （DNS服务器）：这里要填写PVE宿主机的DNS服务器地址，如果你在引导开机前便将网线接入设备，这里应该会被自动填充&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;如果没有什么意外的话，一路确定后出现的进度条会顺利走完并自动重启，记得拔掉你的U盘并在bios确定启动项。&lt;/p&gt;
&lt;h3 id=&#34;webui登录&#34;&gt;WebUI登录
&lt;/h3&gt;&lt;p&gt;在浏览器中输入你分配给PVE宿主机的IP与端口（默认&lt;code&gt;8006&lt;/code&gt;）即可访问&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E5%9C%A8%E5%AE%B6%E9%87%8C%E7%9A%84%E4%B8%BB%E6%9C%BA%E4%B8%8A%E9%83%A8%E7%BD%B2pve%E5%B0%8F%E8%AE%B0/f9b285ea5cc344b79d1503ba8b4507ce.png&#34;
	width=&#34;395&#34;
	height=&#34;196&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;33f529ff351a43bb909b3e1271120f96.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;201&#34;
		data-flex-basis=&#34;483px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认用户名为&lt;code&gt;root&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;密码为你刚才在安装时配置的密码&lt;/li&gt;
&lt;li&gt;Realm为身份验证，本次登录中无需配置&lt;/li&gt;
&lt;li&gt;Language  &lt;em&gt;让我们说中文&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;后续配置&#34;&gt;后续配置
&lt;/h2&gt;&lt;h3 id=&#34;更换软件源&#34;&gt;更换软件源
&lt;/h3&gt;&lt;p&gt;pve默认配置的是需要付费的企业源，需要配置成免费源。&lt;br&gt;
此外，如果服务器在国内，我们需要更换为清华大学开源软件镜像站的pve和Debian源。&lt;br&gt;
输入下方命令删除该文件&lt;code&gt;/etc/apt/sources.list.d/pve-enterprise.list&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -f /etc/apt/sources.list.d/pve-install-repo.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输入下方命令添加TUNA的pve免费源。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian buster pve-no-subscription&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;etc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;apt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sources&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pve&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;no&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;subscription&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# OR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;etc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;apt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sources&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pve&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;no&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;subscription&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输入下方命令更换Debian源&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;echo &amp;#34;# 默认注释了源码镜像以提高 apt update 速度，如有需要可自行取消注释
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free&amp;#34; &amp;gt; /etc/apt/sources.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;开启设备直通iommu&#34;&gt;开启设备直通（IOMMU）
&lt;/h3&gt;&lt;p&gt;如果想直通PCIE设备的，比如显卡、sas卡等，需要开启IOMMU。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;编辑文件&lt;code&gt;/etc/default/grub&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于intel的CPU，将&lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt;所在行添加&lt;code&gt;intel_iommu=on&lt;/code&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet intel_iommu=on&amp;#34; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;对于AMD的cpu，将&lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt;所在行添加&lt;code&gt;amd_iommu=on&lt;/code&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet amd_iommu=on&amp;#34; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;操作完成后执行&lt;code&gt;update-grub&lt;/code&gt;并重启&lt;/p&gt;
&lt;p&gt;将这些内容添加进&lt;code&gt;/etc/modules&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vfio
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vfio_iommu_type1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vfio_pci
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vfio_virqfd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
        </item>
        <item>
        <title>AutoLab 基本使用</title>
        <link>https://blog.rinchord.top/p/autolab-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</link>
        <pubDate>Wed, 23 Apr 2025 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/autolab-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</guid>
        <description>&lt;p&gt;因为好多人（包括作者）都不太会用Autolab，所以这篇小贴士便应运而生&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/autolab-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/4149d28e49d3424c818f7bab4dd8079f.png&#34;
	width=&#34;1000&#34;
	height=&#34;495&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-6-1.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;202&#34;
		data-flex-basis=&#34;484px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;01-在提交代码时&#34;&gt;01: 在提交代码时
&lt;/h2&gt;&lt;p&gt;提交代码前请务必把你的&lt;code&gt;IDE\文本编辑器\任何可以写出代码的东西&lt;/code&gt;的编码调整为UTF-8&lt;br&gt;
（具体怎么做请自行Google）&lt;/p&gt;
&lt;h2 id=&#34;02-如果判卷结果与预期不一致&#34;&gt;02: 如果判卷结果与预期不一致
&lt;/h2&gt;&lt;p&gt;如果你的代码被判定为0分，这意味着以下几种可能性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你的代码具有语法错误&lt;/li&gt;
&lt;li&gt;某个返回值为0以外的其他值&lt;/li&gt;
&lt;li&gt;Autolab行为异常&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;03-在提交代码后&#34;&gt;03: 在提交代码后
&lt;/h2&gt;&lt;p&gt;在你提交代码后，如果有某几项分数显示为“-”（而不是诸如“0”这样的数字），这意味着该项目将由人工评分。&lt;/p&gt;
&lt;h2 id=&#34;04-大小写严格匹配&#34;&gt;04: 大小写严格匹配
&lt;/h2&gt;&lt;p&gt;autolab严格匹配&lt;code&gt;大小写&lt;/code&gt;、&lt;code&gt;全半角&lt;/code&gt;、&lt;code&gt;空格&lt;/code&gt;等字符，请仔细检查后继续提交&lt;/p&gt;
&lt;h2 id=&#34;05-有限的提交次数&#34;&gt;05: 有限的提交次数
&lt;/h2&gt;&lt;p&gt;一般来讲，autolab有限定的提交次数【一般为三次】。当你的提交超过限定次数后，将存在按比例扣分的惩罚，请谨慎提交。&lt;/p&gt;
&lt;h2 id=&#34;06-关于如何查看判卷结果与答案&#34;&gt;06: 关于如何查看判卷结果与答案
&lt;/h2&gt;&lt;p&gt;Autolab内网网址:http://172.31.13.200/&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/autolab-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/1184ab92a72042cf8b93463aa8e6731e.png&#34;
	width=&#34;1000&#34;
	height=&#34;505&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-1-3.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;198&#34;
		data-flex-basis=&#34;475px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/autolab-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/45ddf498c48a4d859696a7c57490032e.png&#34;
	width=&#34;1000&#34;
	height=&#34;553&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-2-1.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;180&#34;
		data-flex-basis=&#34;433px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/autolab-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/a713509c5f294be0aa21296a9aa2c301.png&#34;
	width=&#34;1000&#34;
	height=&#34;549&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-3-3.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;182&#34;
		data-flex-basis=&#34;437px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Grace day属于没有在C语言课上运用的机制。本意是给每个学生可以自由分配迟交天数。假设一个课给了每个学生5个Grace Day，那么理想情况就是这个学生因为自己的私事/身体原因等，自由的决定一些特定的作业进行迟交。而迟交的天数如果总共不超过5，都不会额外扣分。&lt;/p&gt;
&lt;h2 id=&#34;07-避免程序无法通过&#34;&gt;07: 避免程序无法通过
&lt;/h2&gt;


  &lt;blockquote&gt;
    &lt;p&gt;autolab很大一部分时候循环输出后面要加一个空格再换行，这样可以大大增加程序输出格式通过率（Hu，2024）&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h2 id=&#34;08-comment给分方式&#34;&gt;08: Comment给分方式
&lt;/h2&gt;&lt;p&gt;自动判卷程序依靠注释数量给分，请多写几条注释~~（个人测试：一般写10条就够）~~&lt;/p&gt;
&lt;h2 id=&#34;09-遇到makefile报错&#34;&gt;09: 遇到Makefile报错
&lt;/h2&gt;&lt;p&gt;如果在提交过程中遇到此报错信息&lt;code&gt;The missing file are:/.../autograde-makefile&lt;/code&gt;，请直接无视，这是自动判卷程序的答案未上传导致的报错，不影响正常提交。&lt;/p&gt;
&lt;p&gt;本文中图片由&lt;a class=&#34;link&#34; href=&#34;https://blog.zlicdt.top/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;某同学&lt;/a&gt;友情提供&lt;/p&gt;
</description>
        </item>
        <item>
        <title>简单了解git</title>
        <link>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3git/</link>
        <pubDate>Wed, 23 Apr 2025 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3git/</guid>
        <description>&lt;h1 id=&#34;简单的git教学&#34;&gt;简单的GIT教学
&lt;/h1&gt;&lt;h2 id=&#34;开箱配置&#34;&gt;开箱配置
&lt;/h2&gt;&lt;p&gt;配置你的用户信息（用于确定你的身份，并非登录）&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  git config --global user.email &amp;#34;you@example.com&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  git config --global user.name &amp;#34;Your Name&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;常用命令&#34;&gt;常用命令
&lt;/h2&gt;&lt;h4 id=&#34;git-init&#34;&gt;&lt;code&gt;git init&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;在指定的根目录创建.git，这就是代码仓库，别动它！&lt;/p&gt;
&lt;h4 id=&#34;git-clone&#34;&gt;&lt;code&gt;git clone&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;把别人的在线仓库下载到本地&lt;/p&gt;
&lt;h4 id=&#34;git-log&#34;&gt;&lt;code&gt;git log&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;查看提交记录、文件变更、提交id&lt;/p&gt;
&lt;h4 id=&#34;git-status&#34;&gt;&lt;code&gt;git status&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;查看是否有未提交的新更改&lt;/p&gt;
&lt;h4 id=&#34;git-diff-&#34;&gt;&lt;code&gt;git diff &amp;lt;&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;当使用commit id来代替&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;时，将查看该次提交的具体变更记录&lt;br&gt;
当使用文件名来代替&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;时，将查看该文件的具体变更记录&lt;/p&gt;
&lt;h2 id=&#34;提交流程&#34;&gt;提交流程
&lt;/h2&gt;&lt;h4 id=&#34;git-add-filename&#34;&gt;&lt;code&gt;git add &amp;lt;filename&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;(仅当你创建了新的文件时才需要使用)&lt;br&gt;
把你的更改提交到本地暂存区&lt;br&gt;
&lt;code&gt;&amp;lt;filename&amp;gt;&lt;/code&gt;用你想要提交的文件名替代，如果你想要提交仓库根目录的所有文件，使用&lt;code&gt;.&lt;/code&gt;来替代&lt;code&gt;&amp;lt;filename&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;git-commit--m-comment&#34;&gt;&lt;code&gt;git commit -m &amp;quot;comment&amp;quot;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;提交本地暂存区的文件&lt;br&gt;
&lt;code&gt;comment&lt;/code&gt;是可选内容，如果需要，用注释（本次提交的简单概括）来替代&lt;/p&gt;
&lt;h2 id=&#34;backtrack&#34;&gt;Backtrack
&lt;/h2&gt;


  &lt;blockquote&gt;
    &lt;p&gt;使用&lt;code&gt;git log&lt;/code&gt;以查看提交id，&lt;br&gt;
如果显示信息太多，使用如下命令&lt;br&gt;
&lt;code&gt;git log –pretty=oneline&lt;/code&gt;&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h4 id=&#34;git-diff-commit-id&#34;&gt;&lt;code&gt;git diff &amp;lt;commit id&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;使用提交id替代&lt;code&gt;&amp;lt;commit id&amp;gt;&lt;/code&gt;，即可查看该次提交的具体变动&lt;/p&gt;
&lt;h4 id=&#34;git-reset---hard-&#34;&gt;&lt;code&gt;git reset --hard &amp;lt;&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;使用&lt;code&gt;^&lt;/code&gt;替代&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;，将回到上一提交&lt;br&gt;
使用提交id替代&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;，将回到id对应提交&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在git reset前想清楚！你到底需不需要reset！&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;误git-reset后的挽回手段&#34;&gt;误git reset后的挽回手段
&lt;/h3&gt;&lt;h4 id=&#34;git-reflog&#34;&gt;&lt;code&gt;git reflog&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;展示当前仓库的引用日志，记录当前仓库的“HEAD、分支或其他引用”的变化记录&lt;br&gt;
我们使用这个命令来获取需恢复提交记录的哈希&lt;/p&gt;
&lt;h4 id=&#34;git-checkout-commit-id&#34;&gt;&lt;code&gt;git checkout &amp;lt;commit id&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;使用你获取到的提交记录哈希值替换&lt;code&gt;&amp;lt;commit id&amp;gt;&lt;/code&gt;，来恢复对应提交记录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在完成恢复后，你会处于&lt;code&gt;detached HEAD&lt;/code&gt;分支状态，请创建新分支来继续开发&lt;/li&gt;
&lt;li&gt;记得跟你的团队成员说一声你误操作了，在你向线上仓库提交之前&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;branch&#34;&gt;Branch
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;git具有一个强大的分支功能&lt;/li&gt;
&lt;li&gt;一个项目，一定具有一个主分支（以前叫&lt;code&gt;master&lt;/code&gt;现在叫&lt;code&gt;main&lt;/code&gt;..因为&lt;code&gt;master&lt;/code&gt;有奴隶主的意思,要避嫌)&lt;/li&gt;
&lt;li&gt;搞开发请自己创建一个dev分支，在dev分支上干活，干完活并确保没问题后再把内容合并到main上。&lt;/li&gt;
&lt;li&gt;往主分支上丢东西要慎重！无论何时，主分支应该永远是你最稳定的分支&lt;/li&gt;
&lt;li&gt;主分支的内容必定小于等于其他分支，如果主分支的东西比其他分支多了，那么提交的时候就会出现合并冲突！&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;git-branch&#34;&gt;&lt;code&gt;git branch&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;查看分支&lt;/p&gt;
&lt;h4 id=&#34;git-checkout-b-name&#34;&gt;&lt;code&gt;git checkout –b &amp;lt;name&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;创建+切换分支&lt;/p&gt;
&lt;h4 id=&#34;git-checkout-name&#34;&gt;&lt;code&gt;git checkout &amp;lt;name&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;切换分支&lt;/p&gt;
&lt;h4 id=&#34;git-merge-name&#34;&gt;&lt;code&gt;git merge &amp;lt;name&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;合并某分支到当前分支&lt;/p&gt;
&lt;h4 id=&#34;git-branch-d-name&#34;&gt;&lt;code&gt;git branch –d &amp;lt;name&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;删除分支&lt;/p&gt;
&lt;h2 id=&#34;remote-repo&#34;&gt;Remote repo
&lt;/h2&gt;&lt;h3 id=&#34;把你的本地仓库与云端仓库关联起来&#34;&gt;把你的本地仓库与云端仓库关联起来
&lt;/h3&gt;&lt;h4 id=&#34;生成私钥文件&#34;&gt;生成私钥文件
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;执行命令&lt;br&gt;
&lt;code&gt;ssh-keygen -t rsa -C &amp;quot;xxxx@example.com&amp;quot;&lt;/code&gt;&lt;br&gt;
把&lt;code&gt;xxxx@example.com&lt;/code&gt;替换成你的邮箱地址（用于识别你）&lt;/li&gt;
&lt;li&gt;直接回车生成默认目录&lt;/li&gt;
&lt;li&gt;密码不想设置可以直接回车两下，如设置密码后每次提交均需要输入密码&lt;/li&gt;
&lt;li&gt;私钥的默认存储路径为&lt;code&gt;/c/Users/&amp;lt;username&amp;gt;/.ssh/id_rsa&lt;/code&gt;，在gitbash窗口里也有写&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;导出你的私钥内容&#34;&gt;导出你的私钥内容
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;转到存储刚才生成的私钥目录&lt;/li&gt;
&lt;li&gt;在当前目录右键打开git bash&lt;/li&gt;
&lt;li&gt;使用命令&lt;code&gt;cat ~/.ssh/id_rsa.pub&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;复制输出的内容，以&lt;code&gt;ssh-rsa&lt;/code&gt;开头，而以&lt;code&gt;.com&lt;/code&gt;作为结尾&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;配置github&#34;&gt;配置GitHub
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;打开github的settings页面&lt;/li&gt;
&lt;li&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3git/f0da251aba1a7f8b9a8f6313cac36374.png&#34;
	width=&#34;1920&#34;
	height=&#34;1001&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;f0da251aba1a7f8b9a8f6313cac36374.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;191&#34;
		data-flex-basis=&#34;460px&#34;
	
&gt;&lt;/li&gt;
&lt;li&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3git/8bef1ee9f4cd15b7e43c2ea6bd75999e.png&#34;
	width=&#34;1920&#34;
	height=&#34;957&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;8bef1ee9f4cd15b7e43c2ea6bd75999e.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;200&#34;
		data-flex-basis=&#34;481px&#34;
	
&gt;&lt;/li&gt;
&lt;li&gt;把你刚才复制的私钥内容粘进去，请注意，&lt;code&gt;rsa&lt;/code&gt;开头的是私钥，不能泄露&lt;/li&gt;
&lt;li&gt;起个有意义的名字填上去&lt;/li&gt;
&lt;li&gt;保存&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;与云端仓库进行同步&#34;&gt;与云端仓库进行同步
&lt;/h3&gt;&lt;h4 id=&#34;建个仓库不需要教吧&#34;&gt;建个仓库不需要教吧
&lt;/h4&gt;&lt;h4 id=&#34;git-remote-add-origin-your-repo-link&#34;&gt;&lt;code&gt;git remote add origin &amp;lt;your repo link&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;使用你的仓库地址替代&lt;code&gt;&amp;lt;your repo link&amp;gt;&lt;/code&gt;，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;把本地库的内容推送到远程，使用 git push命令，实际上是把当前分支master推送到远程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;由于远程库是空的，我们第一次推送&lt;code&gt;main&lt;/code&gt;分支时，加上了 &lt;code&gt;–u&lt;/code&gt;参数，Git不但会把本地的&lt;code&gt;main&lt;/code&gt;分支内容推送的远程新的&lt;code&gt;main&lt;/code&gt;分支，还会把本地的&lt;code&gt;main&lt;/code&gt;分支和远程的&lt;code&gt;master&lt;/code&gt;分支关联起来，在以后的推送或者拉取时就可以简化命令。&lt;br&gt;
例如：&lt;br&gt;
&lt;code&gt;git remote add origin https://github.com/Rinsutoringu/COMP1023-Foundations-of-C-Programming.git&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;git-push-origin-branch-name&#34;&gt;&lt;code&gt;git push origin &amp;lt;branch name&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;把&lt;code&gt;&amp;lt;branch name&amp;gt;&lt;/code&gt;替换为分支名（如main）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;之后对云端已存储的某分支作修改后，使用这条指令向云同步。&lt;/li&gt;
&lt;/ul&gt;



  &lt;blockquote&gt;
    &lt;p&gt;不要在远程仓库上干活，搞什么乱七八糟的事情在本地搞好了再push上去！&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h3 id=&#34;多人协作&#34;&gt;多人协作
&lt;/h3&gt;


  &lt;blockquote&gt;
    &lt;p&gt;当你从远程库克隆时候，实际上Git自动把本地的master分支和远程的master分支对应起来了，并且远程库的默认名称是origin。&lt;br&gt;
如果要多人协作的话，每个人都要开一个属于自己的分支来干活，干完活的内容要提交到属于自己的main分支上，经过审核后才能合并到主要的main分支。&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h4 id=&#34;git-remote&#34;&gt;&lt;code&gt;git remote&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;查看远程库的信息(如名称)&lt;/p&gt;
&lt;h4 id=&#34;git-remote-v&#34;&gt;&lt;code&gt;git remote –v&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;查看远程库的详细信息&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3git/2a817565907a2ca48706a5b7c0496708.png&#34;
	width=&#34;619&#34;
	height=&#34;169&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;2a817565907a2ca48706a5b7c0496708.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;366&#34;
		data-flex-basis=&#34;879px&#34;
	
&gt;&lt;/p&gt;
&lt;h4 id=&#34;git-push-origin-branch-name-1&#34;&gt;&lt;code&gt;git push origin &amp;lt;branch name&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;推送本地指定分支到云端&lt;/p&gt;
&lt;h4 id=&#34;git-checkout-b-branch-name-originbranch-name&#34;&gt;&lt;code&gt;git checkout –b &amp;lt;branch name&amp;gt; origin/&amp;lt;branch name&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;从云端拉取指定名称的分支到本地&lt;/p&gt;
&lt;h4 id=&#34;git-pull-origin-branch-name&#34;&gt;&lt;code&gt;git pull origin &amp;lt;branch name&amp;gt;&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;从云端合并到本地&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果其他人改动了项目的其他结构，那么你就没法直接向云端提交了。&lt;/li&gt;
&lt;li&gt;因为git的逻辑是多的那方给少的那方提交资料&lt;/li&gt;
&lt;li&gt;你就得执行这条指令来同步其他人的工作，然后再提交自己的东西。&lt;/li&gt;
&lt;li&gt;就算仓库同名，也不一定能push上去，因为git需要关联远程仓库，请关注git的错误提示来进行手动关联。&lt;/li&gt;
&lt;li&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3git/32ed163ee6b322610b7d549bc7c7cbbb.png&#34;
	width=&#34;646&#34;
	height=&#34;199&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;32ed163ee6b322610b7d549bc7c7cbbb.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;324&#34;
		data-flex-basis=&#34;779px&#34;
	
&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;解决合并冲突&#34;&gt;解决合并冲突
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3git/a4bb7c7de5328a02ff9ca02aada235e2.png&#34;
	width=&#34;634&#34;
	height=&#34;589&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;a4bb7c7de5328a02ff9ca02aada235e2.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;107&#34;
		data-flex-basis=&#34;258px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先尝试合并，如果有冲突会报错，看着报错信息自行处理。&lt;/li&gt;
&lt;li&gt;处理好了重新提交即可&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;记得配置代理&#34;&gt;记得配置代理！
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git config --global http.proxy http://127.0.0.1:1080
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git config --global https.proxy https://127.0.0.1:1080
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;// 全局代理
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- git config --global http.https://github.com.proxy https://127.0.0.1:1080
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git config --global https.https://github.com.proxy https://127.0.0.1:1080
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;// 仅配置git的代理
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.cnblogs.com/China-Dream/p/16476775.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Git 代理设置方法 - 余以为&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>简单了解PID</title>
        <link>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/</link>
        <pubDate>Sun, 10 Nov 2024 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/</guid>
        <description>


  &lt;blockquote&gt;
    &lt;p&gt;参考内容&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.bilibili.com/video/BV1G9zdYQEr3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.bilibili.com/video/BV1G9zdYQEr3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/wiki/%e7%a9%8d%e5%88%86%e9%a3%bd%e5%92%8c&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;积分饱和 - 维基百科，自由的百科全书&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

  &lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;PID基本理论公式&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
$$
out(t)=K_p*error(t)+K_i*\int^{t}_{0}error(t)dt+K_d*\frac{derror(t)}{dt}
$$&lt;p&gt;&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/Y6dedMEd0zuAkJbBigXtDrCY.png&#34;
	width=&#34;1290&#34;
	height=&#34;447&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251010195316893&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;288&#34;
		data-flex-basis=&#34;692px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;比例项&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;比例项的输出仅取决于当前时刻的误差，$K_p$越大，第一部分的值越大，系统响应越快，==稳态误差==越小，但==超调==也会增加。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;稳态误差&lt;/strong&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;纯比例项控制时，如果误差为0，则$K_p$比例也是0，给被控对象的输入就是0，此时，被控对象可能会自发地向一个方向偏移而产生误差&lt;/p&gt;
&lt;p&gt;这个误差会让$K_p$开始负反馈调控，当调控输出力度与自发偏移力度一致时，系统将达到稳态 (如：电机的输出与电机的摩擦达到一致)。&lt;/p&gt;



  &lt;blockquote class=&#34;alert alert-tip&#34;&gt;
    &lt;p class=&#34;alert-heading&#34;&gt;
      💡
      
        Tip
      
    &lt;/p&gt;
    &lt;p&gt;思考： 系统认为当前的输出可以让被控设备达到稳态，但实际上被控设备存在一些未知的阻力。&lt;/p&gt;
&lt;p&gt;系统想要设备更靠近目标状态一些，但问题是设备上有阻力，当前误差所带来的驱动力太小的话是没办法克服阻力的。&lt;/p&gt;
&lt;p&gt;所以，当驱动力=阻力时，设备就没办法继续向目标状态靠近，而是进入稳态了  在这种情况下的K_p提供了对抗摩擦力的输出&lt;/p&gt;
  &lt;/blockquote&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;给系统输入0，系统自发偏移的方向就是稳态误差的方向。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/WMWg2ngpJclG8QNZOczFKRs-.png&#34;
	width=&#34;889&#34;
	height=&#34;580&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251010202023517&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;153&#34;
		data-flex-basis=&#34;367px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;积分项&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;积分的本质是&lt;code&gt;累加&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$K_i$会不断累加过去的误差（包括正误差和负误差),将之作为当前的输出。&lt;/p&gt;
&lt;p&gt;这意味着$K_i$的输出是具有滞后性的，在系统输入目标改变一段时间后，输出才会到达目标值。（图一）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$K_i$会消除稳态误差的原因是：如果系统无法达到目标值，它所提供的输出会越来越大，&lt;strong&gt;直到&lt;/strong&gt;系统达到目标值为止。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在$K_p$和$K_i$联合运作时，先是$K_p$快速地提高输出，然后在稳态误差的作用下停止输出，此后$K_i$再依靠不断累计的输出将被控设备运动到位。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/SnCMU5iqa1h0L8iPRP2htmkF.png&#34;
	width=&#34;1271&#34;
	height=&#34;512&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251010203557427&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;248&#34;
		data-flex-basis=&#34;595px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;微分项&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;微分的本质是求误差变化的斜率，而斜率和当前时刻附近误差变化的趋势有关系&lt;/li&gt;
&lt;li&gt;误差变化的越大，误差变化率的斜率就越大根据斜率来输出阻力，就可以阻碍误差的急剧变化。
&lt;ul&gt;
&lt;li&gt;当误差急剧升高时，对误差求导得到的斜率就会变大&lt;/li&gt;
&lt;li&gt;当误差急剧降低时，对误差求导得到的斜率就会变小&lt;/li&gt;
&lt;li&gt;直接使用这个斜率作为参数再乘以一个常量就可以给系统引入阻尼了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果$K_d$给的过大，阻尼就会过大，此时系统会表现得“卡卡的”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/5oFtDv1jHaDqZh4MuBJhYurV.png&#34;
	width=&#34;574&#34;
	height=&#34;249&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251010205004615&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;230&#34;
		data-flex-basis=&#34;553px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;倒立摆电机编码器在不同$K_d$时的输出值拟合曲线。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;将PID离散化&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3pid/8TfW2X9exXHWmlapGSKkBoNw.png&#34;
	width=&#34;266&#34;
	height=&#34;216&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251010232522266&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;123&#34;
		data-flex-basis=&#34;295px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;原有的pid公式是一个线性过程，适用于模拟电路。但是在数字电路中并不适用，所以需要进行离散化&lt;/p&gt;
&lt;p&gt;原有公式$out(t)=K_p&lt;em&gt;error(t)+K_i&lt;/em&gt;\int^{t}_{0}error(t)dt+K_d*\frac{derror(t)}{dt}$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通过面积法，可以把$K_i$转换为$K_i*T\sum^t_{j=0}error(j)$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;其中$T$为单个步长，即“所有矩形面积相加之和”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过中值定理，可以把$K_d$转换为$K_d*\frac{error(k)-error(k-1)}{T}$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公式中分数的含义即对应“矩形的中值”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终得到公式&lt;br&gt;
&lt;/p&gt;
$$
out(t)=K_p*error(k)+K_i*T\sum^t_{j=0}error(j)+K_d*\frac{error(k)-error(k-1)}{T}
$$&lt;p&gt;&lt;br&gt;
当然我们也可以把T并入到$K_i$和$K_d$中，也就是&lt;br&gt;
&lt;/p&gt;
$$
out(t)=K_p*error(k)+K_i*\sum^t_{j=0}error(j)+K_d*error(k)-error(k-1)
$$&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;全量式PID和增量式PID&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;全量式PID&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;即传统式PID&lt;/li&gt;
&lt;li&gt;优势
&lt;ul&gt;
&lt;li&gt;可以直接输出给目标设备&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;增量式PID&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;即输出为上一次的增量(或负增量)&lt;/li&gt;
&lt;li&gt;优势
&lt;ul&gt;
&lt;li&gt;计算方便：只需要得到&lt;code&gt;out(k)&lt;/code&gt; &lt;code&gt;out(k-1)&lt;/code&gt; &lt;code&gt;out(k-2)&lt;/code&gt;这三个值就可以计算增量了&lt;/li&gt;
&lt;li&gt;限幅更方便（防止积分饱和&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;与过摆）&lt;/li&gt;
&lt;li&gt;因为会持续存储控制状态，在手动切换到自动的过渡中会更平缓(全量式pid需要一定的时间来进行适应)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;计算公式：$\Delta out(k)=out(k)-out(k-1)$&lt;/li&gt;
&lt;/ul&gt;
$$
\Delta out(k)=[K_p*(error(k)-error(k-1))]+[K_i*error(k)]+[K_d*(error(k)-2error(k-1)+error(k-2)])
$$&lt;hr&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;更高级的PID&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;积分限幅&lt;/p&gt;
&lt;p&gt;积分分离(线性&amp;amp;非线性)&lt;/p&gt;
&lt;p&gt;【待补充】&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;积分饱和是指&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/wiki/PID%e6%8e%a7%e5%88%b6%e5%99%a8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PID控制器&lt;/a&gt;或是其他有&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/wiki/%e7%a9%8d%e5%88%86%e5%99%a8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;积分器&lt;/a&gt;的控制器中的现象，是指误差有大幅变化（例如大幅增加），积分器因为误差的大幅增加有很大的累计量，因此造成&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/wiki/%e8%bf%87%e5%86%b2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;过冲&lt;/a&gt;，而且当误差变为负时，其过冲仍维持一段时间之后才恢复正常的情形&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
        </item>
        <item>
        <title>简单了解MOS</title>
        <link>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/</link>
        <pubDate>Sat, 29 Jun 2024 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/</guid>
        <description>


  &lt;blockquote&gt;
    &lt;p&gt;参考资料&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.bilibili.com/video/BV1Y3t4etEtT&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.bilibili.com/video/BV1Y3t4etEtT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.bilibili.com/video/BV1x1421R7WT&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.bilibili.com/video/BV1x1421R7WT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.bilibili.com/video/BV1fB4y147Gn&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.bilibili.com/video/BV1fB4y147Gn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

  &lt;/blockquote&gt;

&lt;h1 id=&#34;三极管和mos管&#34;&gt;三极管和MOS管
&lt;/h1&gt;&lt;h2 id=&#34;二极管&#34;&gt;二极管
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;PN结(二极管器件)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/JA6fEauxIsRERzORDzOgO7BV.png&#34;
	width=&#34;625&#34;
	height=&#34;125&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251014054638305&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;500&#34;
		data-flex-basis=&#34;1200px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;组成&lt;/strong&gt;&lt;br&gt;
在一块硅片上掺杂不同的元素可以得到半导体&lt;br&gt;
掺杂硼成为P型半导体，掺杂五价磷成为N型半导体&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;性质&lt;/strong&gt;&lt;br&gt;
具有单向导电性&lt;br&gt;
电流从P流向N时，P、N之间将不存在绝缘区域，电路正常导通&lt;br&gt;
电流从N流向P时，P、N之间会产生大面积绝缘区域，从而阻止电路导通。&lt;/p&gt;
&lt;h2 id=&#34;三极管&#34;&gt;三极管
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;NPN结(三极管器件)&lt;/strong&gt;&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/1ec3fb9a2902d9d74c29cb2593297ab0.png&#34;
	width=&#34;749&#34;
	height=&#34;220&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;1ec3fb9a2902d9d74c29cb2593297ab0.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;340&#34;
		data-flex-basis=&#34;817px&#34;
	
&gt;&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/IeCm9vHZjatHgbtSSFFccqUc.png&#34;
	width=&#34;635&#34;
	height=&#34;185&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251014055213440&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;343&#34;
		data-flex-basis=&#34;823px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;性质&lt;/strong&gt;&lt;br&gt;
根据PN结特性，P向N1\N2导通时，N1和N2之间将会是通路&lt;br&gt;
意味着给P输入一个小电流就可以控制N1和N2的通断，从而允许大电流通过&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;四舍五入就是个信号放大器，如果N1常态性接电，P按需接电，那么N2就会根据P的状态输出更大的电流。&lt;br&gt;
在P没有输入电流的时候，N1尝试向P导通，根据PN结原理，此时将在P和N1之间形成一大面积绝缘区域，从而阻止电流通过。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NPN型三极管：在中间的P输入电流的时候，绝缘区域消失，两侧N将导通&lt;br&gt;
PNP型三极管：在中间的N输入电流的时候，将引发绝缘区域形成，而阻止两侧的P导通&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三极管的放大作用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;左侧的N半导体是高浓度的，右边的N半导体是低浓度的&lt;/p&gt;
&lt;p&gt;在E-C之间接入一个电源，会导致右侧N半导体的自由电子全部去C那边，这使得其靠左的部分成为耗尽区（没自由电子而不能导电）&lt;br&gt;
在E-B之间接入一个电源，这个电源会导致左边的N半导体的电子跑到中间的P半导体上，然后再被吸引到电源里。&lt;br&gt;
每有一个电子被从B上吸引到电源，就会在原地产生一个空穴，而因为左边的N浓度高，电子多，还多接了一个电源的负极，就会有多个电子来尝试抢占这个空穴。&lt;br&gt;
一个穴只能放一个电子，没抢到位置的电子就会游离在中间P上，此时，因为电子尝试向右边N迁移的力大于耗尽层同性相斥的力，所以这群游离电子会很容易地跑到右边。&lt;/p&gt;
&lt;p&gt;这就意味着，E-B电源每完成一个电子的迁移，E-C电源就会有一堆电子迁移过去。 这就是放大&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/SRjo6jHJzl92cfZOYUO2v80a.png&#34;
	width=&#34;628&#34;
	height=&#34;389&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251014072505344&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;161&#34;
		data-flex-basis=&#34;387px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;jfet&#34;&gt;JFET
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;结型场效应管(JFET)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/bd8IlIrkCJAlhbT9O3yPyf9z.png&#34;
	width=&#34;627&#34;
	height=&#34;259&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251014061634936&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;242&#34;
		data-flex-basis=&#34;581px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;&lt;br&gt;
电子在单一半导体（如N）中可以自由移动&lt;br&gt;
电流从N流向P会导致绝缘区域形成&lt;br&gt;
给N两端施加正电压，P两端施加负电压，就可以达成上述需求&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;此时，两端的P-N结将形成绝缘区域，且绝缘区域面积取决于电压强度&lt;/li&gt;
&lt;li&gt;当电压强度到达一定值时，两侧绝缘区域将闭合，阻断N半导体的上下连接。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在这种结构中，P-N结上实际上没有电流经过(因为施加负电压带来的结果是造成绝缘区域)&lt;br&gt;
所以此结构是电压控制型器件，也不会产生什么能量损耗。&lt;br&gt;
依然存在反过来的结构，即NPN型JFET，在栅极无电时导通，施加正电压时不导通&lt;/p&gt;
&lt;h3 id=&#34;mosfet&#34;&gt;MOSFET
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/t7Wc_0YDHI3PSepxDgBfQkVh.png&#34;
	width=&#34;578&#34;
	height=&#34;242&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251014062731707&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;238&#34;
		data-flex-basis=&#34;573px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当电容有电时，正电荷负电荷将会聚集在两端电极板的边缘上。&lt;/li&gt;
&lt;li&gt;当栅极G和衬底B之间被施加 &lt;strong&gt;合适的电压&lt;/strong&gt; 时，将会有一层 &lt;strong&gt;电子(带负电荷)\带正电荷的粒子&lt;/strong&gt; 聚集在靠近栅极的位置，连接源极和漏极，令其导通。&lt;/li&gt;
&lt;li&gt;当施加的电压消失时，电荷将重新均匀分布回P，电流通路就会断开。&lt;/li&gt;
&lt;li&gt;因存在PN结，所以会产生绝缘部分，绝大部分电流都过不去。这解决了JFET的无法完全断开问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;导通条件&lt;/strong&gt;&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://blog.csdn.net/qq_62361151/article/details/130170746&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://blog.csdn.net/qq_62361151/article/details/130170746&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;N沟道要求 $V_G &amp;gt; V_S$ 时导通&lt;br&gt;
用法：接负载时S极接GND，此时低电平 $V_G \leq V_{GND}$ 时截止，高电平 $V_G \geq V_{GND}$ 时导通&lt;/p&gt;
&lt;p&gt;P沟道要求 $V_G &amp;lt; V_S$ 时导通&lt;br&gt;
用法：接负载时S极接VCC，此时低电平 $V_G \leq V_{VCC}$ 时导通，高电平 $V_G \geq V_{VCC}$ 时截止&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/250d3401346103ed89b373f19c4a1a64.png&#34;
	width=&#34;712&#34;
	height=&#34;498&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;250d3401346103ed89b373f19c4a1a64.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;142&#34;
		data-flex-basis=&#34;343px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;类型&lt;/strong&gt;&lt;br&gt;
增强型MOS：两侧电极之间在无电压时默认断开&lt;br&gt;
耗尽型MOS：默认微微闭合&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/BRQGTmLmCsj_kP852LQw1fzN.png&#34;
	width=&#34;381&#34;
	height=&#34;207&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251014065453661&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;184&#34;
		data-flex-basis=&#34;441px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么源极和衬底要连到一起？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;明确源极和漏极&lt;/li&gt;
&lt;li&gt;简化接线&lt;/li&gt;
&lt;li&gt;短接源极和衬底之间形成的P-N结（寄生二极管），&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;解释寄生二极管&lt;br&gt;
此时电流若从衬底端进入，流向漏极，将会没有阻碍。这意味着MOS在源极漏极反接的状态下将会是强制通路&lt;br&gt;
如果电流正常方向流动，二极管会处于截止状态下，但有电子桥的话就可以不管二极管是否截止。此时MOS可以正常控制电路通断&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;导通要求&lt;/strong&gt;&lt;br&gt;
如果我们要让NMOS导通，需要给G极一个高于S极的电压。&lt;br&gt;
G|S极之间有一个寄生电容，当G侧充满正电荷时，S侧将充满负电荷，体现为S极往外流出电流&lt;br&gt;
如果要导通PMOS,需要给G极一个低于S极的电压。根据上述原理，S极将流入电流。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设计要求&lt;/strong&gt;&lt;br&gt;
NMOS要放在负载后面，使S极接地，这样我们只需要很小的电压就能让NMOS导通。&lt;br&gt;
PMOS要放在负载前面，S极接电源，这样只需要把G极拉到GND就可以让PMOS通&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优势&lt;/strong&gt;&lt;br&gt;
NMOS导电依靠电子，电子比PMOS导电所依靠的空穴更多。&lt;br&gt;
NMOS的导通内阻更小，寄生电容也更小&lt;/p&gt;
&lt;h2 id=&#34;mos驱动器&#34;&gt;MOS驱动器
&lt;/h2&gt;&lt;p&gt;MCU引脚电压低、电流小，难以快速地给MOS的栅极电容充放电&lt;br&gt;
MOS管的栅极具有较大的寄输入寄生电容，需要大电流。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   VDD ──┬──────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         │          │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   IN ──▶│ 输入级 ──▶│ 推挽输出级 ──▶ OUT ──▶ MOS 栅极
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         │ (施密特)  │ (大电流)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         │          │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   GND ──┴──────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;BSC070N10NS3 半桥驱动器&lt;/strong&gt;&lt;br&gt;
可以同时驱动上管和下管，需要自举电源。&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3mos/5a2689149ecd690190ae0de3d8d1443a.png&#34;
	width=&#34;376&#34;
	height=&#34;248&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;5a2689149ecd690190ae0de3d8d1443a.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;151&#34;
		data-flex-basis=&#34;363px&#34;
	
&gt;&lt;br&gt;
如使用自举电容，因电容\上管Gate极会漏电，需要时不时导通下管给电容充个电。&lt;br&gt;
这就没法做到100%占空比保证下管一直关断。&lt;br&gt;
如果我们想要让它可以buck\boost单模式工作，就得单独弄一条充电线路给自举电容。&lt;/p&gt;
&lt;p&gt;引脚定义：&lt;br&gt;
VDD：芯片偏置电源输入端。&lt;br&gt;
HI：高侧驱动器逻辑输入（TTL阈值）。&lt;br&gt;
LI：低侧驱动器逻辑输入（TTL阈值）。&lt;br&gt;
VSS：地（参考地）。&lt;br&gt;
LO：低侧驱动器输出。&lt;br&gt;
HS：高侧源极连接端（连接到半桥的中点）。&lt;br&gt;
HB：高侧自举电源端（连接外部自举电容）。&lt;br&gt;
HO：高侧驱动器输出。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>简单了解DCDC</title>
        <link>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3dcdc/</link>
        <pubDate>Wed, 31 Jan 2024 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3dcdc/</guid>
        <description>


  &lt;blockquote&gt;
    &lt;p&gt;参考内容&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.cnblogs.com/wcat/p/10058743.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.cnblogs.com/wcat/p/10058743.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.xlsemi.net/technical/technical_article/%E5%BC%80%E5%85%B3%E7%94%B5%E6%BA%90%E5%90%8C%E6%AD%A5%E4%B8%8E%E9%9D%9E%E5%90%8C%E6%AD%A5.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.xlsemi.net/technical/technical_article/%E5%BC%80%E5%85%B3%E7%94%B5%E6%BA%90%E5%90%8C%E6%AD%A5%E4%B8%8E%E9%9D%9E%E5%90%8C%E6%AD%A5.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

  &lt;/blockquote&gt;

&lt;h1 id=&#34;什么是dcdc&#34;&gt;什么是DCDC
&lt;/h1&gt;&lt;p&gt;DC/DC电源指直流转换为直流的电源&lt;br&gt;
DC/DC电源芯片主要是通过反馈电压与内部基准电压的的比较，从而调节MOS管的驱动波形的占空比，来保证输出电压的稳定。&lt;/p&gt;
&lt;h2 id=&#34;底层逻辑&#34;&gt;底层逻辑
&lt;/h2&gt;&lt;p&gt;当一个电感突然加上一个电压时，其中的电流逐渐增加，并且电感量越大，其电流增加越慢；&lt;br&gt;
当一个电感上的电流突然中断，会在电感两端产生一个瞬间高压，并且电感量越大该电压越高；&lt;/p&gt;
&lt;h2 id=&#34;不同种类的dcdc&#34;&gt;不同种类的DCDC
&lt;/h2&gt;


  &lt;blockquote&gt;
    &lt;p&gt;开关电源在功率管打开时会给电感充电，电感储能；功率管断开时，电感释放能量，从而实现电压变换。在功率管断开时，电感释放能量需要电流回路，续流元器件的选用不同，就会涉及到不同的整流方式，即同步整流和非同步整流。&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;同步型DCDC&lt;/strong&gt;&lt;br&gt;
功率管和续流器件均为MOS管，它们必须要按照电源的开关时序同步控制；不能同时导通，否则会发生短路&lt;/p&gt;
&lt;p&gt;优点：效率较高&lt;br&gt;
MOS管内阻小，在流过相同电流条件下，其导通电压降远远小于普通肖特基二极管的正向导通压降&lt;br&gt;
故MOS管的损耗功率远远比二极管的小，因而同步整流的效率高。&lt;/p&gt;
&lt;p&gt;缺点：稳定性不足&lt;br&gt;
同步整流需要为MOS管额外添加一个控制电路，使得上下两个MOS管能够同步，&lt;br&gt;
相对于非同步，同步的控制电路相对复杂，电路越复杂，稳定性越不可靠，若逻辑出现混乱，上下管同时导通，则系统必定失效。&lt;/p&gt;
&lt;p&gt;常见型号内部电路图如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3dcdc/948340399264b20fdb86ee744e24a37f.png&#34;
	width=&#34;615&#34;
	height=&#34;256&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;948340399264b20fdb86ee744e24a37f.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;240&#34;
		data-flex-basis=&#34;576px&#34;
	
&gt;&lt;br&gt;
&lt;strong&gt;非同步型DCDC&lt;/strong&gt;&lt;br&gt;
内部只有一个需要控制的开关管，续流由整流二极管完成；整流二极管并不需要驱动电路，而不需要被同步控制。&lt;/p&gt;
&lt;p&gt;优点：稳定性高&lt;br&gt;
肖特基二极管被动导通，不存在同步整流电路中上下管同时导通的情况，故其稳定性高于同步整流电路。&lt;/p&gt;
&lt;p&gt;缺点：效率低&lt;br&gt;
当流过肖特基二极管的电流较大时，续流电流在二极管上产生的电压较大（+-0.5V），&lt;br&gt;
当输出的电压很低时，二极管的电压降就占了很大的比重，它消耗的功率相对较大，所以在大电流，小电压输出时候效率偏低。&lt;/p&gt;
&lt;p&gt;常见型号内部电路图如下&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3dcdc/a06bf770349a62763cf72a1bab9bdd40.png&#34;
	width=&#34;466&#34;
	height=&#34;263&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;a06bf770349a62763cf72a1bab9bdd40.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;425px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;芯片常见引脚解释&#34;&gt;芯片常见引脚解释
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;VIN&lt;/strong&gt; 外部电压输入，DCDC将对其进行变压。&lt;br&gt;
&lt;strong&gt;SW&lt;/strong&gt; 开关引脚，DCDC通过控制内部mos管之类的器件，来输出一个具有特定动态占空比的PWM&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BST&lt;/strong&gt; 自举引脚 &lt;a class=&#34;link&#34; href=&#34;../../../../../undefined&#34; &gt;参考：三极管和MOS管&lt;/a&gt;&lt;br&gt;
双N-MOS芯片需要自举电容：&lt;br&gt;
下管源极接地，只需要很低的电压就可以让下管导通&lt;br&gt;
上管源极接SW引脚，在上管需要打开时， $V_{SW} = V_{IN}$, 因此我们需要 $\geq V_{IN}$ 的电压方可导通。&lt;br&gt;
我们需要一个电容来帮助上管的G极提高输出电压,这就是自举电容存在的意义。&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3dcdc/967ff496fa34e5d6dfca5177c59b759f.png&#34;
	width=&#34;410&#34;
	height=&#34;343&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;967ff496fa34e5d6dfca5177c59b759f.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;119&#34;
		data-flex-basis=&#34;286px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;PMOS+NMOS不需要自举电容&lt;br&gt;
&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3dcdc/1d808ac7ff7a41c34860d98b4e60ce13.png&#34;
	width=&#34;442&#34;
	height=&#34;386&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;1d808ac7ff7a41c34860d98b4e60ce13.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;114&#34;
		data-flex-basis=&#34;274px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;伏秒平衡和安秒平衡&#34;&gt;伏秒平衡和安秒平衡
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;伏秒定理&lt;/strong&gt;&lt;br&gt;
通常被用于分析开关电源的稳态工作过程，在一个开关周期内，电感上正向电压乘以时间的面积，必须等于负向电压乘以时间的面积&lt;br&gt;
$\large{V_{on} \cdot t_{on} = V_{off} \cdot t_{off}}$&lt;/p&gt;
&lt;p&gt;为什么成立？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;从能量角度看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;电感是无损储能元件，它不消耗能量，只暂存能量（存在磁场里）&lt;/li&gt;
&lt;li&gt;充电时：电源对电感做功，能量流入 $W = \frac{1}{2}Li^2$ 增加&lt;/li&gt;
&lt;li&gt;放电时：电感对负载做功，能量流出 $W$ 减少&lt;br&gt;
充进去的磁能必须 = 放出来的磁能 ————这就是&lt;strong&gt;伏秒平衡&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数学角度&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;电感方程：$V_L = L \frac{di_L}{dt}$
&lt;ul&gt;
&lt;li&gt;$V$ 电感两端的电压&lt;/li&gt;
&lt;li&gt;$L$ 电感量&lt;/li&gt;
&lt;li&gt;$\frac{di}{dt}$ 电流变化率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;变形为 $di_L = \frac{V_L}{L} dt$，其中 $di_L$ 表示电流的微分值&lt;/li&gt;
&lt;li&gt;$\int_0^T V_L , dt = L \cdot \left[ i_L(T) - i_L(0) \right]$ 其中 $i_L(T)$ 表示周期结束时的电流 $i_L(0)$ 表示周期开始时的电流&lt;/li&gt;
&lt;li&gt;由稳态的定义，我们得知 $i_L(T) = i_L(0)$&lt;/li&gt;
&lt;li&gt;我们得到 $\boxed{\int_0^T V_L , dt = 0}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rinchord.top/p/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3dcdc/3f12fe18293721541cdb4312b55a0866.png&#34;
	width=&#34;775&#34;
	height=&#34;400&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;3f12fe18293721541cdb4312b55a0866.png&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;193&#34;
		data-flex-basis=&#34;465px&#34;
	
&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     SW
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;V_in ──┬── L ──┬── V_out
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       │       │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       D       C
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       │       │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      GND    GND
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;引入上图简单BUCK电路，元件D为二极管，SW控制 $V_{in}$ 的通断&lt;/p&gt;
&lt;p&gt;阶段 ①：开关闭合（$t_{on} = D \cdot T$）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;电感左端接 $V_{in}$，右端是 $V_{out}$&lt;/li&gt;
&lt;li&gt;$V_L = V_{in} - V_{out}$  （&amp;gt; 0，上坡）&lt;/li&gt;
&lt;li&gt;电感电流线性上升&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;阶段 ②：开关断开（$t_{off} = (1-D) \cdot T$）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;二极管导通续流，电感左端被钳到 0V（GND），右端仍是 $V_{out}$&lt;/li&gt;
&lt;li&gt;$V_L = 0 - V_{out} = -V_{out}$  （&amp;lt; 0，下坡）&lt;/li&gt;
&lt;li&gt;电感电流线性下降&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$\underbrace{(V_{in} - V_{out})}&lt;em&gt;{\text{上坡坡度}} \cdot \underbrace{D \cdot T}&lt;/em&gt;{\text{上坡时间}} = \underbrace{V_{out}}&lt;em&gt;{\text{下坡坡度绝对值}} \cdot \underbrace{(1-D) \cdot T}&lt;/em&gt;{\text{下坡时间}}$   化简后，我们可以得到$V_{out} = D \cdot V_{in}$ 即变压比公式&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安秒平衡&lt;/strong&gt;&lt;br&gt;
安秒平衡（Ampere-Second Balance）就是电容版的“伏秒平衡”&lt;br&gt;
电容在稳态下需要满足“安秒平衡”（电荷不累积）&lt;br&gt;
// TODO&lt;/p&gt;
</description>
        </item>
        <item>
        <title>踏雪</title>
        <link>https://blog.rinchord.top/archives/</link>
        <pubDate>Sun, 06 Mar 2022 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/archives/</guid>
        <description></description>
        </item>
        <item>
        <title>寻觅</title>
        <link>https://blog.rinchord.top/search/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/search/</guid>
        <description></description>
        </item>
        <item>
        <title>友人</title>
        <link>https://blog.rinchord.top/%E5%8F%8B%E4%BA%BA/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/%E5%8F%8B%E4%BA%BA/</guid>
        <description>&lt;p&gt;喜欢大家哦~&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
