<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[柒零的驴舍]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://www.7-0.cc/</link><image><url>https://www.7-0.cc/favicon.png</url><title>柒零的驴舍</title><link>https://www.7-0.cc/</link></image><generator>Ghost 5.79</generator><lastBuildDate>Fri, 13 Mar 2026 19:07:40 GMT</lastBuildDate><atom:link href="https://www.7-0.cc/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[STM32 定时器]]></title><description><![CDATA[漆强老师的嵌入式系统设计 —— 读书笔记]]></description><link>https://www.7-0.cc/stm32-timer/</link><guid isPermaLink="false">69b4106db1f19d0001c3e14e</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Sun, 08 Feb 2026 14:02:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: STM32 &#x5B9A;&#x65F6;&#x5668;<br>
@@ Date: 2026-02-08 2202<br>
@@ From: &#x5D4C;&#x5165;&#x5F0F;&#x7CFB;&#x7EDF;&#x8BBE;&#x8BA1;<br>
@@ Note: ~</p>
<h2 id="%E6%A6%82%E5%BF%B5">&#x6982;&#x5FF5;</h2>
<p>&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x6838;&#x5FC3;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x8BA1;&#x6570;&#x5668;&#x6A21;&#x5757;&#xFF0C;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x52A0;&#x4E00;&#x6216;&#x51CF;&#x4E00;&#x8BA1;&#x6570;&#x3002;&#x6BCF;&#x51FA;&#x73B0;&#x4E00;&#x4E2A;&#x8BA1;&#x6570;&#x4FE1;&#x53F7;&#xFF0C;&#x8BA1;&#x6570;&#x5668;&#x7684;&#x503C;&#x5C31;&#x81EA;&#x52A8;&#x52A0;&#x4E00;&#x6216;&#x51CF;&#x4E00;&#x3002;&#x5F53;&#x8BA1;&#x6570;&#x503C;&#x4ECE;0&#x9012;&#x589E;&#x5230;&#x6700;&#x5927;&#x503C;&#x6216;&#x8005;&#x4ECE;&#x6700;&#x5927;&#x503C;&#x9012;&#x51CF;&#x5230;0&#x65F6;&#xFF0C;&#x5B9A;&#x65F6;&#x5668;&#x53EF;&#x4EE5;&#x5411;&#x5904;&#x7406;&#x5668;&#x53D1;&#x9001;&#x4E2D;&#x65AD;&#x8BF7;&#x6C42;&#x3002;</p>
<p>&#x8BA1;&#x6570;&#x4FE1;&#x53F7;&#x7684;&#x6765;&#x6E90;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x975E;&#x5468;&#x671F;&#x7684;&#x5916;&#x90E8;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#x6216;&#x8005;&#x5468;&#x671F;&#x6027;&#x7684;&#x5185;&#x90E8;&#x65F6;&#x949F;&#x4FE1;&#x53F7;&#xFF0C;&#x8FD9;&#x4E24;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x8BA1;&#x6570;&#x4FE1;&#x53F7;&#x51B3;&#x5B9A;&#x4E86;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x4E24;&#x79CD;&#x57FA;&#x672C;&#x5DE5;&#x4F5C;&#x6A21;&#x5F0F;&#xFF1A;<strong>&#x8BA1;&#x6570;&#x6A21;&#x5F0F;</strong>&#x548C;<strong>&#x5B9A;&#x65F6;&#x6A21;&#x5F0F;</strong>&#x3002;</p>
<p>&#x5728;&#x8861;&#x91CF;&#x4E00;&#x4E2A;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x57FA;&#x672C;&#x6027;&#x80FD;&#x65F6;&#xFF0C;&#x5E38;&#x5E38;&#x4F7F;&#x7528;&#x4F4D;&#x5BBD;&#x8FDB;&#x884C;&#x63CF;&#x8FF0;&#xFF0C;&#x6BD4;&#x5982;8&#x4F4D;&#x5B9A;&#x65F6;&#x5668;&#x6216;&#x8005;16&#x4F4D;&#x5B9A;&#x65F6;&#x5668;&#x3002;&#x8FD9;&#x91CC;&#x7684;&#x4F4D;&#x5BBD;&#x4EE3;&#x8868;&#x4E86;&#x5B9A;&#x65F6;&#x5668;&#x5185;&#x90E8;&#x7684;&#x8BA1;&#x6570;&#x5668;&#x7684;&#x4F4D;&#x6570;&#xFF0C;&#x5B83;&#x51B3;&#x5B9A;&#x4E86;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x6700;&#x5927;&#x8BA1;&#x6570;&#x8303;&#x56F4;&#x6216;&#x8005;&#x6700;&#x5927;&#x5B9A;&#x65F6;&#x65F6;&#x95F4;&#x3002;</p>
<ul>
<li><strong>&#x8BA1;&#x6570;&#x6A21;&#x5F0F;</strong><br>
&#x5BF9;&#x5F15;&#x811A;&#x8F93;&#x5165;&#x7684;&#x5916;&#x90E8;&#x8109;&#x51B2;&#x4FE1;&#x53F7;&#x8FDB;&#x884C;&#x8BA1;&#x6570;&#x3002;</li>
<li><strong>&#x5B9A;&#x65F6;&#x6A21;&#x5F0F;</strong><br>
&#x5BF9;&#x5904;&#x7406;&#x5668;&#x5185;&#x90E8;&#x7684;&#x5468;&#x671F;&#x6027;&#x65F6;&#x949F;&#x4FE1;&#x53F7;&#x8FDB;&#x884C;&#x8BA1;&#x6570;&#x3002;</li>
<li><strong>&#x5B9A;&#x65F6;&#x65F6;&#x949F;</strong><br>
&#x5728;&#x5B9A;&#x65F6;&#x6A21;&#x5F0F;&#x4E0B;&#xFF0C;&#x8F93;&#x5165;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x5468;&#x671F;&#x6027;&#x65F6;&#x949F;&#x4FE1;&#x53F7;&#x79F0;&#x4E3A;&#x5B9A;&#x65F6;&#x65F6;&#x949F;&#x3002;</li>
<li><strong>&#x8BA1;&#x6570;&#x65F6;&#x95F4;</strong><br>
&#x5728;&#x5B9A;&#x65F6;&#x6A21;&#x5F0F;&#x4E0B;&#xFF0C;&#x5B9A;&#x65F6;&#x5668;&#x5185;&#x90E8;&#x7684;&#x8BA1;&#x6570;&#x5355;&#x5143;&#x8BB0;&#x4E00;&#x6B21;&#x6570;&#x6240;&#x82B1;&#x8D39;&#x7684;&#x65F6;&#x95F4;&#x79F0;&#x4E3A;&#x8BA1;&#x6570;&#x65F6;&#x95F4;(&#x6216;&#x8005;&#x8BF4;<strong>&#x4E24;&#x6B21;&#x8BA1;&#x6570;&#x7684;&#x65F6;&#x95F4;&#x95F4;&#x9694;</strong>)&#xFF0C;<strong>&#x8BE5;&#x503C;&#x4E3A;&#x5B9A;&#x65F6;&#x65F6;&#x949F;&#x9891;&#x7387;&#x7684;&#x5012;&#x6570;</strong>&#x3002;</li>
</ul>
<p>&#x6839;&#x636E;&#x5B9A;&#x65F6;&#x65F6;&#x949F;&#x548C;&#x8BA1;&#x6570;&#x65F6;&#x95F4;&#x7684;&#x5B9A;&#x4E49;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5F97;&#x5230;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x5B9A;&#x65F6;&#x65F6;&#x95F4;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#xFF1A;</p>
<ul>
<li><strong>&#x5B9A;&#x65F6;&#x65F6;&#x95F4;</strong> = <strong>&#x8BA1;&#x6570;&#x503C;</strong> &#xD7; <strong>&#x8BA1;&#x6570;&#x65F6;&#x95F4;</strong></li>
<li><strong>&#x5B9A;&#x65F6;&#x65F6;&#x95F4;</strong> = <strong>&#x8BA1;&#x6570;&#x503C;</strong> / <strong>&#x5B9A;&#x65F6;&#x65F6;&#x949F;&#x9891;&#x7387;</strong></li>
</ul>
<p>&#x4F8B;&#x5982;&#xFF0C;&#x5F53;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x5B9A;&#x65F6;&#x65F6;&#x949F;&#x4E3A;1MHz&#x65F6;&#xFF0C;&#x8BA1;&#x6570;&#x65F6;&#x95F4;&#x4E3A;1s&#x3002;&#x6B64;&#x65F6;&#xFF0C;16&#x4F4D;&#x8BA1;&#x6570;&#x5668;&#x7684;&#x6700;&#x5927;&#x5B9A;&#x65F6;&#x65F6;&#x95F4;&#x4E3A;<code>65536&#x3BC;s</code>,&#x5373;<code>65.536ms</code>&#x3002;</p>
<p><img src="https://image.7-0.cc/images/2026/02/08/STM32-TIMER.png" alt="STM32-TIMER.png" loading="lazy"></p>
<h2 id="stm32-%E5%AE%9A%E6%97%B6%E5%99%A8%E4%BB%8B%E7%BB%8D">STM32 &#x5B9A;&#x65F6;&#x5668;&#x4ECB;&#x7ECD;</h2>
<p>STM32&#x7684;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x529F;&#x80FD;&#x5F3A;&#x5927;&#xFF0C;&#x79CD;&#x7C7B;&#x4E5F;&#x6BD4;&#x8F83;&#x591A;&#x3002;&#x6309;&#x7167;&#x5B9A;&#x65F6;&#x5668;&#x5728;&#x5FAE;&#x63A7;&#x5236;&#x5668;&#x5185;&#x90E8;&#x7684;&#x4F4D;&#x7F6E;&#x53EF;&#x4EE5;&#x5212;&#x5206;&#x4E3A;<strong>&#x5185;&#x6838;&#x5B9A;&#x65F6;&#x5668;</strong>&#x548C;<strong>&#x5916;&#x8BBE;&#x5B9A;&#x65F6;&#x5668;</strong>&#x4E24;&#x5927;&#x7C7B;&#x3002;</p>
<p>&#x5176;&#x4E2D;&#xFF0C;&#x5916;&#x8BBE;&#x5B9A;&#x65F6;&#x5668;&#x6309;&#x7167;&#x529F;&#x80FD;&#x53C8;&#x53EF;&#x4EE5;&#x5212;&#x5206;&#x4E3A;&#x4E13;&#x7528;&#x5B9A;&#x65F6;&#x5668;&#x548C;&#x5E38;&#x89C4;&#x5B9A;&#x65F6;&#x5668;&#x3002;&#x5177;&#x4F53;&#x7684;&#x5206;&#x7C7B;&#x5982;<strong>&#x56FE;8-1</strong>&#x6240;&#x793A;&#x3002;</p>
<p>&#x5728;&#x4F17;&#x591A;&#x7684;&#x5B9A;&#x65F6;&#x5668;&#x4E2D;&#xFF0C;&#x5E38;&#x89C4;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x7528;&#x9014;&#x6700;&#x4E3A;&#x5E7F;&#x6CDB;&#x3002;&#x6309;&#x7167;&#x529F;&#x80FD;&#x7684;&#x4E0D;&#x540C;&#xFF0C;&#x53EF;&#x4EE5;&#x628A;&#x5E38;&#x89C4;&#x5B9A;&#x65F6;<br>
&#x5668;&#x5206;&#x4E3A;&#x57FA;&#x672C;&#x5B9A;&#x65F6;&#x5668;&#x3001;&#x901A;&#x7528;&#x5B9A;&#x65F6;&#x5668;&#x548C;&#x9AD8;&#x7EA7;&#x5B9A;&#x65F6;&#x5668;&#x4E09;&#x7C7B;&#xFF1A;</p>
<ul>
<li><strong>&#x57FA;&#x672C;&#x5B9A;&#x65F6;&#x5668;</strong><br>
&#x513F;&#x4E4E;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x5BF9;&#x5916;&#x7684;&#x8F93;&#x5165;/&#x8F93;&#x51FA;&#x901A;&#x9053;&#xFF0C;&#x5E38;&#x7528;&#x4F5C;&#x65F6;&#x95F4;&#x57FA;&#x51C6;&#xFF08;&#x65F6;&#x57FA;&#xFF09;&#xFF0C;&#x5B9E;&#x73B0;&#x57FA;&#x672C;&#x7684;&#x5B9A;&#x65F6;&#x529F;&#x80FD;&#x3002;</li>
<li><strong>&#x901A;&#x7528;&#x5B9A;&#x65F6;&#x5668;</strong><br>
&#x5177;&#x5907;&#x591A;&#x8DEF;&#x72EC;&#x7ACB;&#x7684;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#xFF0C;&#x53EF;&#x4EE5;&#x5B8C;&#x6210;&#x5B9A;&#x65F6;/&#x8BA1;&#x6570;&#x3001;&#x8F93;&#x5165;&#x6355;&#x83B7;&#x3001;&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x7B49;&#x529F;&#x80FD;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x8FDE;&#x63A5;&#x5176;&#x4ED6;&#x7684;&#x4F20;&#x611F;&#x5668;&#x63A5;&#x53E3;&#xFF0C;&#x5982;&#x7F16;&#x7801;&#x5668;&#x548C;&#x970D;&#x5C14;&#x4F20;&#x611F;&#x5668;&#x3002;</li>
<li><strong>&#x9AD8;&#x7EA7;&#x5B9A;&#x65F6;&#x5668;</strong><br>
&#x9AD8;&#x7EA7;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x529F;&#x80FD;&#x6700;&#x4E3A;&#x5F3A;&#x5927;&#xFF0C;&#x9664;&#x4E86;&#x5177;&#x5907;&#x901A;&#x7528;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x529F;&#x80FD;&#x5916;&#xFF0C;&#x8FD8;&#x589E;&#x52A0;&#x4E86;&#x91CD;&#x590D;&#x8BA1;&#x6570;&#x5668;&#x5E26;&#x6B7B;&#x533A;&#x63A7;&#x5236;&#x7684;&#x4E92;&#x8865;&#x4FE1;&#x53F7;&#x8F93;&#x51FA;&#x7B49;&#x529F;&#x80FD;&#xFF0C;&#x53EF;&#x7528;&#x4E8E;&#x7535;&#x673A;&#x63A7;&#x5236;&#x7B49;&#x9886;&#x57DF;&#x3002;</li>
</ul>
<p>&#x4EE5;STM32F411&#x82AF;&#x7247;&#x4E3A;&#x4F8B;&#xFF0C;&#x7247;&#x5185;&#x96C6;&#x6210;&#x4E86;8&#x4E2A;&#x5B9A;&#x65F6;&#x5668;&#xFF1A;</p>
<p><img src="https://image.7-0.cc/images/2026/02/08/STM32-TIMER-2.png" alt="STM32-TIMER-2.png" loading="lazy"></p>
<p>&#x6CE8;&#x610F;&#xFF1A;STM32&#x5FAE;&#x63A7;&#x5236;&#x5668;&#x7684;&#x5404;&#x4E2A;&#x5B9A;&#x65F6;&#x5668;&#x90FD;&#x662F;&#x5B8C;&#x5168;&#x72EC;&#x7ACB;&#x7684;&#xFF0C;&#x6240;&#x62E5;&#x6709;&#x7684;&#x786C;&#x4EF6;&#x8D44;&#x6E90;&#x5F7C;&#x6B64;&#x72EC;&#x7ACB;&#xFF0C;<br>
&#x4E92;&#x4E0D;&#x5E72;&#x6270;</p>
<p>&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x5B9A;&#x65F6;&#x65F6;&#x949F;&#x4E0E;&#x5B9A;&#x65F6;&#x5668;&#x6240;&#x6302;&#x63A5;&#x7684;&#x5916;&#x8BBE;&#x603B;&#x7EBF;&#x65F6;&#x949F;APB&#x76F8;&#x5173;&#xFF0C;&#x5916;&#x8BBE;&#x603B;&#x7EBF;&#x7684;&#x65F6;&#x949F;&#x914D;&#x7F6E;&#x5982;<strong>&#x56FE;8-2</strong>&#x6240;&#x793A;&#x3002;</p>
<p>&#x65E0;&#x8BBA;&#x54EA;&#x4E00;&#x79CD;&#x5B9A;&#x65F6;&#x5668;&#xFF0C;&#x6700;&#x57FA;&#x672C;&#x7684;&#x529F;&#x80FD;&#x90FD;&#x662F;&#x5B9A;&#x65F6;&#x548C;&#x8BA1;&#x6570;&#xFF0C;&#x5728;&#x8FD9;&#x4E24;&#x4E2A;&#x529F;&#x80FD;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x53C8;&#x884D;&#x751F;&#x51FA;&#x5176;&#x4ED6;&#x7684;&#x529F;&#x80FD;&#x3002;&#x5728;&#x5B9E;&#x9645;&#x7684;&#x5DE5;&#x7A0B;&#x5E94;&#x7528;&#x4E2D;&#xFF0C;&#x6700;&#x5E38;&#x7528;&#x7684;&#x5B9A;&#x65F6;&#x5668;&#x529F;&#x80FD;&#x6709;&#x4EE5;&#x4E0B;&#x4E09;&#x79CD;&#xFF1A;</p>
<ul>
<li>&#x5B9A;&#x65F6;/&#x8BA1;&#x6570;&#x529F;&#x80FD;&#xFF1A;&#x7528;&#x4E8E;&#x4EA7;&#x751F;&#x65F6;&#x95F4;&#x57FA;&#x51C6;&#x4EE5;&#x53CA;&#x6D4B;&#x91CF;&#x5916;&#x90E8;&#x8109;&#x51B2;&#x7684;&#x4E2A;&#x6570;&#x3002;</li>
<li>&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x529F;&#x80FD;&#xFF1A;&#x5305;&#x62EC;PWM&#x8F93;&#x51FA;&#x3001;&#x7535;&#x5E73;&#x7FFB;&#x8F6C;&#x3001;&#x5355;&#x8109;&#x51B2;&#x8F93;&#x51FA;&#x4EE5;&#x53CA;&#x5F3A;&#x5236;&#x8F93;&#x51FA;&#x7B49;&#x529F;&#x80FD;&#x3002;</li>
<li>&#x8F93;&#x5165;&#x6355;&#x83B7;&#x529F;&#x80FD;&#xFF1A;&#x7528;&#x4E8E;&#x6D4B;&#x91CF;&#x8F93;&#x4EBA;&#x4FE1;&#x53F7;&#x7684;&#x8109;&#x51B2;&#x5BBD;&#x5EA6;&#x3002;</li>
</ul>
<h2 id="%E6%97%B6%E9%92%9F%E6%BA%90">&#x65F6;&#x949F;&#x6E90;</h2>
<p>&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x4E24;&#x79CD;&#x5DE5;&#x4F5C;&#x6A21;&#x5F0F;&#x7684;&#x533A;&#x522B;&#x4E3B;&#x8981;&#x5728;&#x4E8E;&#x65F6;&#x949F;&#x6E90;&#x7684;&#x9009;&#x62E9;&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E;&#x76F8;&#x5173;&#x7684;&#x5BC4;&#x5B58;&#x5668;&#xFF0C;&#x9009;&#x62E9;&#x5BF9;&#x5E94;&#x7684;&#x65F6;&#x949F;&#x6E90;&#x540E;&#xFF0C;&#x8BE5;&#x65F6;&#x949F;&#x6E90;&#x5C06;&#x4F5C;&#x4E3A;&#x65F6;&#x57FA;&#x5355;&#x5143;&#x7684;&#x9884;&#x5206;&#x9891;&#x65F6;&#x949F;<code>CK_PSC</code>&#x9001;&#x5165;&#x65F6;&#x57FA;&#x5355;&#x5143;&#x3002;</p>
<p>&#x65F6;&#x949F;&#x6E90;&#x4E00;&#x5171;&#x6709;&#x56DB;&#x79CD;&#x9009;&#x62E9;&#xFF1A;</p>
<h3 id="1%E5%86%85%E9%83%A8%E6%97%B6%E9%92%9Fckint">1.&#x5185;&#x90E8;&#x65F6;&#x949F;(CK_INT)</h3>
<p>&#x5185;&#x90E8;&#x65F6;&#x949F;<code>CK_INT</code>&#x6765;&#x81EA;&#x5916;&#x8BBE;&#x603B;&#x7EBF;<code>APB1</code>&#x6216;<code>APB2</code>&#x63D0;&#x4F9B;&#x7684;&#x5B9A;&#x65F6;&#x65F6;&#x949F;<code>TIMx_CLK</code>&#xFF0C;&#x5982;<code>&#x56FE;8-2</code>&#x6240;&#x793A;&#x7684; APBx Timer Clocks&#x3002;</p>
<p>&#x4F7F;&#x7528;&#x5185;&#x90E8;&#x65F6;&#x949F;&#x4F5C;&#x4E3A;&#x65F6;&#x949F;&#x6E90;&#x65F6;&#xFF0C;&#x5B9A;&#x65F6;&#x5668;&#x5DE5;&#x4F5C;&#x4E8E;&#x5B9A;&#x65F6;&#x6A21;&#x5F0F;&#xFF0C;&#x5E76;&#x884D;&#x751F;&#x51FA;&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x548C;&#x8F93;&#x5165;&#x6355;&#x83B7;&#x7B49;&#x529F;&#x80FD;&#x3002;</p>
<h3 id="2%E5%A4%96%E9%83%A8%E6%97%B6%E9%92%9F%E6%A8%A1%E5%BC%8F1%EF%BC%9A%E5%A4%96%E9%83%A8%E8%BE%93%E5%85%A5%E5%BC%95%E8%84%9Atixx%E8%A1%A8%E7%A4%BA%E5%BC%95%E8%84%9A%E7%BC%96%E5%8F%B714%EF%BC%8C%E4%B8%8B%E5%90%8C">2.&#x5916;&#x90E8;&#x65F6;&#x949F;&#x6A21;&#x5F0F;1&#xFF1A;&#x5916;&#x90E8;&#x8F93;&#x5165;&#x5F15;&#x811A;TIx(x&#x8868;&#x793A;&#x5F15;&#x811A;&#x7F16;&#x53F7;1~4&#xFF0C;&#x4E0B;&#x540C;)</h3>
<p><code>TIx</code> (Timer Input), &#x65F6;&#x949F;&#x4FE1;&#x53F7;&#x6765;&#x81EA;&#x5916;&#x90E8;&#x8F93;&#x5165;&#x5F15;&#x811A;<code>TIx</code>&#xFF0C;&#x5B9A;&#x65F6;&#x5668;&#x53EF;&#x4EE5;&#x5728;&#x65F6;&#x949F;&#x4FE1;&#x53F7;&#x7684;&#x6BCF;&#x4E2A;&#x4E0A;&#x5347;&#x6CBF;&#x6216;&#x4E0B;&#x964D;&#x6CBF;&#x8BA1;&#x6570;&#x3002;</p>
<p><strong>&#x6CE8;&#x610F;&#xFF1A;</strong></p>
<ul>
<li>&#x5F53;&#x4F7F;&#x7528;&#x5916;&#x90E8;&#x65F6;&#x949F;&#x6A21;&#x5F0F;1&#x65F6;&#xFF0C;&#x65F6;&#x949F;&#x4FE1;&#x53F7;&#x5B9E;&#x9645;&#x4E0A;&#x662F;&#x7531;&#x5B9A;&#x65F6;&#x5668;&#x7684;<strong>&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;</strong>&#x6240;&#x5BF9;&#x5E94;&#x7684;&#x5F15;&#x811A;<code>TIMx_CHn</code>(n&#x8868;&#x793A;&#x901A;&#x9053;&#x7F16;&#x53F7;1~4&#xFF0C;&#x4E0B;&#x540C;)&#x8F93;&#x4EBA;&#x3002;</li>
<li><code>TIMx_CHn</code> &#x662F;&#x7269;&#x7406;&#x5F15;&#x811A;&#xFF0C;&#x800C; <code>TIx</code> &#x662F;&#x5185;&#x90E8;&#x8DEF;&#x7EBF;&#x3002;</li>
</ul>
<h3 id="3%E5%A4%96%E9%83%A8%E6%97%B6%E9%92%9F%E6%A8%A1%E5%BC%8F2%EF%BC%9A%E5%A4%96%E9%83%A8%E8%A7%A6%E5%8F%91%E8%BE%93%E5%85%A5etr">3.&#x5916;&#x90E8;&#x65F6;&#x949F;&#x6A21;&#x5F0F;2&#xFF1A;&#x5916;&#x90E8;&#x89E6;&#x53D1;&#x8F93;&#x5165;ETR</h3>
<p><code>ETR</code> (<strong>E</strong>xternal <strong>Tr</strong>igger Input), &#x65F6;&#x949F;&#x4FE1;&#x53F7;&#x6765;&#x81EA;&#x5916;&#x90E8;&#x89E6;&#x53D1;&#x8F93;&#x5165;&#x5F15;&#x811A;<code>TIMx_ETR</code>&#x3002;&#x5B9A;&#x65F6;&#x5668;&#x53EF;&#x4EE5;&#x5728;&#x65F6;&#x949F;&#x4FE1;&#x53F7;&#x7684;&#x6BCF;&#x4E2A;&#x4E0A;&#x5347;&#x6CBF;&#x6216;&#x4E0B;&#x964D;&#x6CBF;&#x8BA1;&#x6570;</p>
<h3 id="4%E5%86%85%E9%83%A8%E8%A7%A6%E5%8F%91%E8%BE%93%E5%85%A5-itrx">4.&#x5185;&#x90E8;&#x89E6;&#x53D1;&#x8F93;&#x5165; ITRx</h3>
<p><code>ITRx</code> (Internal Trigger Input), &#x65F6;&#x949F;&#x4FE1;&#x53F7;&#x6765;&#x81EA;&#x82AF;&#x7247;&#x5185;&#x90E8;&#x5176;&#x4ED6;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x89E6;&#x53D1;&#x8F93;&#x51FA;&#xFF0C;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x540C;&#x6B65;&#x6216;&#x7EA7;&#x8054;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x5B9A;&#x65F6;&#x5668;&#x4F5C;&#x4E3A;&#x53E6;&#x4E00;&#x4E2A;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x9884;&#x5206;&#x9891;&#x5668;</p>
<h2 id="%E6%97%B6%E5%9F%BA%E5%8D%95%E5%85%83">&#x65F6;&#x57FA;&#x5355;&#x5143;</h2>
<p>&#x65F6;&#x57FA;&#x5355;&#x5143;&#x662F;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x6838;&#x5FC3;&#x63A7;&#x5236;&#x5355;&#x5143;&#xFF0C;&#x8D1F;&#x8D23;&#x65F6;&#x949F;&#x6E90;&#x7684;&#x5206;&#x9891;&#x3001;&#x8BA1;&#x6570;&#x548C;&#x6EA2;&#x51FA;&#x91CD;&#x8F7D;&#x7B49;&#x57FA;&#x672C;&#x529F;&#x80FD;&#x3002;&#x5B83;&#x4E3B;&#x8981;&#x7531;&#x4E09;&#x4E2A;&#x6A21;&#x5757;&#x7EC4;&#x6210;&#xFF1A;&#x9884;&#x5206;&#x9891;&#x6A21;&#x5757;&#x3001;&#x8BA1;&#x6570;&#x6A21;&#x5757;&#x548C;&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x6A21;&#x5757;&#x3002;</p>
<p>&#x65F6;&#x57FA;&#x5355;&#x5143;&#x7684;&#x529F;&#x80FD;&#x6846; <strong>&#x5982;&#x56FE;8-4&#x6240;&#x793A;</strong>&#x3002;</p>
<p><img src="https://image.7-0.cc/images/2026/02/09/STM32-TIMER-3.png" alt="STM32-TIMER-3.png" loading="lazy"></p>
<p>&#x9884;&#x5206;&#x9891;&#x65F6;&#x949F;<code>CK_PSC</code>&#x662F;&#x7ECF;&#x8FC7;&#x65F6;&#x949F;&#x6E90;&#x9009;&#x62E9;&#x540E;&#x8F93;&#x51FA;&#x7684;&#x65F6;&#x949F;&#x4FE1;&#x53F7;&#x3002;<strong>&#x5982;&#x679C;&#x4F7F;&#x7528;&#x5185;&#x90E8;&#x65F6;&#x949F;<code>CK_INT</code>&#x4F5C;&#x4E3A;&#x65F6;&#x949F;&#x6E90;&#xFF0C;<code>CK_PSC</code>&#x7684;&#x9891;&#x7387;&#x7B49;&#x4E8E;&#x5B9A;&#x65F6;&#x65F6;&#x949F;<code>TIMx_CLK</code>&#x7684;&#x9891;&#x7387;</strong>&#x3002;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x5916;&#x90E8;&#x65F6;&#x949F;&#x6216;&#x8005;&#x5185;&#x90E8;&#x89E6;&#x53D1;&#x4FE1;&#x53F7;&#x4F5C;&#x4E3A;&#x65F6;&#x949F;&#x6E90;&#xFF0C;<code>CK_PSC</code>&#x7684;&#x9891;&#x7387;&#x7531;&#x5916;&#x90E8;&#x5F15;&#x811A;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#x6216;&#x8005;&#x5185;&#x90E8;&#x89E6;&#x53D1;&#x4FE1;&#x53F7;&#x7684;&#x9891;&#x7387;&#x51B3;&#x5B9A;&#x3002;</p>
<p><code>CK_CNT</code>&#x662F;&#x7ECF;&#x8FC7;&#x9884;&#x5206;&#x9891;&#x6A21;&#x5757;&#x540E;&#xFF0C;&#x9001;&#x5165;&#x8BA1;&#x6570;&#x6A21;&#x5757;&#x7684;&#x65F6;&#x949F;&#xFF0C;&#x8FD9;&#x91CC;&#x79F0;&#x4E3A;<strong>&#x8BA1;&#x6570;&#x65F6;&#x949F;</strong></p>
<h3 id="%E9%A2%84%E5%88%86%E9%A2%91%E6%A8%A1%E5%9D%97">&#x9884;&#x5206;&#x9891;&#x6A21;&#x5757;</h3>
<p>&#x9884;&#x5206;&#x9891;&#x6A21;&#x5757;&#x7531;<strong>&#x9884;&#x5206;&#x9891;&#x8BA1;&#x6570;&#x5668;</strong>&#x548C;<strong>&#x9884;&#x5206;&#x9891;&#x5BC4;&#x5B58;&#x5668;</strong><code>TIMx_PSC</code>&#x7EC4;&#x6210;&#xFF1A;&#x9884;&#x5206;&#x9891;&#x8BA1;&#x6570;&#x5668;&#x901A;&#x8FC7;&#x8BA1;&#x6570;&#x7684;&#x65B9;&#x5F0F;&#x5BF9;&#x9884;&#x5206;&#x9891;&#x65F6;&#x949F;<code>CK_PSC</code>&#x8FDB;&#x884C;&#x5206;&#x9891;&#xFF0C;&#x800C;&#x9884;&#x5206;&#x9891;&#x5BC4;&#x5B58;&#x5668;&#x7528;&#x4E8E;&#x5B58;&#x653E;<strong>&#x9884;&#x5206;&#x9891;&#x7CFB;&#x6570;PSC</strong>&#x3002;</p>
<p>&#x9884;&#x5206;&#x9891;&#x4E3B;&#x8981;&#x7528;&#x4E8E;&#x5C06; <code>CK_PSC</code> &#x65F6;&#x949F;&#x9891;&#x7387;&#x8FDB;&#x884C;&#x9884;&#x5904;&#x7406;&#xFF0C;&#x4F7F;&#x5F97;&#x53EF;&#x4EE5;&#x5728; 16 &#x4F4D;&#x5B9A;&#x65F6;&#x5668;&#x4E0A;&#x5904;&#x7406;&#x66F4;&#x957F;&#x65F6;&#x95F4;&#x7684;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#xFF08;&#x6BD4;&#x5982; 100MHz &#x9891;&#x7387;&#x4E0A;&#x5904;&#x7406; 65.536ms &#x4EE5;&#x4E0A;&#x65F6;&#x957F;&#xFF09;&#x3002;&#x53E6;&#x5916;&#x4E00;&#x65B9;&#x9762;&#x53EF;&#x4EE5;&#x5C06;&#x9891;&#x7387;&#x8F6C;&#x6362;&#x4E3A;&#x66F4;&#x5BB9;&#x6613;&#x5904;&#x7406;&#x7684;&#x65F6;&#x957F;&#x5355;&#x4F4D;&#xFF0C;&#x6BD4;&#x5982;&#x95F4;&#x9694;&#x65F6;&#x957F;&#x4E3A; <code>1us</code>&#x3002;</p>
<p>&#x4ECE;&#x56FE;8-5&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF1A;&#x5F53;&#x9884;&#x5206;&#x9891;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x5185;&#x5BB9;&#x4E3A;3&#x65F6;&#xFF0C;&#x9884;&#x5206;&#x9891;&#x8BA1;&#x6570;&#x5668;&#x4ECE;0&#x5F00;&#x59CB;&#x8BA1;&#x6570;&#xFF0C;<strong>&#x4E14;&#x8BA1;&#x6570;&#x503C;0&#x4F1A;&#x4FDD;&#x6301;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x8BA1;&#x6570;&#x8109;&#x51B2;</strong>&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x5B9E;&#x9645;&#x7684;&#x8BA1;&#x6570;&#x8109;&#x51B2;&#x4E2A;&#x6570;&#x4E3A;4&#xFF0C;&#x5373;&#x6700;&#x7EC8;&#x7684;&#x9884;&#x5206;&#x9891;&#x7CFB;&#x6570;&#x4E3A;&#xFF1A;<code>PSC+1</code>&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x8981;&#x5BF9;&#x5185;&#x90E8;&#x65F6;&#x949F;&#x8FDB;&#x884C;72&#x5206;&#x9891;&#xFF0C;&#x5219;&#x9884;&#x5206;&#x9891;&#x7CFB;&#x6570;<code>PSC</code>&#x5E94;&#x8BBE;&#x7F6E;&#x4E3A;71&#x3002;</p>
<p>&#x9884;&#x5206;&#x9891;&#x65F6;&#x949F;<code>CK_PSC</code>&#x7ECF;&#x8FC7;&#x9884;&#x5206;&#x9891;&#x6A21;&#x5757;&#x540E;&#xFF0C;&#x5F97;&#x5230;&#x8BA1;&#x6570;&#x65F6;&#x949F;<code>CK_CNT</code>,&#x5B83;&#x7684;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#x5982;&#x4E0B;&#xFF1A;</p>
<p>$$<br>
CK\_CNT=CK\_PSC / (PSC+1)<br>
$$</p>
<h3 id="%E8%AE%A1%E6%95%B0%E6%A8%A1%E5%9D%97">&#x8BA1;&#x6570;&#x6A21;&#x5757;</h3>
<p>&#x8BA1;&#x6570;&#x6A21;&#x5757;&#x7531;&#x6838;&#x5FC3;&#x8BA1;&#x6570;&#x5668;&#x548C;&#x8BA1;&#x6570;&#x5668;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_CNT</code>&#x7EC4;&#x6210;&#xFF1A;&#x6838;&#x5FC3;&#x8BA1;&#x6570;&#x5668;&#x7528;&#x6765;&#x5BF9;&#x9884;&#x5206;&#x9891;&#x6A21;&#x5757;&#x8F93;&#x51FA;&#x7684;&#x8BA1;&#x6570;&#x65F6;&#x949F;<code>CK_CNT</code>&#x8FDB;&#x884C;&#x4E8C;&#x6B21;&#x8BA1;&#x6570;&#x3002;&#x8BA1;&#x6570;&#x65F6;&#x949F;<code>CK_CNT</code>&#x6BCF;&#x8F93;&#x4EBA;&#x4E00;&#x4E2A;&#x8109;&#x51B2;&#xFF0C;&#x6838;&#x5FC3;&#x8BA1;&#x6570;&#x5668;&#x7684;&#x8BA1;&#x6570;&#x503C;&#x5C31;&#x81EA;&#x52A8;&#x52A0;&#x4E00;&#x6216;&#x51CF;&#x4E00;&#xFF08;&#x6839;&#x636E;&#x7528;&#x6237;&#x8BBE;&#x7F6E;&#x7684;&#x4E0D;&#x540C;&#x8BA1;&#x6570;&#x6A21;&#x5F0F;&#x6765;&#x51B3;&#x5B9A;&#x662F;&#x52A0;&#x4E00;&#x8FD8;&#x662F;&#x51CF;&#x4E00;&#xFF09;&#x3002;&#x8BA1;&#x6570;&#x5668;&#x5BC4;&#x5B58;&#x5668;&#x5219;&#x7528;&#x6765;&#x5B58;&#x653E;&#x6838;&#x5FC3;&#x8BA1;&#x6570;&#x5668;&#x8FD0;&#x884C;&#x65F6;&#x7684;&#x8BA1;&#x6570;&#x503C;&#xFF0C;&#x4FBF;&#x4E8E;&#x7528;&#x6237;&#x8BFB;&#x53D6;&#x3002;</p>
<h3 id="%E8%87%AA%E5%8A%A8%E9%87%8D%E8%BD%BD%E6%A8%A1%E5%9D%97">&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x6A21;&#x5757;</h3>
<p>&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x6A21;&#x5757;&#x7531;&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_ARR</code>&#x6784;&#x6210;&#xFF0C;<strong>&#x7528;&#x6765;&#x8BBE;&#x7F6E;&#x8BA1;&#x6570;&#x5668;&#x7684;&#x8BA1;&#x6570;&#x7EC8;&#x503C;&#x6216;&#x8BA1;&#x6570;&#x521D;&#x503C;</strong>&#xFF0C;&#x51B3;&#x5B9A;&#x8BA1;&#x6570;&#x8109;&#x51B2;&#x7684;&#x591A;&#x5C11;&#xFF08;&#x8BA1;&#x6570;&#x6A21;&#x5F0F;&#xFF09;&#x6216;&#x5B9A;&#x65F6;&#x5468;&#x671F;&#xFF08;&#x5B9A;&#x65F6;&#x6A21;&#x5F0F;&#xFF09;&#x7684;&#x957F;&#x77ED;&#x6211;&#x4EEC;&#x5C06;&#xB7;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x5185;&#x5BB9;&#x8BB0;&#x4E3A;&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x503C;ARR&#x3002;</p>
<h3 id="%E8%AE%A1%E6%95%B0%E6%A8%A1%E5%BC%8F">&#x8BA1;&#x6570;&#x6A21;&#x5F0F;</h3>
<p>&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x8BA1;&#x6570;&#x6A21;&#x5757;&#x652F;&#x7279;&#x4E09;&#x79CD;&#x8BA1;&#x6570;&#x6A21;&#x5F0F;&#xFF1A;<strong>&#x9012;&#x589E;&#x8BA1;&#x6570;</strong>&#x3001;<strong>&#x9012;&#x51CF;&#x8BA1;&#x6570;</strong>&#x548C;<strong>&#x4E2D;&#x5FC3;&#x5BF9;&#x9F50;&#x8BA1;&#x6570;</strong>&#xFF0C;<strong>&#x5E76;&#x4EA7;&#x751F;&#x6EA2;&#x51FA;&#x4E8B;&#x4EF6;&#xFF0C;&#x4F5C;&#x4E3A;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x66F4;&#x65B0;&#x4E2D;&#x65AD;&#xFF08;&#x5B9A;&#x65F6;&#x4E2D;&#x65AD;&#xFF09;</strong>&#x3002;</p>
<p>&#x4E09;&#x79CD;&#x6A21;&#x5F0F;&#x7684;&#x4E3B;&#x8981;&#x533A;&#x522B;&#x5728;&#x4E8E;&#xFF1A;&#x9012;&#x589E;&#x65F6;&#x8BA1;&#x6570;&#x5668;&#x4ECE;<strong>0&#x5230;ARR&#x540E;&#x4EA7;&#x751F;&#x4E0A;&#x6EA2;&#x4E8B;&#x4EF6;</strong>&#xFF0C;&#x9012;&#x51CF;&#x65F6;&#x8BA1;&#x6570;&#x5668;&#x51B2;<strong>ARR&#x5230;0&#x540E;&#x4EA7;&#x751F;&#x4E0B;&#x6EA2;&#x4E8B;&#x4EF6;</strong>&#xFF0C;&#x4E2D;&#x5FC3;&#x5BF9;&#x9F50;&#x6A21;&#x5F0F;&#x5148;&#x4ECE;0&#x5230;<code>ARR-1</code>&#x540E;&#x4EA7;&#x751F;<strong>&#x4E0A;&#x6EA2;&#x4E8B;&#x4EF6;</strong>&#xFF0C;&#x518D;&#x9012;&#x51CF;&#x5230; 1 &#x4EA7;&#x751F;<strong>&#x4E0B;&#x6EA2;&#x4E8B;&#x4EF6;</strong>&#x3002;</p>
<h3 id="%E5%AE%9A%E6%97%B6%E6%97%B6%E9%97%B4%E8%AE%A1%E7%AE%97%E5%85%AC%E5%BC%8F">&#x5B9A;&#x65F6;&#x65F6;&#x95F4;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;</h3>
<p>&#x5F53;&#x5B9A;&#x65F6;&#x5668;&#x5DE5;&#x4F5C;&#x4E8E;&#x5B9A;&#x65F6;&#x6A21;&#x5F0F;&#x65F6;&#xFF0C;&#x9884;&#x5206;&#x9891;&#x65F6;&#x949F;<code>CK_PSC</code>&#x7B49;&#x4E8E;&#x5B9A;&#x65F6;&#x65F6;&#x949F;<code>TIMx_CLK</code>&#x3002;&#x5B9A;&#x65F6;&#x65F6;&#x95F4;&#x7531;<code>TIMx_CLK</code>&#x7684;&#x9891;&#x7387;&#x3001;&#x9884;&#x5206;&#x9891;&#x7CFB;&#x6570;<code>PSC</code>&#x548C;&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x503C;ARR&#x4E09;&#x8005;&#x51B3;&#x5B9A;&#x3002;</p>
<p>&#x5047;&#x8BBE;<code>PSC=1</code>,<code>ARR=36</code>,&#x91C7;&#x7528;&#x9012;&#x589E;&#x8BA1;&#x6570;&#x6A21;&#x5F0F;&#xFF0C;&#x8BA1;&#x6570;&#x5668;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x521D;&#x503C;&#x4E3A;0&#x3002;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x65F6;&#x5E8F;&#x5982;&#x56FE;8-7&#x6240;&#x793A;&#x3002;</p>
<p><img src="https://image.7-0.cc/images/2026/02/09/STM32-TIMER-4.png" alt="STM32-TIMER-4.png" loading="lazy"></p>
<p>&#x81F3;&#x6B64;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x63A8;&#x5BFC;&#x51FA;&#xFF0C;&#x5B9A;&#x65F6;&#x65F6;&#x95F4;&#x7684;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#x4E3A;:</p>
<p>$$<br>
T=(PSC+1) * (ARR+1) / CK\_PSC<br>
$$</p>
<ul>
<li>&#x7531;&#x4E8E;&#x8BA1;&#x6570;&#x5668;&#x5BC4;&#x5B58;&#x5668;&#x4ECE;0&#x5F00;&#x59CB;&#x8BA1;&#x6570;&#xFF0C;&#x4E14;&#x8BA1;&#x6570;&#x503C;0&#x4F1A;&#x4FDD;&#x6301;1&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x8BA1;&#x6570;&#x8109;&#x51B2;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x5B9E;&#x9645;&#x7684;&#x8BA1;&#x6570;&#x8109;&#x51B2;&#x4E2A;&#x6570;&#x4E3A;&#xFF1A;<code>ARR+1</code>&#x3002;</li>
<li>&#x516C;&#x5F0F;&#x7684; <code>(PSC+1) * (ARR+1)</code> &#x90E8;&#x5206;&#x53EF;&#x4EE5;&#x7B80;&#x5355;&#x770B;&#x505A;: &#x89E6;&#x53D1;&#x6EA2;&#x51FA;&#x4E8B;&#x4EF6;&#x9700;&#x8981;&#x591A;&#x5C11;&#x4E2A; <code>CK_PSC</code> &#x8109;&#x51B2;&#x6570;&#x3002;</li>
<li>&#x9700;&#x8981;&#x8109;&#x51B2;&#x6570; / &#x9891;&#x7387; &#x5C31;&#x53EF;&#x4EE5;&#x6C42;&#x51FA;&#x89E6;&#x53D1;&#x6EA2;&#x51FA;&#x4E8B;&#x4EF6;&#x603B;&#x5171;&#x9700;&#x8981;&#x591A;&#x5C11;&#x79D2;&#x3002;</li>
</ul>
<p>&#x540C;&#x6837;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x5F97;&#x5230;&#x5B9A;&#x65F6;&#x5668;&#x6EA2;&#x51FA;&#x9891;&#x7387;&#x7684;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#xFF1A;</p>
<p>$$<br>
f=CK\_PSC / (PSC+1) * (ARR+1)<br>
$$</p>
<h3 id="%E5%A4%96%E9%83%A8%E8%84%89%E5%86%B2%E8%AE%A1%E6%95%B0">&#x5916;&#x90E8;&#x8109;&#x51B2;&#x8BA1;&#x6570;</h3>
<p>&#x5916;&#x90E8;&#x4FE1;&#x53F7;&#x7684;&#x8F93;&#x5165;&#x6709;&#x4E24;&#x4E2A;&#x9014;&#x5F84;&#xFF1A;</p>
<ul>
<li>&#x4E00;&#x4E2A;&#x662F;&#x901A;&#x8FC7;&#x5916;&#x90E8;&#x89E6;&#x53D1;&#x8F93;&#x5165;&#x5F15;&#x811A; <code>ETR</code>&#xFF0C;&#x7ECF;&#x8FC7;&#x6781;&#x6027;&#x9009;&#x62E9;&#x3001;&#x5206;&#x9891;&#x548C;&#x6EE4;&#x6CE2;&#x4EE5;&#x540E;&#xFF0C;&#x518D;&#x8F93;&#x5165;&#x5230;&#x65F6;&#x57FA;&#x5355;&#x5143;&#x8FDB;&#x884C;&#x8BA1;&#x6570;(<strong>&#x5DE5;&#x7A0B;&#x5E38;&#x7528;</strong>)&#x3002;</li>
<li>&#x4E00;&#x4E2A;&#x662F;&#x901A;&#x8FC7;&#x5916;&#x90E8;&#x8F93;&#x5165;&#x5F15;&#x811A; <code>TIx</code>&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;<code>TIMx_CHn</code>&#xFF0C;&#x7ECF;&#x8FC7;&#x6EE4;&#x6CE2;&#x548C;&#x8FB9;&#x6CBF;&#x68C0;&#x6D4B;&#x540E;&#xFF0C;&#x518D;&#x8F93;&#x5165;&#x5230;&#x65F6;&#x57FA;&#x5355;&#x5143;&#x8FDB;&#x884C;&#x8BA1;&#x6570;&#x3002;</li>
</ul>
<p>&#x5916;&#x90E8;&#x8109;&#x51B2;&#x4FE1;&#x53F7;&#x7684;&#x5904;&#x7406;&#x6D41;&#x7A0B;&#x5982;&#x56FE;8-8&#x6240;&#x793A;&#x3002;</p>
<p><img src="https://image.7-0.cc/images/2026/02/10/STM32-TIMER-5.png" alt="STM32-TIMER-5.png" loading="lazy"></p>
<p>&#x6781;&#x6027;&#x9009;&#x62E9;&#x7528;&#x4E8E;&#x9009;&#x62E9;&#x5916;&#x90E8;&#x8109;&#x51B2;&#x4FE1;&#x53F7;&#x7684;&#x89E6;&#x53D1;&#x6781;&#x6027;&#xFF0C;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x53CD;&#x76F8;&#x548C;&#x4E0D;&#x53CD;&#x76F8;&#xFF1A;&#x89E6;&#x53D1;&#x6781;&#x6027;&#x4E0D;&#x53CD;&#x76F8;&#x8868;&#x793A;&#x5728;&#x8109;&#x51B2;&#x4FE1;&#x53F7;&#x7684;&#x4E0A;&#x5347;&#x6CBF;&#x51FA;&#x73B0;&#x65F6;&#x8BA1;&#x6570;&#xFF1B;&#x89E6;&#x53D1;&#x6781;&#x6027;&#x53CD;&#x76F8;&#x8868;&#x793A;&#x5728;&#x8109;&#x51B2;&#x4FE1;&#x53F7;&#x7684;&#x4E0B;&#x964D;&#x6CBF;&#x51FA;&#x73B0;&#x65F6;&#x8BA1;&#x6570;&#x3002;</p>
<h2 id="hal-%E5%BA%93%E5%A4%96%E8%AE%BE%E6%A8%A1%E5%9D%97%E7%9A%84%E7%BC%96%E7%A8%8B">HAL &#x5E93;&#x5916;&#x8BBE;&#x6A21;&#x5757;&#x7684;&#x7F16;&#x7A0B;</h2>
<p>&#x5BF9;&#x4E8E;&#x5B9A;&#x65F6;&#x5668;(<code>TIMER</code>)&#x3001;&#x4E32;&#x53E3;(<code>UART</code>)&#x548C;&#x6A21;&#x6570;&#x8F6C;&#x6362;&#x5668;(<code>ADC</code>)&#x7B49;&#x529F;&#x80FD;&#x8F83;&#x4E3A;&#x590D;&#x6742;&#x7684;&#x5916;&#x8BBE;&#xFF0C;HAL&#x5E93;&#x8BBE;&#x8BA1;&#x4E86;&#x4E00;&#x4E2A;&#x540D;&#x4E3A;&#x5916;&#x8BBE;&#x53E5;&#x67C4;&#x7684;&#x6570;&#x636E;&#x7C7B;&#x578B;<code>PPP_HandleTypeDef</code>(PPP&#x8868;&#x793A;&#x5916;&#x8BBE;&#x540D;&#x79F0;)&#x3002;</p>
<pre><code class="language-c">#define TIM2 ((TIM_TypeDef *) TIM2_BASE)

typedef struct
{
  uint32_t Prescaler;                         // &#x9884;&#x5206;&#x9891;&#x7CFB;&#x6570; PSC, &#x5373; TIMx_PSC &#x7684;&#x5185;&#x5BB9;
  uint32_t CounterMode;                       // &#x8BA1;&#x6570;&#x6A21;&#x5F0F;
  uint32_t Period;                            // &#x81EA;&#x52A8;&#x91CD;&#x88C5;&#x8F7D;&#x503C; ARR, &#x5373; TIMx_ARR &#x7684;&#x5185;&#x5BB9;
  uint32_t ClockDivision;                     // &#x65F6;&#x949F;&#x5206;&#x9891;
  uint32_t RepetitionCounter;                 // &#x91CD;&#x590D;&#x8BA1;&#x6570;&#x5668;&#xFF08;&#x4EC5;&#x9AD8;&#x7EA7;&#x5B9A;&#x65F6;&#x5668;&#x6709;&#x6548;&#xFF09;
  uint32_t AutoReloadPreload;                 // &#x8BBE;&#x7F6E;&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x5BC4;&#x5B58;&#x5668; TIMx_ARR &#x7684;&#x9884;&#x88C5;&#x8F7D;&#x503C;
} TIM_Base_InitTypeDef;

typedef struct {
    TIM_TypeDef                *Instance;     // &#x5B9A;&#x65F6;&#x5668;&#x5916;&#x8BBE;&#x5B9E;&#x4F8B;(&#x5BC4;&#x5B58;&#x5668;&#x57FA;&#x5730;&#x5740;)
    TIM_Base_InitTypeDef       Init;          // &#x5B9A;&#x65F6;&#x5668;&#x65F6;&#x57FA;&#x521D;&#x59CB;&#x5316;&#x53C2;&#x6570;&#x914D;&#x7F6E;
    HAL_TIM_ActiveChannel      Channel;       // &#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#xFF08;&#x7528;&#x4E8E; PWM&#x3001;&#x8F93;&#x5165;&#x6355;&#x83B7;&#x7B49;&#xFF09;
    DMA_HandleTypeDef          *hdma[7];      // DMA &#x53E5;&#x67C4;&#x6570;&#x7EC4;
    HAL_LockTypeDef            Lock;          // &#x4FDD;&#x62A4;&#x9501;&#xFF08;&#x9632;&#x6B62;&#x591A;&#x4EFB;&#x52A1;&#x51B2;&#x7A81;&#xFF09;
    __IO HAL_TIM_StateTypeDef  State;         // &#x5B9A;&#x65F6;&#x5668;&#x72B6;&#x6001;&#xFF08;&#x5982; ready, busy, error&#xFF09;
} TIM_HandleTypeDef;

TIM_HandleTypeDef htim2;                      // &#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; htim2 &#x7684;&#x53E5;&#x67C4;
htim2.Instance         = TIM2;                // &#x6307;&#x5411; TIM2 &#x7684;&#x786C;&#x4EF6;&#x5730;&#x5740;
htim2.Init.Prescaler   = 71;                  // &#x9884;&#x5206;&#x9891;&#x5668;
htim2.Init.Period      = 999;                 // &#x81EA;&#x52A8;&#x91CD;&#x88C5;&#x8F7D;&#x503C; (ARR)
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
                                              // ... &#x5176;&#x4ED6;&#x521D;&#x59CB;&#x5316;
HAL_TIM_Base_Init(&amp;htim2);                    // &#x8C03;&#x7528;&#x5E93;&#x51FD;&#x6570;&#xFF0C;&#x628A; Init &#x91CC;&#x7684;&#x53C2;&#x6570;&#x5199;&#x8FDB; Instance &#x5BC4;&#x5B58;&#x5668;
</code></pre>
<p>&#x5B9A;&#x65F6;&#x5668;&#x6709;&#x4E24;&#x79CD;&#x542F;&#x52A8;&#x65B9;&#x5F0F;&#xFF0C;&#x8F6E;&#x8BE2;&#x6216;&#x4E2D;&#x65AD;&#x3002;&#x5BF9;&#x4E8E;&#x5B9A;&#x65F6;&#x5668;&#x6765;&#x8BF4;&#x8FD9;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x7684;&#x533A;&#x522B;&#x5728;&#x4E8E;&#x8BBE;&#x7F6E;&#x7684;&#x6807;&#x5FD7;&#x4F4D;&#x4E0D;&#x540C;&#xFF0C;&#x8F6E;&#x8BE2;&#x65F6;&#x7531;&#x7528;&#x6237;&#x81EA;&#x884C;&#x68C0;&#x67E5;&#x3002;&#x800C;&#x4E2D;&#x65AD;&#x5219;&#x8BBE;&#x7F6E;&#x4E2D;&#x65AD;&#x6807;&#x5FD7;&#xFF0C;&#x4ECE;&#x800C;&#x89E6;&#x53D1;&#x4E2D;&#x65AD;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x3002;</p>
<blockquote>
<p>&#x6CE8;&#x610F;&#xFF1A;</p>
<p>&#x5B9A;&#x65F6;&#x5668;&#x662F;&#x4E00;&#x4E2A;&#x7247;&#x5185;&#x5916;&#x8BBE;&#xFF0C;&#x56E0;&#x6B64;&#x5B9A;&#x65F6;&#x5668;&#x5728;&#x8BA1;&#x6570;&#x6216;&#x8F93;&#x51FA;PWM&#x65F6;&#xFF0C;&#x662F;<strong>&#x5B8C;&#x5168;&#x72EC;&#x7ACB;&#x4E8E;CPU</strong>&#x5DE5;&#x4F5C;&#x7684;&#xFF0C;<strong>&#x5B8C;&#x5168;&#x4E0D;&#x5F71;&#x54CD;CPU&#x7684;&#x6307;&#x4EE4;&#x6267;&#x884C;</strong>&#x3002;</p>
</blockquote>
<h3 id="%E8%BD%AE%E8%AF%A2%E6%96%B9%E5%BC%8F">&#x8F6E;&#x8BE2;&#x65B9;&#x5F0F;</h3>
<pre><code class="language-c">// 1. &#x542F;&#x52A8;&#x5B9A;&#x65F6;&#x5668;
HAL_TIM_Base_Start(&amp;htim2);

while (1)
{
    // 2. &#x8F6E;&#x8BE2;&#x68C0;&#x67E5;&#xFF1A;UIF &#x6807;&#x5FD7;&#x4F4D;&#x662F;&#x5426;&#x88AB;&#x7F6E; 1&#xFF08;&#x8BF4;&#x660E;&#x8BA1;&#x6570;&#x6EA2;&#x51FA;&#x4E86;&#xFF09;
    if (__HAL_TIM_GET_FLAG(&amp;htim2, TIM_FLAG_UPDATE) != RESET)
    {
        // 3. &#x6E05;&#x9664;&#x6807;&#x5FD7;&#x4F4D;&#xFF08;&#x5982;&#x679C;&#x4E0D;&#x6E05;&#x9664;&#xFF0C;&#x4E0B;&#x6B21;&#x8FDB;&#x6765;&#x7ACB;&#x523B;&#x53C8;&#x662F; SET&#xFF09;
        __HAL_TIM_CLEAR_FLAG(&amp;htim2, TIM_FLAG_UPDATE);

        // 4. &#x6267;&#x884C;&#x4F60;&#x7684;&#x903B;&#x8F91;&#x4EE3;&#x7801;
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    }
}
</code></pre>
<h3 id="%E4%B8%AD%E6%96%AD%E6%96%B9%E5%BC%8F">&#x4E2D;&#x65AD;&#x65B9;&#x5F0F;</h3>
<p>&#x4E2D;&#x65AD;&#x65B9;&#x5F0F;&#x4F7F;&#x7528; <code>HAL_TIM_Base_Start_IT()</code> &#x542F;&#x52A8;&#x5B9A;&#x65F6;&#x5668;, &#x5F53;&#x6EA2;&#x51FA;&#x4E8B;&#x4EF6;&#x53D1;&#x751F;&#x65F6;&#xFF0C;&#x4F1A;&#x8BBE;&#x7F6E;&#x4E2D;&#x65AD;&#x6807;&#x5FD7;&#xFF0C;&#x4ECE;&#x800C;&#x89E6;&#x53D1;&#x4E2D;&#x65AD;&#x8FD0;&#x884C;&#x4E2D;&#x65AD;&#x5904;&#x7406;&#x51FD;&#x6570;&#xFF0C;&#x6700;&#x540E;&#x88AB; <code>HAL_TIM_PeriodElapsedCallback</code> &#x5904;&#x7406;&#x3002;</p>
<blockquote>
<p><strong>&#x6CE8;&#x610F;&#xFF1A;</strong></p>
<p>&#x5728;&#x8C03;&#x7528;&#x63A5;&#x53E3;&#x51FD;&#x6570; <code>HAL_TIM_Base_Init()</code> &#x521D;&#x59CB;&#x5316;&#x65F6;&#x57FA;&#x5355;&#x5143;&#x65F6;&#xFF0C;&#x4F1A;&#x6267;&#x884C;&#x4E00;&#x4E2A;&#x8F6F;&#x4EF6;&#x66F4;&#x65B0;&#x8BED;&#x53E5;&#xFF1A;<code>TIMx-&gt;EGR=TIM_EGR_UG</code>,&#x8FD9;&#x4E2A;&#x8BED;&#x53E5;&#x5C06;&#x89E6;&#x53D1;&#x66F4;&#x65B0;&#x4E8B;&#x4EF6;&#xFF0C;&#x5E76;&#x7F6E;&#x4F4D;&#x66F4;&#x65B0;&#x4E2D;&#x65AD;&#x6807;&#x5FD7;&#x3002;</p>
<p>&#x5982;&#x679C;&#x91C7;&#x7528;&#x4E2D;&#x65AD;&#x65B9;&#x5F0F;&#x542F;&#x52A8;&#x5B9A;&#x65F6;&#x5668;&#xFF0C;&#x4E00;&#x65E6;&#x4F7F;&#x80FD;&#x4E86;&#x66F4;&#x65B0;&#x4E2D;&#x65AD;&#xFF0C;&#x5C06;&#x7ACB;&#x5373;&#x8FDB;&#x5165;&#x66F4;&#x65B0;&#x4E2D;&#x65AD;&#x670D;&#x52A1;&#x7A0B;&#x5E8F;&#x3002;&#x56E0;&#x6B64;&#x7528;&#x6237;&#x5728;&#x4F7F;&#x80FD;&#x5B9A;&#x65F6;&#x5668;&#x66F4;&#x65B0;&#x4E2D;&#x65AD;&#x4E4B;&#x524D;&#xFF0C;&#x5FC5;&#x987B;&#x5148;&#x6267;&#x884C;&#x6E05;&#x9664;&#x66F4;&#x65B0;&#x4E2D;&#x65AD;&#x6807;&#x5FD7;&#x7684;&#x64CD;&#x4F5C;&#x3002;</p>
</blockquote>
<h2 id="%E5%AE%9A%E6%97%B6%E4%B8%8E%E8%AE%A1%E6%95%B0%E7%A4%BA%E4%BE%8B">&#x5B9A;&#x65F6;&#x4E0E;&#x8BA1;&#x6570;&#x793A;&#x4F8B;</h2>
<h3 id="%E5%AE%9A%E6%97%B6%E9%97%AA%E7%83%81%E6%8C%87%E7%A4%BA%E7%81%AF">&#x5B9A;&#x65F6;&#x95EA;&#x70C1;&#x6307;&#x793A;&#x706F;</h3>
<h4 id="cubemx-%E9%85%8D%E7%BD%AE">CubeMX &#x914D;&#x7F6E;</h4>
<ul>
<li>
<p><code>STM32F411RET6</code> (100MHz)</p>
<ul>
<li><code>Times</code> -&gt; <code>TIM10</code>:
<ul>
<li><code>Activated</code> -&gt; <code>checked</code></li>
<li><code>Prescaler</code> -&gt; <code>9999</code></li>
<li><code>CounterPeriod</code> -&gt; <code>9999</code>;</li>
<li><code>CounterMode</code> -&gt; <code>UP</code></li>
</ul>
</li>
</ul>
</li>
<li>
<p><code>STM32F103C8T6</code> (72MHz)</p>
<ul>
<li><code>Times</code> -&gt; <code>TIM3</code>:
<ul>
<li><code>Activated</code> -&gt; <code>checked</code></li>
<li><code>Prescaler</code> -&gt; <code>7199</code></li>
<li><code>CounterPeriod</code> -&gt; <code>9999</code>;</li>
<li><code>CounterMode</code> -&gt; <code>UP</code></li>
</ul>
</li>
</ul>
</li>
<li>
<p><code>NVIC</code> &#x542F;&#x7528; <code>TIM10</code> &#x6216; <code>TIM3</code> &#x4E2D;&#x65AD;</p>
</li>
</ul>
<pre><code class="language-c">  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();

  /* USER CODE BEGIN 2 */
  __HAL_TIM_CLEAR_IT(&amp;htim3, TIM_IT_UPDATE);  // &#x6E05;&#x9664;&#x66F4;&#x65B0;&#x4E2D;&#x65AD;&#x6807;&#x5FD7;, &#x907F;&#x514D;&#x5B9A;&#x65F6;&#x5668;&#x4E00;&#x542F;&#x52A8;&#x5C31;&#x8FDB;&#x5165;&#x4E2D;&#x65AD;
  HAL_TIM_Base_Start_IT(&amp;htim3);              // &#x4E2D;&#x65AD;&#x65B9;&#x5F0F;&#x542F;&#x52A8;&#x5B9A;&#x65F6;&#x5668;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
</code></pre>
<p>&#x589E;&#x52A0;&#x5B9A;&#x65F6;&#x5668;&#x51FD;&#x6570;</p>
<pre><code class="language-c">/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim-&gt;Instance == TIM3) {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    }
}
/* USER CODE END 4 */
</code></pre>
<h3 id="%E5%A4%96%E9%83%A8%E8%84%89%E5%86%B2%E8%AE%A1%E6%95%B0%E7%A4%BA%E4%BE%8B">&#x5916;&#x90E8;&#x8109;&#x51B2;&#x8BA1;&#x6570;&#x793A;&#x4F8B;</h3>
<p>&#x76D1;&#x542C;&#x952E;&#x76D8;&#x4E8B;&#x4EF6;&#xFF0C;&#x6BCF;&#x89E6;&#x6309;&#x4E0B;&#x4E00;&#x6B21;&#x952E;&#x76D8;&#xFF0C;&#x5C31;&#x901A;&#x8FC7;&#x5F15;&#x811A;&#x8F93;&#x51FA;&#x4E00;&#x4E2A;&#x5468;&#x671F;&#x4E3A;2ms&#x7684;&#x8109;&#x51B2;&#xFF0C;&#x9001;&#x5165;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x5916;&#x90E8;&#x89E6;&#x53D1;&#x8F93;&#x5165;&#x5F15;&#x811A;&#x8FDB;&#x884C;&#x8BA1;&#x6570;&#xFF0C;&#x5E76;&#x5C06;&#x8BA1;&#x7B97;&#x7ED3;&#x679C;&#x901A;&#x8FC7;&#x4E32;&#x53E3;&#x53D1;&#x9001;&#x5230;PC&#x4E0A;&#x663E;&#x793A;&#x3002;</p>
<ul>
<li><code>STM32F411RET6</code> (100MHz)
<ul>
<li><code>Times</code> -&gt; <code>TIM2</code>: &#x5916;&#x90E8;&#x8F93;&#x5165;&#x8BA1;&#x6570;&#x8BBE;&#x7F6E;
<ul>
<li><code>TriggerSource</code> -&gt; <code>Disbale</code></li>
<li><code>ClockSource</code> -&gt; <code>ETR2</code></li>
<li><code>Prescaler</code> -&gt; <code>0</code></li>
<li><code>CounterPeriod</code> -&gt; <code>65535</code>;</li>
<li><code>CounterMode</code> -&gt; <code>UP</code></li>
<li><code>ClockFilter</code> -&gt; <code>0</code></li>
</ul>
</li>
<li><code>Connectivity</code> -&gt; <code>USART1</code>: &#x4E32;&#x53E3;&#x901A;&#x8BAF;&#x8BBE;&#x7F6E;
<ul>
<li><code>Mode</code> -&gt; <code>Asynchronous</code></li>
<li><code>BaudRate</code> -&gt; <code>115200</code></li>
<li><code>Parity</code> -&gt; <code>None</code></li>
</ul>
</li>
</ul>
</li>
<li><code>STM32F103C8T6</code> (72MHz)
<ul>
<li><code>Times</code> -&gt; <code>TIM2</code>: &#x5916;&#x90E8;&#x8F93;&#x5165;&#x8BA1;&#x6570;&#x8BBE;&#x7F6E;
<ul>
<li><code>TriggerSource</code> -&gt; <code>Disbale</code></li>
<li><code>ClockSource</code> -&gt; <code>ETR2</code></li>
<li><code>Prescaler</code> -&gt; <code>0</code></li>
<li><code>CounterPeriod</code> -&gt; <code>65535</code>;</li>
<li><code>CounterMode</code> -&gt; <code>UP</code></li>
<li><code>ClockFilter</code> -&gt; <code>0</code></li>
</ul>
</li>
<li><code>Connectivity</code> -&gt; <code>USART1</code>: &#x4E32;&#x53E3;&#x901A;&#x8BAF;&#x8BBE;&#x7F6E;
<ul>
<li><code>Mode</code> -&gt; <code>Asynchronous</code></li>
<li><code>BaudRate</code> -&gt; <code>115200</code></li>
<li><code>Parity</code> -&gt; <code>None</code></li>
</ul>
</li>
</ul>
</li>
</ul>
<p>&#x5B9E;&#x73B0;&#x4EE3;&#x7801;&#x6458;&#x8981;&#x5982;&#x4E0B;, &#x5176;&#x4E2D;(&#x4EE5;STM32F103C8T6&#x4E3A;&#x57FA;&#x51C6;, &#x5176;&#x4ED6;&#x677F;&#x5B50;&#x5F15;&#x811A;&#x6709;&#x6240;&#x4E0D;&#x540C;):</p>
<ul>
<li>PC13 &#x4F5C;&#x4E3A;LED</li>
<li>PB12 &#x4F5C;&#x4E3A;&#x6309;&#x952E;</li>
<li>PC15 &#x4F5C;&#x4E3A;&#x8109;&#x51B2;&#x8F93;&#x51FA;</li>
<li>PA0  &#x4F5C;&#x4E3A;TIM2_ETR</li>
</ul>
<pre><code class="language-c">/* USER CODE BEGIN Includes */
#include &quot;stdio.h&quot;
/* USER CODE END Includes */

/* USER CODE BEGIN 0 */
typedef enum {
  KEY_UP = 0,
  KEY_DEBOUNCE,
  KEY_WAIT_RELEASE,
} KEY_STATE;

KEY_STATE        KeyState = KEY_UP;
volatile uint8_t KeyFlag  = 0;
uint8_t          Result   = 0;
/* USER CODE END 0 */

int main(void)
{
  // &#x7701;&#x7565;...

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&amp;htim1); // &#x542F;&#x52A8;&#x5B9A;&#x65F6;&#x5668;1&#xFF0C;&#x7528;&#x4E8E;&#x6309;&#x952E;&#x68C0;&#x6D4B;
  HAL_TIM_Base_Start(&amp;htim2);    // &#x542F;&#x52A8;&#x5B9A;&#x65F6;&#x5668;2&#xFF0C;&#x7528;&#x4E8E;&#x5916;&#x90E8;&#x8109;&#x51B2;&#x8BA1;&#x6570;

  printf(&quot; Timer count function test: \n&quot;);
  /* USER CODE END 2 */

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
      if (KeyFlag)
      {
        KeyFlag = 0;
        printf(&quot; Button B12 has been target.\n&quot;);
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);  // &#x5207;&#x6362; LED &#x4EE5;&#x4FBF;&#x89C2;&#x5BDF;&#x72B6;&#x6001;

        // 2ms &#x8109;&#x51B2;&#x8F93;&#x51FA;
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
        HAL_Delay(1);
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
        HAL_Delay(1);

        Result = __HAL_TIM_GET_COUNTER(&amp;htim2);  // &#x8BFB;&#x53D6;&#x5916;&#x90E8;&#x8109;&#x51B2;&#x8BA1;&#x6570;&#x503C;
        printf(&quot; count %d.\n&quot;, Result);          // &#x663E;&#x793A;&#x7ED3;&#x679C;
      }
  }
  /* USER CODE END 3 */
}

/* USER CODE BEGIN 4 */
// printf &#x8F93;&#x51FA;&#x91CD;&#x5B9A;&#x5411;&#x5230;&#x4E32;&#x53E3;
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&amp;huart1, (uint8_t*)&amp;ch, 1, HAL_MAX_DELAY);
  return ch;
}

// &#x6309;&#x952E;&#x68C0;&#x6D4B;
void KeyScan()
{
  switch(KeyState) {
    case KEY_UP:
      if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET) {
         KeyState = KEY_DEBOUNCE;
      }
      break;

    case KEY_DEBOUNCE:
      if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET) {
         KeyState = KEY_WAIT_RELEASE;
         KeyFlag = 1;
      }
      else {
        KeyState = KEY_UP;
      }
      break;

    case KEY_WAIT_RELEASE:
      if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_SET) {
         KeyState = KEY_UP;
      }
      break;
  }
}

// &#x5B9A;&#x65F6;&#x68C0;&#x6D4B;&#x6309;&#x94AE;&#x72B6;&#x6001;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim-&gt;Instance == htim1.Instance)
    KeyScan();
}
/* USER CODE END 4 */
</code></pre>
<p><strong>&#x6CE8;&#x610F;:</strong></p>
<ul>
<li>&#x4E32;&#x53E3;&#x90E8;&#x5206;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x56E0;&#x4E3A;&#x4F7F;&#x7528;&#x4E86; <code>printf</code> &#x56E0;&#x6B64;&#x8981;&#x6CE8;&#x610F;&#x52FE;&#x9009; <code>Use MicroLIB</code> &#x8BBE;&#x7F6E;, &#x5426;&#x5219;&#x76F4;&#x63A5;&#x8FD0;&#x884C;&#x53EF;&#x80FD;&#x4E0D;&#x751F;&#x6548;&#x3002;</li>
<li>&#x5916;&#x90E8;&#x8109;&#x51B2;&#x8BA1;&#x6570;&#x65B9;&#x9762;, &#x76F8;&#x5BF9;&#x6765;&#x8BF4;&#x6BD4;&#x8F83;&#x7B80;&#x5355;, &#x5728; CubeMX &#x4E2D;&#x914D;&#x7F6E;&#x597D;&#x5B9A;&#x65F6;&#x5668;&#x540E;, &#x4EC5;&#x9700;&#x8981;&#x542F;&#x52A8; &#x7136;&#x540E; &#x8BFB;&#x53D6;&#x8BA1;&#x6570;&#x503C;&#x5373;&#x53EF;&#x3002;</li>
</ul>
<h2 id="pwm-%E8%BE%93%E5%87%BA">PWM &#x8F93;&#x51FA;</h2>
<p>&#x8109;&#x51B2;&#x5BBD;&#x5EA6;&#x8C03;&#x5236;(pulse width modulation,PWM)&#x662F;&#x4E00;&#x79CD;&#x5BF9;&#x6A21;&#x62DF;&#x4FE1;&#x53F7;&#x7535;&#x5E73;&#x8FDB;&#x884C;&#x6570;&#x5B57;&#x7F16;&#x7801;&#x7684;&#x65B9;&#x6CD5;&#x3002;PWM&#x6280;&#x672F;&#x5E7F;&#x6CDB;&#x5E94;&#x7528;&#x4E8E;&#x673A;&#x68B0;&#x3001;&#x901A;&#x4FE1;&#x3001;&#x529F;&#x7387;&#x63A7;&#x5236;&#x7B49;&#x9886;&#x57DF;&#xFF0C;&#x5982;&#x7535;&#x673A;&#x7684;&#x8F6C;&#x901F;&#x63A7;&#x5236;&#x3001;&#x706F;&#x5149;&#x7684;&#x4EAE;&#x5EA6;&#x8C03;&#x8282;&#x3001;DC-DC&#x8F6C;&#x6362;&#x5668;&#x4EE5;&#x53CA;&#x4FE1;&#x53F7;&#x8C03;&#x5236;&#x7B49;&#x573A;&#x5408;&#x3002;</p>
<p>PWM&#x4FE1;&#x53F7;&#x6709;&#x4E24;&#x4E2A;&#x91CD;&#x8981;&#x7684;&#x53C2;&#x6570;&#xFF1A;&#x5468;&#x671F;&#x548C;&#x5360;&#x7A7A;&#x6BD4;&#x3002;</p>
<ul>
<li><strong>&#x5468;&#x671F;(Period)</strong><br>
&#x4E00;&#x4E2A;&#x5B8C;&#x6574;PWM&#x6CE2;&#x5F62;&#x6240;&#x6301;&#x7EED;&#x7684;&#x65F6;&#x95F4;&#x3002;</li>
<li><strong>&#x5360;&#x7A7A;&#x6BD4;(Duty)</strong>
<ul>
<li>&#x9AD8;&#x7535;&#x5E73;&#x6301;&#x7EED;&#x65F6;&#x95F4;(<code>T</code>)&#x4E0E;&#x5468;&#x671F;(<code>Period</code>)&#x7684;&#x6BD4;&#x503C;&#x3002;</li>
<li>&#x5360;&#x7A7A;&#x6BD4;&#x7684;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#x5982;&#x4E0B;&#xFF1A;<br>
$Duty=(T/Period) * 100%$</li>
</ul>
</li>
</ul>
<p><strong>&#x56FE;8-18</strong> &#x7ED9;&#x51FA;&#x4E86;50%&#x3001;20%&#x548C;80%&#x4E09;&#x79CD;&#x4E0D;&#x540C;&#x5360;&#x7A7A;&#x6BD4;&#x7684;PWM&#x4FE1;&#x53F7;&#x3002;</p>
<p>&#x5982;&#x56FE;<code>8-18</code>&#x6240;&#x793A;&#xFF0C;&#x7535;&#x538B;&#x7684;&#x5CF0;&#x503C;&#x4E3A; $3.3V$, $T_{on}$ &#x8868;&#x793A;&#x9AD8;&#x7535;&#x5E73;&#x6301;&#x7EED;&#x65F6;&#x95F4;&#xFF0C;$T_{off}$ &#x8868;&#x793A;&#x4FE1;&#x53F7;&#x5173;&#x65AD;&#x65F6;&#x95F4;&#xFF0C;&#x865A;&#x7EBF;&#x8868;&#x793A;<code>PWM</code>&#x4FE1;&#x53F7;&#x6240;&#x5BF9;&#x5E94;&#x7684;&#x5E73;&#x5747;&#x7535;&#x538B;&#x3002;</p>
<p><img src="https://image.7-0.cc/images/2026/02/27/STM32-TIMER-PWM-1.png" alt="STM32-TIMER-PWM-1.png" loading="lazy"></p>
<p>&#x6839;&#x636E;&#x5E73;&#x5747;&#x7535;&#x538B;&#x7684;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#xFF1A;<strong>&#x5E73;&#x5747;&#x7535;&#x538B;=&#x5CF0;&#x503C;&#xD7;&#x5360;&#x7A7A;&#x6BD4;</strong>&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8BA1;&#x7B97;&#x51FA;&#x4E0D;&#x540C;&#x5360;&#x7A7A;&#x6BD4;&#x7684;PWM&#x4FE1;&#x53F7;&#x6240;&#x5BF9;&#x5E94;&#x7684;&#x5E73;&#x5747;&#x7535;&#x538B;&#xFF1A;</p>
<ul>
<li><code>20%</code> &#x5360;&#x7A7A;&#x6BD4;&#x7684;&#x5E73;&#x5747;&#x7535;&#x538B;&#x4E3A; <code>0.66V</code>;</li>
<li><code>50%</code> &#x5360;&#x7A7A;&#x6BD4;&#x7684;&#x5E73;&#x5747;&#x7535;&#x538B;&#x4E3A; <code>1.65V</code>;</li>
<li><code>80%</code> &#x5360;&#x7A7A;&#x6BD4;&#x7684;&#x5E73;&#x5747;&#x7535;&#x538B;&#x4E3A; <code>2.64V</code>&#x3002;</li>
</ul>
<p><strong>&#x56E0;&#x6B64;&#xFF0C;PWM&#x4FE1;&#x53F7;&#x80FD;&#x591F;&#x8FDB;&#x884C;&#x7535;&#x538B;&#x8C03;&#x8282;&#x7684;&#x57FA;&#x672C;&#x539F;&#x7406;&#x5C31;&#x662F;&#x4E0D;&#x540C;&#x5360;&#x7A7A;&#x6BD4;&#x7684;PWM&#x4FE1;&#x53F7;&#x7B49;&#x6548;&#x4E8E;&#x4E0D;&#x540C;&#x7684;&#x5E73;&#x5747;&#x7535;&#x538B;&#x3002;</strong></p>
<h3 id="%E6%8D%95%E8%8E%B7%E6%AF%94%E8%BE%83%E9%80%9A%E9%81%93">&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;</h3>
<p>&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#x8D1F;&#x8D23;<strong>&#x8F93;&#x5165;&#x6355;&#x83B7;&#x529F;&#x80FD;</strong>&#x548C;<strong>&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x529F;&#x80FD;</strong>&#x3002;&#x6BCF;&#x4E2A;&#x5B9A;&#x65F6;&#x5668;&#x6700;&#x591A;&#x53EF;&#x4EE5;&#x62E5;&#x6709;4&#x4E2A;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#xFF0C;&#x6BCF;&#x4E2A;&#x901A;&#x9053;&#x90FD;&#x6709;&#x5BF9;&#x5E94;&#x7684;&#x5BC4;&#x5B58;&#x5668;&#x8FDB;&#x884C;&#x63A7;&#x5236;&#xFF0C;&#x4E5F;&#x6709;&#x5BF9;&#x5E94;&#x7684;GPIO&#x5F15;&#x811A;&#x4F5C;&#x4E3A;&#x901A;&#x9053;&#x7684;&#x8F93;&#x5165;&#x548C;&#x8F93;&#x51FA;&#x63A5;&#x53E3;&#x3002;</p>
<p>&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#x7684;&#x529F;&#x80FD;&#x6846;&#x67B6;&#x5982;&#x56FE;8-19&#x6240;&#x793A;&#x3002;</p>
<p><img src="https://image.7-0.cc/images/2026/02/27/STM32-TIMER-PWM-2.png" alt="STM32-TIMER-PWM-2.png" loading="lazy"></p>
<h4 id="1%E8%BE%93%E5%85%A5%E6%8D%95%E8%8E%B7%E5%8D%95%E5%85%83">1.&#x8F93;&#x5165;&#x6355;&#x83B7;&#x5355;&#x5143;</h4>
<p>&#x7528;&#x4E8E;&#x6355;&#x83B7;&#x5916;&#x90E8;&#x8109;&#x51B2;&#x4FE1;&#x53F7;&#xFF0C;&#x6355;&#x83B7;&#x65B9;&#x5F0F;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4E3A;&#x4E0A;&#x5347;&#x6CBF;&#x6355;&#x83B7;&#x3001;&#x4E0B;&#x964D;&#x6CBF;&#x6355;&#x83B7;&#x548C;&#x53CC;&#x8FB9;&#x6CBF;&#x6355;&#x83B7;&#x3002;&#x53D1;&#x751F;&#x6355;&#x83B7;&#x4E8B;&#x4EF6;&#x65F6;&#xFF0C;<strong>&#x5C06;&#x8BA1;&#x6570;&#x5668;&#x7684;&#x5F53;&#x524D;&#x8BA1;&#x6570;&#x503C;&#x9501;&#x5B58;&#x5230;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;</strong>&#xFF0C;&#x4EE5;&#x4F9B;&#x7528;&#x6237;&#x8BFB;&#x53D6;&#xFF0C;&#x540C;&#x65F6;&#x53EF;&#x4EE5;&#x4EA7;&#x751F;&#x6355;&#x83B7;&#x4E2D;&#x65AD;&#x3002;&#x8F93;&#x5165;&#x6355;&#x83B7;&#x4E3B;&#x8981;&#x7528;&#x4E8E;&#x4FE1;&#x53F7;&#x6D4B;&#x91CF;&#xFF0C;&#x53EF;&#x4EE5;&#x6D4B;&#x91CF;&#x4FE1;&#x53F7;&#x7684;&#x5468;&#x671F;&#x3001;&#x9891;&#x7387;&#x548C;&#x5360;&#x7A7A;&#x6BD4;&#x7B49;&#x53C2;&#x6570;&#xFF0C;<strong>&#x6D4B;&#x91CF;&#x6240;&#x4F7F;&#x7528;&#x7684;&#x53C2;&#x8003;&#x65F6;&#x95F4;&#x5C31;&#x662F;&#x6355;&#x83B7;&#x53D1;&#x751F;&#x65F6;&#x9501;&#x5B58;&#x5230;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x7684;&#x503C;</strong>&#xFF08;&#x8BE6;&#x89C1;:<code>&#x8F93;&#x5165;&#x6355;&#x83B7;&#x529F;&#x80FD;</code>&#xFF09;&#x3002;</p>
<h4 id="2%E6%8D%95%E8%8E%B7%E6%AF%94%E8%BE%83%E5%AF%84%E5%AD%98%E5%99%A8">2.&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;</h4>
<p><strong>&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;</strong> <code>TIMx_CCR</code> &#x662F;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#x4E2D;&#x6700;&#x91CD;&#x8981;&#x7684;&#x5BC4;&#x5B58;&#x5668;&#x3002;</p>
<ul>
<li>&#x5728;&#x8F93;&#x5165;&#x6355;&#x83B7;&#x6A21;&#x5F0F;&#x4E0B;&#x7528;&#x4E8E;&#x5B58;&#x653E;&#x53D1;&#x751F;&#x6355;&#x83B7;&#x4E8B;&#x4EF6;&#x65F6;&#x7684;&#x8BA1;&#x6570;&#x503C;&#xFF1B;</li>
<li>&#x5728;&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x6A21;&#x5F0F;&#x4E0B;&#x7528;&#x4E8E;<strong>&#x5B58;&#x653E;&#x9884;&#x8BBE;&#x7684;&#x6BD4;&#x8F83;&#x503C;</strong>&#x3002;</li>
<li>&#x8BE5;&#x5BC4;&#x5B58;&#x5668;&#x5177;&#x5907;&#x9884;&#x88C5;&#x8F7D;&#x529F;&#x80FD;&#xFF0C;&#x7531;&#x5F71;&#x5B50;&#x5BC4;&#x5B58;&#x5668;&#x548C;&#x9884;&#x88C5;&#x8F7D;&#x5BC4;&#x5B58;&#x5668;&#x7EC4;&#x6210;&#xFF0C;&#x9884;&#x88C5;&#x8F7D;&#x529F;&#x80FD;&#x53EF;&#x7531;&#x8F6F;&#x4EF6;&#x9009;&#x62E9;&#x5F00;&#x542F;&#x6216;&#x5173;&#x95ED;&#x3002;</li>
</ul>
<h4 id="3%E8%BE%93%E5%87%BA%E6%AF%94%E8%BE%83%E5%8D%95%E5%85%83">3.&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x5355;&#x5143;</h4>
<p>&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x5355;&#x5143;&#x7528;&#x4E8E;&#x4FE1;&#x53F7;&#x8F93;&#x51FA;&#x3002;<strong>&#x5B9A;&#x65F6;&#x5668;&#x901A;&#x8FC7;&#x5C06;&#x9884;&#x8BBE;&#x7684;&#x6BD4;&#x8F83;&#x503C;&#x4E0E;&#x8BA1;&#x6570;&#x5668;&#x7684;&#x8BA1;&#x6570;&#x503C;&#x505A;&#x5339;&#x914D;&#x6BD4;&#x8F83;</strong>&#xFF0C;&#x4ECE;&#x800C;&#x5B9E;&#x73B0;&#x5404;&#x7C7B;&#x8F93;&#x51FA;&#xFF0C;&#x5982;PWM&#x8F93;&#x51FA;&#x3001;&#x7535;&#x5E73;&#x7FFB;&#x8F6C;&#x3001;&#x5355;&#x8109;&#x51B2;&#x8F93;&#x51FA;&#x548C;&#x5F3A;&#x5236;&#x8F93;&#x51FA;&#x3002;&#x9884;&#x8BBE;&#x7684;&#x6BD4;&#x8F83;&#x503C;&#x5B58;&#x653E;&#x5728;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_CCR</code>&#x4E2D;&#x3002;</p>
<p>&#x4F7F;&#x7528;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x4EE5;&#x4E0B;&#x51E0;&#x70B9;&#xFF1A;</p>
<ul>
<li>&#x8F93;&#x5165;&#x6355;&#x83B7;&#x529F;&#x80FD;&#x548C;&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x529F;&#x80FD;&#x90FD;&#x662F;&#x7531;&#x5B9A;&#x65F6;&#x529F;&#x80FD;&#x884D;&#x751F;&#x800C;&#x6765;&#x3002;<strong>&#x56E0;&#x6B64;&#xFF0C;&#x5B9A;&#x65F6;&#x5668;&#x5DE5;&#x4F5C;&#x4E8E;&#x5B9A;&#x65F6;&#x6A21;&#x5F0F;</strong>&#xFF0C;&#x65F6;&#x949F;&#x6E90;&#x4E3A;&#x5185;&#x90E8;&#x65F6;&#x949F;<code>CK_INT</code>,&#x65F6;&#x57FA;&#x5355;&#x5143;&#x7684;&#x9884;&#x5206;&#x9891;&#x65F6;&#x949F;<code>CK_PSC</code>&#x7B49;&#x4E8E;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x5B9A;&#x65F6;&#x65F6;&#x949F;<code>TIMx_CLK</code>&#x3002;</li>
<li>&#x6BCF;&#x4E2A;&#x5B9A;&#x65F6;&#x5668;&#x5177;&#x5907;<code>1~4</code>&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#xFF0C;<strong>&#x6BCF;&#x4E2A;&#x901A;&#x9053;&#x5177;&#x6709;&#x72EC;&#x7ACB;&#x7684;&#x8F93;&#x5165;&#x6355;&#x83B7;&#x5355;&#x5143;&#x3001;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;&#x548C;&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x5355;&#x5143;&#xFF0C;&#x4F46;&#x5171;&#x4EAB;&#x540C;&#x4E00;&#x4E2A;&#x65F6;&#x57FA;&#x5355;&#x5143;</strong>&#x3002;</li>
<li>&#x6BCF;&#x4E2A;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#x90FD;&#x53EF;&#x4EE5;<strong>&#x72EC;&#x7ACB;&#x8BBE;&#x7F6E;&#x4E3A;&#x6355;&#x83B7;&#x901A;&#x9053;&#xFF08;&#x7528;&#x4E8E;&#x8F93;&#x5165;&#x6355;&#x83B7;&#xFF09;&#x6216;&#x8005;&#x6BD4;&#x8F83;&#x901A;&#x9053;(&#x7528;&#x4E8E;&#x8F93;&#x51FA;&#x6BD4;&#x8F83;)</strong>&#xFF0C;&#x4F46;&#x662F;&#x4E24;&#x79CD;&#x529F;&#x80FD;&#x53EA;&#x80FD;&#x9009;&#x62E9;&#x5176;&#x4E2D;&#x4E4B;&#x4E00;&#x3002;</li>
<li>&#x6BCF;&#x4E2A;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#x90FD;&#x6709;&#x5BF9;&#x5E94;&#x7684;&#x901A;&#x9053;&#x5F15;&#x811A;&#x4F5C;&#x4E3A;&#x901A;&#x9053;&#x7684;&#x8F93;&#x5165;/&#x8F93;&#x51FA;&#x63A5;&#x53E3;&#xFF0C;&#x5982;<code>TIMx_CHn</code>(n&#x8868;&#x793A;&#x901A;&#x9053;&#x53F7;1~4&#xFF0C;&#x4E0B;&#x540C;)&#x3002;&#x8FD9;&#x4E9B;&#x901A;&#x9053;&#x5F15;&#x811A;&#x4E0E;GPIO&#x5F15;&#x811A;&#x590D;&#x7528;&#xFF0C;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x5728;<code>CubeMX</code>&#x8F6F;&#x4EF6;&#x7684;&#x5F15;&#x811A;&#x5206;&#x914D;&#x56FE;&#x4E0A;&#x9009;&#x62E9;GPIO&#x5F15;&#x811A;&#x7684;&#x529F;&#x80FD;&#x4E3A;&#x901A;&#x9053;&#x5F15;&#x811A;&#x3002;</li>
</ul>
<h3 id="pwm-%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86">PWM &#x5B9E;&#x73B0;&#x539F;&#x7406;</h3>
<p>PWM&#x4FE1;&#x53F7;&#x8F93;&#x51FA;&#xFF0C;&#x9700;&#x8981;&#x7528;&#x5230;&#x4E09;&#x4E2A;&#x5BC4;&#x5B58;&#x5668;&#xFF1A;</p>
<ul>
<li><code>TIMx_ARR</code>  &#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x5BC4;&#x5B58;&#x5668;</li>
<li><code>TIMx_CCRn</code> &#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;(n&#x8868;&#x793A;&#x901A;&#x9053;&#x7F16;&#x53F7;1~4&#xFF0C;&#x4E0B;&#x540C;)</li>
<li><code>TIMx_CNT</code>  &#x8BA1;&#x6570;&#x5668;&#x5BC4;&#x5B58;&#x5668;&#xFF0C;&#x5E76;&#x901A;&#x8FC7;&#x901A;&#x9053;&#x5F15;&#x811A;<code>TIMx_CHn</code>&#x8F93;&#x51FA;PWM&#x4FE1;&#x53F7;&#x3002;</li>
</ul>
<p>&#x6574;&#x4E2A;PWM&#x4FE1;&#x53F7;&#x7684;&#x8F93;&#x51FA;&#x8FC7;&#x7A0B;&#x5982;<code>&#x56FE;8-20</code>&#x6240;&#x793A;&#x3002;</p>
<p>&#x542F;&#x52A8;&#x5B9A;&#x65F6;&#x5668;&#x540E;&#xFF0C;&#x8BA1;&#x6570;&#x5668;&#x4ECE;0&#x5F00;&#x59CB;&#x8BA1;&#x6570;&#x3002;&#x8BA1;&#x6570;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x4E0D;&#x65AD;&#x5C06;&#x8BA1;&#x6570;&#x503C;<code>CNT</code>&#x4E0E;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x503C;<code>CCR</code>&#x4EE5;&#x53CA;&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x503C;<code>ARR</code>&#x76F8;&#x6BD4;&#x8F83;&#x3002;</p>
<ul>
<li>&#x5F53;<code>CNT</code>&#x5C0F;&#x4E8E;<code>CCR</code>&#x65F6;&#xFF0C;&#x8F93;&#x51FA;&#x9AD8;&#x7535;&#x5E73;&#xFF1B;</li>
<li>&#x5F53;<code>CNT</code>&#x7B49;&#x4E8E;<code>CCR</code>&#x65F6;&#xFF0C;&#x8F93;&#x51FA;&#x7535;&#x5E73;&#x7FFB;&#x8F6C;&#xFF0C;&#x53D8;&#x4E3A;&#x4F4E;&#x7535;&#x5E73;&#x3002;</li>
<li>&#x5F53;<code>CNT</code>&#x7B49;&#x4E8E;<code>ARR</code>&#x65F6;&#xFF0C;&#x8F93;&#x51FA;&#x7535;&#x5E73;&#x518D;&#x6B21;&#x7FFB;&#x8F6C;&#xFF0C;&#x53D8;&#x4E3A;&#x9AD8;&#x7535;&#x5E73;&#x3002;&#x5E76;&#x89E6;&#x53D1;&#x91CD;&#x8F7D;, &#x5F00;&#x59CB;&#x4E0B;&#x4E00;&#x4E2A;&#x5468;&#x671F;&#x7684;&#x8F93;&#x51FA;&#x3002;</li>
</ul>
<p>&#x6839;&#x636E;PWM&#x4FE1;&#x53F7;&#x7684;&#x8F93;&#x51FA;&#x8FC7;&#x7A0B;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x77E5;&#x9053;&#xFF1A;&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_ARR</code>&#x7528;&#x4E8E;&#x63A7;&#x5236;PWM&#x4FE1;&#x53F7;&#x7684;&#x5468;&#x671F;&#xFF0C;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_CCRn</code>&#x7528;&#x4E8E;&#x63A7;&#x5236;PWM&#x4FE1;&#x53F7;&#x7684;&#x5360;&#x7A7A;&#x6BD4;&#x3002;</p>
<p>&#x7EFC;&#x4E0A;&#x6240;&#x8FF0;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5F97;&#x5230;PWM&#x4FE1;&#x53F7;&#x5468;&#x671F;&#x53CA;&#x5360;&#x7A7A;&#x6BD4;&#x7684;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#xFF1A;</p>
<ul>
<li>$T=(PSC+1)*(ARR+1)/TIMx\_CLK$</li>
<li>$Duty=CCR/(ARR+1)* 100%$</li>
</ul>
<p><img src="https://image.7-0.cc/images/2026/03/01/STM32-TIMER-PWM-3.png" alt="STM32-TIMER-PWM-3.png" loading="lazy"></p>
<p>&#x5047;&#x8BBE;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x5B9A;&#x65F6;&#x65F6;&#x949F;<code>TIM_CLK</code>&#x4E3A;<code>100MHz</code>&#xFF0C;&#x8981;&#x6C42;&#x8F93;&#x51FA;&#x5468;&#x671F;&#x4E3A;<code>1ms</code>&#xFF0C;&#x5360;&#x7A7A;&#x6BD4;&#x4E3A;<code>47.5%</code>&#x7684;PWM&#x4FE1;&#x53F7;&#xFF0C;&#x8F93;&#x51FA;&#x6CE2;&#x5F62;&#x5982;<code>&#x56FE;8-21</code>&#x6240;&#x793A;&#x3002;</p>
<p>&#x8981;&#x4EA7;&#x751F;&#x8FD9;&#x6837;&#x4E00;&#x4E2A;PWM&#x4FE1;&#x53F7;&#xFF0C;&#x6839;&#x636E;&#x516C;&#x5F0F;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;:</p>
<ul>
<li><code>PSC</code> &#x9884;&#x5206;&#x9891;&#x7CFB;&#x6570;&#x4E3A;99&#xFF0C;</li>
<li><code>ARR</code> &#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x503C;&#x4E3A;999&#xFF0C;&#x4ECE;&#x800C;&#x5F97;&#x5230;1ms&#x7684;PWM&#x5468;&#x671F;&#x3002;</li>
<li><code>CCR</code> &#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x503C;&#x4E3A;475&#x3002;</li>
</ul>
<p>&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x6BCF;&#x4E2A;&#x901A;&#x9053;&#x90FD;&#x5177;&#x6709;&#x72EC;&#x7ACB;&#x7684;&#x8F93;&#x5165;&#x6355;&#x83B7;&#x5355;&#x5143;&#x3001;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;&#x548C;&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x5355;&#x5143;&#xFF0C;&#x53EF;&#x4EE5;&#x5206;&#x522B;&#x8F93;&#x51FA;PWM&#x4FE1;&#x53F7;&#x3002;&#x5BF9;&#x4E8E;&#x540C;&#x4E00;&#x4E2A;&#x5B9A;&#x65F6;&#x5668;&#x800C;&#x8A00;&#xFF0C;&#x7531;&#x4E8E;&#x5B83;&#x7684;&#x591A;&#x4E2A;&#x901A;&#x9053;&#x5171;&#x4EAB;&#x540C;&#x4E00;&#x4E2A;&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x5BC4;&#x5B58;&#x5668;&#xFF0C;&#x800C;&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x5185;&#x5BB9;&#x51B3;&#x5B9A;&#x4E86;PWM&#x4FE1;&#x53F7;&#x7684;&#x5468;&#x671F;&#x3002;<strong>&#x56E0;&#x6B64;&#xFF0C;&#x5BF9;&#x4E8E;&#x540C;&#x4E00;&#x4E2A;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x591A;&#x4E2A;&#x901A;&#x9053;&#x800C;&#x8A00;&#xFF0C;&#x53EF;&#x4EE5;&#x540C;&#x65F6;&#x8F93;&#x51FA;&#x5360;&#x7A7A;&#x6BD4;&#x4E0D;&#x540C;&#xFF0C;&#x4F46;&#x5468;&#x671F;&#x76F8;&#x540C;&#x7684;PWM&#x4FE1;&#x53F7;</strong>&#x3002;</p>
<h3 id="%E8%BE%93%E5%87%BA-pwm-%E4%BF%A1%E5%8F%B7%E7%A4%BA%E4%BE%8B">&#x8F93;&#x51FA; PWM &#x4FE1;&#x53F7;&#x793A;&#x4F8B;</h3>
<p>&#x8F93;&#x51FA;&#x5468;&#x671F;&#x4E3A;2s,&#x5360;&#x7A7A;&#x6BD4;&#x4E3A;50%&#x7684;PWM&#x4FE1;&#x53F7;&#x63A7;&#x5236;&#x5F00;&#x53D1;&#x677F;&#x4E0A;&#x7684;&#x6307;&#x793A;&#x706F;LED&#x3002;</p>
<p>CubeMX &#x914D;&#x7F6E;&#x5982;&#x4E0B;:</p>
<ul>
<li><code>STM32F103C8T6</code> (72MHz)
<ul>
<li><code>Times</code> -&gt; <code>TIM2</code>:
<ul>
<li><code>Mode</code>:
<ul>
<li><code>ClockSource</code> -&gt; <code>Internal Clock</code></li>
<li><code>Channel1</code> -&gt; <code>PWM Generation CH1</code>(PA0&#x5F15;&#x811A;)</li>
</ul>
</li>
<li><code>Parameter Settings</code>:
<ul>
<li><code>Prescaler</code>(&#x9884;&#x5206;&#x9891;&#x7CFB;&#x6570;PSC):<code>7199</code></li>
<li><code>Counter Mode</code>(&#x8BA1;&#x6570;&#x6A21;&#x5F0F;)&#xFF1A;<code>Up</code>(&#x9012;&#x589E;&#x8BA1;&#x6570;)</li>
<li><code>Counter Period</code>(&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x503C;ARR):<code>1999</code></li>
<li><code>Internal Clock Division</code>(&#x65F6;&#x949F;&#x5206;&#x9891;)&#xFF1A;<code>No Division</code>(&#x4E0D;&#x5206;&#x9891;)</li>
<li><code>auto-reload preload</code>(&#x9884;&#x88C5;&#x8F7D;&#x529F;&#x80FD;)<code>&#xFF1A;Disable</code>(&#x9884;&#x88C5;&#x8F7D;&#x529F;&#x80FD;&#x5173;&#x95ED;)</li>
<li><code>PWM Generation Channel1</code>(PWM&#x8F93;&#x51FA;&#x901A;&#x9053;1)&#x90E8;&#x5206;&#x8FDB;&#x884C;&#x5982;&#x4E0B;&#x7684;&#x53C2;&#x6570;&#x8BBE;&#x7F6E;&#xFF1A;</li>
<li><code>Mode</code>(&#x8F93;&#x51FA;&#x6A21;&#x5F0F;)&#xFF1A;<code>PWM mode1</code>(&#x8F93;&#x51FA;&#x6A21;&#x5F0F;1)</li>
<li><code>Pulse</code>(&#x5360;&#x7A7A;&#x6BD4;)&#xFF1A;<code>10000</code>(50%&#x5360;&#x7A7A;&#x6BD4;)</li>
<li><code>Output compare preload</code>(&#x8F93;&#x51FA;&#x6BD4;&#x8F83;&#x9884;&#x88C5;&#x8F7D;&#x529F;&#x80FD;)&#xFF1A;<code>Enable</code>(&#x9884;&#x88C5;&#x8F7D;&#x529F;&#x80FD;&#x5F00;&#x542F;)</li>
<li><code>Fast Mode</code>(&#x5FEB;&#x901F;&#x8F93;&#x51FA;&#x6A21;&#x5F0F;)&#xFF1A;<code>Disable</code>(&#x4E0D;&#x4F7F;&#x80FD;&#x5FEB;&#x901F;&#x8F93;&#x51FA;&#x6A21;&#x5F0F;)</li>
<li><code>CH Polarity</code>(&#x8F93;&#x51FA;&#x6781;&#x6027;)&#xFF1A;<code>High</code>(&#x8F93;&#x51FA;&#x6709;&#x6548;&#x7535;&#x5E73;&#x4E3A;&#x9AD8;&#x7535;&#x5E73;)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>&#x6CE8;&#x610F;:</strong></p>
<p>&#x7531;&#x4E8E; LED &#x6240;&#x5728;&#x7684;&#x5F15;&#x811A;&#x5728; <code>PC13</code>, &#x800C;&#x8BE5;&#x5F15;&#x811A;&#x6CA1;&#x6709;&#x5B9A;&#x65F6;&#x5668;&#x6BD4;&#x8F83;&#x901A;&#x9053;, &#x56E0;&#x6B64;&#x4F7F;&#x7528; <code>PA0</code>, &#x5F53;&#x6D4B;&#x8BD5;&#x65F6;&#x901A;&#x8FC7;&#x954A;&#x5B50;&#x77ED;&#x63A5; <code>PA0</code> ~ <code>PC13</code> &#x5373;&#x53EF;&#x3002;</p>
<p>&#x4EE3;&#x7801;&#x5982;&#x4E0B;(&#x5728; CubeMX &#x751F;&#x6210;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x6DFB;&#x52A0;&#x4E00;&#x884C;&#x4EE3;&#x7801;&#x5373;&#x53EF;):</p>
<pre><code class="language-c">/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&amp;htim2, TIM_CHANNEL_1);
/* USER CODE END 2 */
</code></pre>
<h4 id="pwm-%E5%AE%9E%E7%8E%B0%E5%91%BC%E5%90%B8%E7%81%AF">PWM &#x5B9E;&#x73B0;&#x547C;&#x5438;&#x706F;</h4>
<p>&#x5229;&#x7528;PWM&#x4FE1;&#x53F7;&#x63A7;&#x5236;LED&#x6307;&#x793A;&#x706F;&#x3002;&#x8BBE;&#x7F6E;PWM&#x5468;&#x671F;&#x4E3A;20ms,&#x5360;&#x7A7A;&#x6BD4;&#x4ECE;0%&#x5F00;&#x59CB;&#xFF0C;&#x6B65;&#x8FDB;&#x4E3A;10%&#x3002;&#x9012;&#x589E;&#x5230;100%&#x540E;&#xFF0C;&#x53C8;&#x4ECE;0%&#x5F00;&#x59CB;&#xFF0C;&#x5E76;&#x91CD;&#x590D;&#x6574;&#x4E2A;&#x8FC7;&#x7A0B;&#x3002;&#x5360;&#x7A7A;&#x6BD4;&#x4FEE;&#x6539;&#x7684;&#x65F6;&#x95F4;&#x95F4;&#x9694;&#x4E3A;100ms&#x3002;</p>
<p>&#x914D;&#x7F6E;&#x4FEE;&#x6539;&#x5982;&#x4E0B;:</p>
<ul>
<li><code>Prescaler</code>(&#x9884;&#x5206;&#x9891;&#x7CFB;&#x6570;PSC):<code>7199</code></li>
<li><code>Counter Period</code>(&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x503C;ARR):<code>199</code></li>
</ul>
<p>&#x4EE3;&#x7801;&#x5982;&#x4E0B;:</p>
<pre><code class="language-c">/* USER CODE BEGIN 0 */
uint16_t Duty = 0;    // &#x5360;&#x7A7A;&#x6BD4;
uint16_t Step = 10;   // &#x6B65;&#x8FDB;&#x503C;
/* USER CODE END 0 */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&amp;htim2, TIM_CHANNEL_1);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
  for(Duty = 0; Duty &lt;= 200; Duty += Step)
  {
      __HAL_TIM_SET_COMPARE(&amp;htim2, TIM_CHANNEL_1, Duty);
      HAL_Delay(200);
  }
}
/* USER CODE END 3 */
</code></pre>
<h2 id="%E8%BE%93%E5%85%A5%E6%8D%95%E8%8E%B7%E5%8A%9F%E8%83%BD">&#x8F93;&#x5165;&#x6355;&#x83B7;&#x529F;&#x80FD;</h2>
<h3 id="%E8%BE%93%E5%85%A5%E6%8D%95%E8%8E%B7%E5%8D%95%E5%85%83%E7%BB%93%E6%9E%84">&#x8F93;&#x5165;&#x6355;&#x83B7;&#x5355;&#x5143;&#x7ED3;&#x6784;</h3>
<p>&#x8F93;&#x5165;&#x6355;&#x83B7;&#x529F;&#x80FD;&#x5229;&#x7528;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x901A;&#x9053;&#x5B9E;&#x73B0;&#xFF0C;&#x5176;&#x57FA;&#x672C;&#x539F;&#x7406;&#x662F;&#xFF1A;&#x8F93;&#x5165;&#x6355;&#x83B7;&#x5355;&#x5143;&#x4E0D;&#x65AD;&#x68C0;&#x6D4B;&#x901A;&#x9053;&#x4E0A;&#x7684;&#x5916;&#x90E8;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#xFF0C;&#x5F53;&#x68C0;&#x6D4B;&#x5230;&#x5916;&#x90E8;&#x4FE1;&#x53F7;&#x7684;&#x6709;&#x6548;&#x8FB9;&#x6CBF;&#xFF08;&#x4E0A;&#x5347;&#x6CBF;&#x3001;&#x4E0B;&#x964D;&#x6CBF;&#x6216;&#x53CC;&#x8FB9;&#x6CBF;&#xFF09;&#x65F6;&#xFF0C;&#x5C06;&#x8BA1;&#x6570;&#x5668;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_CNT</code>&#x7684;&#x5F53;&#x524D;&#x503C;&#x9501;&#x5B58;&#x5230;&#x5BF9;&#x5E94;&#x901A;&#x9053;&#x7684;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_CCRn</code>&#x3002;</p>
<p><img src="https://image.7-0.cc/images/2026/03/03/STM32-TIMER-IC-0.png" alt="STM32-TIMER-IC-0.png" loading="lazy"></p>
<blockquote>
<p>&#x7B14;&#x8BB0;</p>
<p>&#x5F53;&#x68C0;&#x6D4B;&#x5230;&#x5916;&#x90E8;&#x4FE1;&#x53F7;<strong>&#x6709;&#x6548;&#x65F6;</strong>&#xFF0C;&#x5C06;&#x8BA1;&#x6570;&#x5668;&#x4E2D;&#x7684;&#x6570;&#x503C;&#xFF08;&#x53C2;&#x8003;&#x65F6;&#x95F4;&#xFF09;&#xFF0C;&#x5B58;&#x50A8;&#x5230; <code>TIMx_CCRn</code>&#xFF0C;&#x5E76;&#x53EF;&#x9009;&#x7684;&#x89E6;&#x53D1;&#x4E2D;&#x65AD;&#x3002;&#x5F53;&#x89E6;&#x53D1;&#x4E86;&#x4E24;&#x6B21;&#x6355;&#x83B7;&#x4E4B;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x8BA1;&#x7B97;&#x51FA;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#x7684;&#x5468;&#x671F;&#x3001;&#x9891;&#x7387;&#x3001;&#x5360;&#x7A7A;&#x6BD4;&#x7B49;&#x4FE1;&#x606F;&#x3002;</p>
</blockquote>
<h4 id="%E8%BE%93%E5%85%A5%E6%8D%95%E8%8E%B7%E9%80%9A%E9%81%93">&#x8F93;&#x5165;&#x6355;&#x83B7;&#x901A;&#x9053;</h4>
<p>&#x5916;&#x90E8;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#x901A;&#x8FC7;<strong>&#x8F93;&#x5165;&#x6355;&#x83B7;&#x901A;&#x9053;x</strong>&#x5BF9;&#x5E94;&#x7684;&#x5F15;&#x811A;<code>TIMx_CHx</code>&#x4EA7;&#x751F;&#x8F93;&#x5165;&#x4FE1;&#x53F7;<code>TIx</code>;</p>
<h4 id="%E8%BE%93%E5%85%A5%E6%BB%A4%E6%B3%A2%E5%99%A8">&#x8F93;&#x5165;&#x6EE4;&#x6CE2;&#x5668;</h4>
<p>&#x8F93;&#x5165;&#x6EE4;&#x6CE2;&#x5668;&#x7528;&#x4E8E;&#x5BF9;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#x7684;&#x91C7;&#x6837;&#x6EE4;&#x6CE2;&#xFF0C;&#x6EE4;&#x6CE2;&#x540E;&#x7684;&#x4FE1;&#x53F7;&#x4E3A;<code>TIF</code>&#x3002;&#x5F53;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#x5B58;&#x5728;&#x9AD8;&#x9891;&#x5E72;&#x6270;&#x4FE1;&#x53F7;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E;&#x6EE4;&#x6CE2;&#x957F;&#x5EA6;&#xFF0C;&#x5BF9;&#x4FE1;&#x53F7;&#x8FDB;&#x884C;&#x591A;&#x6B21;&#x91C7;&#x6837;&#x3002;&#x5982;&#x679C;&#x8FDE;&#x7EED;N&#x6B21;&#x91C7;&#x6837;&#x68C0;&#x6D4B;&#x90FD;&#x662F;&#x9AD8;&#x7535;&#x5E73;&#xFF0C;&#x5219;&#x8BF4;&#x660E;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x6709;&#x6548;&#x7684;&#x7535;&#x5E73;&#x4FE1;&#x53F7;&#xFF0C;&#x4ECE;&#x800C;&#x6EE4;&#x9664;&#x9AD8;&#x9891;&#x5E72;&#x6270;&#x4FE1;&#x53F7;&#x3002;</p>
<p>&#x8F93;&#x5165;&#x6EE4;&#x6CE2;&#x5668;&#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#x5982;<code>&#x56FE;8-29</code>&#x6240;&#x793A;&#x3002;&#x4ECE;&#x56FE;&#x4E2D;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x5F53;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#x8BBE;&#x7F6E;&#x4E3A;&#x4E0A;&#x5347;&#x6CBF;&#x6355;&#x83B7;&#xFF0C;&#x6EE4;&#x6CE2;&#x957F;&#x5EA6;&#x8BBE;&#x7F6E;&#x4E3A;4&#x65F6;&#x3002;&#x5728;&#x6355;&#x83B7;&#x5230;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#x7684;&#x4E0A;&#x5347;&#x6CBF;&#x540E;&#xFF0C;&#x8F93;&#x5165;&#x6EE4;&#x6CE2;&#x5668;&#x5C06;&#x6309;&#x7167;&#x91C7;&#x6837;&#x65F6;&#x949F;<code>DTS</code>(&#x91C7;&#x6837;&#x65F6;&#x949F;<code>DTS</code>&#x7684;&#x9891;&#x7387;&#x7531;&#x5185;&#x90E8;&#x65F6;&#x949F;<code>CK_INT</code>&#x5206;&#x9891;&#x83B7;&#x5F97;&#xFF0C;&#x5206;&#x9891;&#x7CFB;&#x6570;&#x53EF;&#x4EE5;&#x662F;<code>1/2/4</code>)&#x7684;&#x9891;&#x7387;&#xFF0C;&#x8FDE;&#x7EED;&#x91C7;&#x6837;4&#x6B21;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#x3002;&#x5982;&#x679C;&#x90FD;&#x662F;&#x9AD8;&#x7535;&#x5E73;&#xFF0C;&#x624D;&#x8BF4;&#x660E;&#x8FD9;&#x662F;&#x4E00;&#x6B21;&#x6709;&#x6548;&#x7684;&#x89E6;&#x53D1;&#x4FE1;&#x53F7;<code>TIF</code>&#x3002;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x505A;&#x5230;&#x8FDE;&#x7EED;4&#x6B21;&#x91C7;&#x6837;&#x90FD;&#x662F;&#x9AD8;&#x7535;&#x5E73;&#xFF0C;&#x5219;&#x8BE5;&#x6B21;&#x89E6;&#x53D1;&#x65E0;&#x6548;&#x3002;</p>
<p><img src="https://image.7-0.cc/images/2026/03/03/STM32-TIMER-IC-1.png" alt="STM32-TIMER-IC-1.png" loading="lazy"></p>
<h4 id="%E9%A2%84%E5%88%86%E9%A2%91%E5%99%A8">&#x9884;&#x5206;&#x9891;&#x5668;</h4>
<p>&#x6355;&#x83B7;&#x4FE1;&#x53F7;<code>IC1</code>&#x7ECF;&#x8FC7;&#x9884;&#x5206;&#x9891;&#x5668;&#x4E4B;&#x540E;&#xFF0C;&#x5F97;&#x5230;&#x6700;&#x7EC8;&#x7684;&#x6355;&#x83B7;&#x4FE1;&#x53F7;<code>IC1PS</code>&#x3002;&#x5728;&#x6700;&#x7EC8;&#x7684;&#x6355;&#x83B7;&#x4FE1;&#x53F7;<code>IC1PS</code>&#x7684;&#x4F5C;&#x7528;&#x4E0B;&#xFF0C;&#x5C06;&#x8BA1;&#x6570;&#x5668;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_CNT</code>&#x7684;&#x5F53;&#x524D;&#x8BA1;&#x6570;&#x503C;&#x9501;&#x5B58;&#x5230;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_CCR1</code>,&#x540C;&#x65F6;&#x53EF;&#x4EE5;&#x53D1;&#x51FA;&#x6355;&#x83B7;&#x4E2D;&#x65AD;&#x7533;&#x8BF7;<code>CC1I</code>(Capture/Compare 1 interrupt)&#x3002;</p>
<p>&#x6CE8;&#x610F;&#xFF1A;&#x6355;&#x83B7;&#x4FE1;&#x53F7;&#x7684;&#x8F93;&#x5165;&#x6709;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x3002;</p>
<ul>
<li><strong>&#x76F4;&#x63A5;&#x8F93;&#x5165;</strong>&#x8868;&#x793A;&#x901A;&#x8FC7;&#x672C;&#x901A;&#x9053;&#x5BF9;&#x5E94;&#x7684;&#x901A;&#x9053;&#x5F15;&#x811A;&#x8F93;&#x5165;&#x6355;&#x83B7;&#x4FE1;&#x53F7;&#xFF1B;</li>
<li><strong>&#x95F4;&#x63A5;&#x8F93;&#x5165;</strong>&#x8868;&#x793A;&#x901A;&#x8FC7;&#x5176;&#x4ED6;&#x901A;&#x9053;&#x5BF9;&#x5E94;&#x7684;&#x901A;&#x9053;&#x5F15;&#x811A;&#x8F93;&#x5165;&#x6355;&#x83B7;&#x4FE1;&#x53F7;&#x3002;</li>
</ul>
<p>&#x4F8B;&#x5982;&#xFF1A;</p>
<ul>
<li><code>TI1FP1</code> &#x662F;&#x6355;&#x83B7;&#x901A;&#x9053;1&#x7684;&#x76F4;&#x63A5;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#xFF0C;&#x7531;&#x6355;&#x83B7;&#x901A;&#x9053;1&#x5BF9;&#x5E94;&#x7684;&#x901A;&#x9053;&#x5F15;&#x811A;<code>TIMx_CH1</code>&#x8F93;&#x5165;&#x3002;</li>
<li><code>TI2FP1</code> &#x662F;&#x6355;&#x83B7;&#x901A;&#x9053;1&#x7684;&#x95F4;&#x63A5;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#xFF0C;&#x7531;&#x6355;&#x83B7;&#x901A;&#x9053;2&#x5BF9;&#x5E94;&#x7684;&#x901A;&#x9053;&#x5F15;&#x811A;<code>TIMx_CH2</code>&#x8F93;&#x5165;&#x3002;</li>
</ul>
<h3 id="%E4%BF%A1%E5%8F%B7%E6%B5%8B%E9%87%8F%E5%8E%9F%E7%90%86">&#x4FE1;&#x53F7;&#x6D4B;&#x91CF;&#x539F;&#x7406;</h3>
<p>&#x6211;&#x4EEC;&#x5047;&#x8BBE;&#x5B9A;&#x65F6;&#x5668;&#x91C7;&#x7528;&#x4E0A;&#x5347;&#x6CBF;&#x6355;&#x83B7;&#x548C;&#x9012;&#x589E;&#x8BA1;&#x6570;&#x6A21;&#x5F0F;&#xFF0C;&#x5177;&#x4F53;&#x7684;&#x6D4B;&#x91CF;&#x8FC7;&#x7A0B;&#x5982;&#x4E0B;&#xFF1A;</p>
<ul>
<li>&#x542F;&#x52A8;&#x5B9A;&#x65F6;&#x5668;&#x540E;&#xFF0C;&#x5728;&#x5B9A;&#x65F6;&#x65F6;&#x949F;<code>TIMx_CLK</code>&#x7684;&#x4F5C;&#x7528;&#x4E0B;&#xFF08;&#x6CE8;&#x610F;&#xFF1A;&#x6700;&#x7EC8;&#x8D77;&#x4F5C;&#x7528;&#x7684;&#x65F6;&#x949F;&#x662F;&#x7ECF;&#x8FC7;&#x9884;&#x5206;&#x9891;&#x6A21;&#x5757;&#x5206;&#x9891;&#x540E;&#x7684;&#x8BA1;&#x6570;&#x65F6;&#x949F;<code>CK_CNT</code>&#xFF09;&#xFF0C;&#x8BA1;&#x6570;&#x5668;&#x4ECE;0&#x5F00;&#x59CB;&#x9012;&#x589E;&#x8BA1;&#x6570;&#x3002;</li>
<li>&#x5047;&#x8BBE;&#x5728; $t_b$ &#x65F6;&#x523B;&#xFF0C;&#x88AB;&#x6D4B;&#x4FE1;&#x53F7;&#x51FA;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x4E0A;&#x5347;&#x6CBF;&#xFF0C;&#x89E6;&#x53D1;&#x7B2C;&#x4E00;&#x6B21;&#x6355;&#x83B7;&#x3002;&#x6B64;&#x65F6;&#xFF0C;&#x8BA1;&#x6570;&#x5668;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_CNT</code>&#x7684;&#x5185;&#x5BB9;&#x5C06;&#x9501;&#x5B58;&#x5230;&#x6355;&#x83B7;/&#x6BD4;&#x8F83;&#x5BC4;&#x5B58;&#x5668;<code>TIMx_CCRn</code>&#x4E2D;&#xFF0C;&#x5E76;&#x89E6;&#x53D1;&#x6355;&#x83B7;&#x4E2D;&#x65AD;&#x3002;&#x5728;&#x4E2D;&#x65AD;&#x56DE;&#x8C03;&#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x4FDD;&#x5B58; $t_b$ &#x65F6;&#x523B;&#x7684;&#x6355;&#x83B7;&#x503C;&#x3002;</li>
<li>&#x5728;&#x4E2D;&#x65AD;&#x5904;&#x7406;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x8BA1;&#x6570;&#x6A21;&#x5757;&#x4E0D;&#x4F1A;&#x6682;&#x505C;&#xFF0C;&#x5C06;&#x7EE7;&#x7EED;&#x8BA1;&#x6570;&#x3002;</li>
<li>&#x5047;&#x8BBE;&#x5728; $t_d$ &#x65F6;&#x523B;&#xFF0C;&#x88AB;&#x6D4B;&#x4FE1;&#x53F7;&#x53C8;&#x51FA;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x4E0A;&#x5347;&#x6CBF;&#xFF0C;&#x89E6;&#x53D1;&#x7B2C;&#x4E8C;&#x6B21;&#x6355;&#x83B7;&#x3002;&#x518D;&#x6B21;&#x5C06;<code>TIMx_CNT</code>&#x7684;&#x5185;&#x5BB9;&#x9501;&#x5B58;&#x5230;<code>TIMx_CCRn</code>&#x4E2D;&#x3002;&#x5E76;&#x5728;&#x6355;&#x83B7;&#x4E2D;&#x65AD;&#x56DE;&#x8C03;&#x4E2D;&#xFF0C;&#x4FDD;&#x5B58; $t_d$ &#x65F6;&#x523B;&#x7684;&#x6355;&#x83B7;&#x503C;&#x3002;</li>
<li>&#x5C06;&#x4E24;&#x6B21;&#x6355;&#x83B7;&#x503C;&#x76F8;&#x51CF;&#xFF0C;&#x518D;&#x4E58;&#x4EE5;&#x8BA1;&#x6570;&#x65F6;&#x95F4;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x8BA1;&#x7B97;&#x51FA;&#x4FE1;&#x53F7;&#x7684;&#x5468;&#x671F;&#x3002;</li>
</ul>
<p>&#x6839;&#x636E;&#x4E0A;&#x8FF0;&#x4FE1;&#x53F7;&#x6D4B;&#x91CF;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x603B;&#x7ED3;&#x51FA;&#x4FE1;&#x53F7;&#x5468;&#x671F;&#x7684;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#xFF1A;</p>
<p>$T=Diff * (PSC+1)/TIMx\_CLK$</p>
<p>&#x5176;&#x4E2D; $Diff$ &#x8868;&#x793A;&#x4E24;&#x6B21;&#x6355;&#x83B7;&#x503C;&#x76F8;&#x51CF;&#x540E;&#x7684;&#x5DEE;&#x503C;&#x3002;&#x5982;&#x679C;&#x88AB;&#x6D4B;&#x4FE1;&#x53F7;&#x7684;&#x5468;&#x671F;&#x4E0D;&#x5927;&#x4E8E;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x8BA1;&#x6570;&#x5468;&#x671F;&#xFF08;&#x4ECE;0&#x5230;ARR&#xFF09;&#x65F6;&#x3002;&#x5047;&#x8BBE;&#x4E24;&#x6B21;&#x8FDE;&#x7EED;&#x7684;&#x6355;&#x83B7;&#x503C;&#x5206;&#x522B;&#x4E3A;<code>CCRn_1</code>&#x548C;<code>CCRn_2</code>,&#x5219;&#x6355;&#x83B7;&#x5DEE;&#x503C; $Diff$ &#x53EF;&#x4EE5;&#x6309;&#x7167;&#x5982;&#x4E0B;&#x65B9;&#x6CD5;&#x8BA1;&#x7B97;&#xFF1A;</p>
<ul>
<li>&#x5F53;CCRn_1 &lt; CCRn_2: &#x6355;&#x83B7;&#x5DEE;&#x503C; Diff = CCRn_2 - CCRn_1</li>
<li>&#x5F53;CCRn_1 &gt; CCRn_2: &#x6355;&#x83B7;&#x5DEE;&#x503C; Diff = (ARR+1 - CCRn_1) + CCRn_2</li>
</ul>
<p>&#x6CE8;&#x610F;&#xFF1A;&#x5982;&#x679C;&#x88AB;&#x6D4B;&#x4FE1;&#x53F7;&#x7684;&#x5468;&#x671F;&#x8F83;&#x957F;&#xFF0C;&#x5927;&#x4E8E;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x8BA1;&#x6570;&#x5468;&#x671F;&#x65F6;&#xFF0C;&#x5C31;&#x9700;&#x8981;&#x8003;&#x8651;&#x8BA1;&#x6570;&#x6EA2;&#x51FA;&#x7684;&#x95EE;&#x9898;&#x3002;&#x8FD9;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x80FD;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x66F4;&#x65B0;&#x4E2D;&#x65AD;&#xFF0C;&#x5728;&#x66F4;&#x65B0;&#x4E2D;&#x65AD;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E2D;&#x8BB0;&#x5F55;&#x6EA2;&#x51FA;&#x6B21;&#x6570; <code>m</code>&#xFF0C;&#x6700;&#x7EC8;&#x7684;&#x6355;&#x83B7;&#x5DEE;&#x503C; Diff = m * (ARR+1) - CCRn_1 + CCRn_2&#x3002;</p>
<h3 id="%E4%BF%A1%E5%8F%B7%E6%B5%8B%E9%87%8F%E7%A4%BA%E4%BE%8B">&#x4FE1;&#x53F7;&#x6D4B;&#x91CF;&#x793A;&#x4F8B;</h3>
<p>&#x5229;&#x7528;&#x5B9A;&#x65F6;&#x5668;2&#x7684;<strong>&#x901A;&#x9053;1</strong>&#x6765;&#x6D4B;&#x91CF;&#x4E00;&#x4E2A;&#x5916;&#x90E8;&#x8109;&#x51B2;&#x4FE1;&#x53F7;&#x7684;&#x5468;&#x671F;&#x3001;&#x9891;&#x7387;&#x3001;&#x9AD8;&#x7535;&#x5E73;&#x8109;&#x51B2;&#x5BBD;&#x5EA6;&#x548C;&#x5360;&#x7A7A;&#x6BD4;&#xFF0C;&#x5916;&#x90E8;&#x8109;&#x51B2;&#x4FE1;&#x53F7;&#x7531;&#x53E6;&#x4E00;&#x4E2A;&#x5F15;&#x811A;&#x4EA7;&#x751F;&#x5E76;&#x8F93;&#x5165;&#xFF0C;&#x5E76;&#x5C06;&#x6D4B;&#x91CF;&#x7ED3;&#x679C;&#x901A;&#x8FC7;&#x4E32;&#x53E3;&#x53D1;&#x9001;&#x5230;PC&#x4E0A;&#x663E;&#x793A;&#x3002;</p>
<p>CubeMX &#x914D;&#x7F6E;&#x5982;&#x4E0B;:</p>
<ul>
<li><code>STM32F103C8T6</code> (72MHz)
<ul>
<li><code>Times</code>
<ul>
<li><code>TIM2</code>:
<ul>
<li><code>Mode</code>:
<ul>
<li><code>ClockSource</code> -&gt; <code>Internal Clock</code></li>
<li><code>Channel1</code> -&gt; <code>Input Capture direct mode</code>(PA0&#x5F15;&#x811A;)</li>
</ul>
</li>
<li><code>Parameter Settings</code>:
<ul>
<li><code>Counter Setting</code>:
<ul>
<li><code>Prescaler</code>(&#x9884;&#x5206;&#x9891;&#x7CFB;&#x6570;PSC):<code>0</code></li>
<li><code>Counter Mode</code>(&#x8BA1;&#x6570;&#x6A21;&#x5F0F;)&#xFF1A;<code>Up</code>(&#x9012;&#x589E;&#x8BA1;&#x6570;)</li>
<li><code>Counter Period</code>(&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x503C;ARR):<code>65535</code></li>
<li><code>Internal Clock Division</code>(&#x65F6;&#x949F;&#x5206;&#x9891;)&#xFF1A;<code>No Division</code>(&#x4E0D;&#x5206;&#x9891;)</li>
<li><code>auto-reload preload</code>(&#x9884;&#x88C5;&#x8F7D;&#x529F;&#x80FD;)<code>&#xFF1A;Disable</code>(&#x9884;&#x88C5;&#x8F7D;&#x529F;&#x80FD;&#x5173;&#x95ED;)</li>
</ul>
</li>
<li><code>Input Capture Channel 1</code>:
<ul>
<li><code>Polarity Selection</code>(&#x6355;&#x83B7;&#x8FB9;&#x6CBF;&#x6781;&#x6027;&#x9009;&#x62E9;)&#xFF1A;<code>Rising Edge</code>(&#x4E0A;&#x5347;&#x6CBF;)</li>
<li><code>IC Selection</code>(&#x6355;&#x83B7;&#x901A;&#x9053;&#x9009;&#x62E9;)&#xFF1A;<code>Direct</code>(&#x76F4;&#x63A5;&#x8F93;&#x5165;&#x65B9;&#x5F0F;)</li>
<li><code>Prescaler Division Ratio</code>(&#x8F93;&#x4EBA;&#x4FE1;&#x53F7;&#x5206;&#x9891;&#x6BD4;)&#xFF1A;<code>No division</code>(&#x4E0D;&#x5206;&#x9891;)</li>
<li><code>Input Filter</code>(&#x6EE4;&#x6CE2;&#x957F;&#x5EA6;)&#xFF1A;<code>O</code>(&#x4E0D;&#x8FDB;&#x884C;&#x6EE4;&#x6CE2;)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code>TIM3</code>:&#xFF08;10kHZ &#x5360;&#x7A7A;&#x6BD4;10%&#xFF09;
<ul>
<li><code>Prescaler</code>(&#x9884;&#x5206;&#x9891;&#x7CFB;&#x6570;PSC):<code>719</code></li>
<li><code>Counter Period</code>(&#x81EA;&#x52A8;&#x91CD;&#x8F7D;&#x503C;ARR):<code>9</code></li>
<li><code>Pulse</code>(&#x5360;&#x7A7A;&#x6BD4;)&#xFF1A;<code>1</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-c">/* USER CODE BEGIN PV */
uint32_t          CapVal[3]   = {0}; // &#x5B58;&#x653E;&#x6355;&#x83B7;&#x503C;
uint32_t          CapIndex    = 0;   // &#x6355;&#x83B7;&#x72B6;&#x6001;&#x6307;&#x793A;&#xFF1A;0&#x8868;&#x793A;&#x6CA1;&#x6709;&#x5F00;&#x59CB;&#x6355;&#x83B7;&#xFF0C;1&#x8868;&#x793A;&#x5B8C;&#x6210;&#x4E00;&#x6B21;&#x6355;&#x83B7;&#xFF0C;2&#x8868;&#x793A;&#x5B8C;&#x6210;&#x4E24;&#x6B21;&#x6355;&#x83B7;
volatile uint32_t CapFlag     = 0;   // &#x6355;&#x83B7;&#x5B8C;&#x6210;&#x6807;&#x5FD7;&#xFF1A;0&#x8868;&#x793A;&#x672A;&#x5B8C;&#x6210;&#xFF0C;1&#x8868;&#x793A;&#x5B8C;&#x6210;
uint32_t          Period      = 0;   // &#x5B58;&#x653E;&#x4FE1;&#x53F7;&#x5468;&#x671F;
uint32_t          HighTime    = 0;   // &#x5B58;&#x653E;&#x9AD8;&#x7535;&#x5E73;&#x8109;&#x51B2;&#x5BBD;&#x5EA6;
/* USER CODE END PV */

/* USER CODE BEGIN 2 */
printf(&quot;/*Timer Capture Function*/\n&quot;);       // &#x53D1;&#x9001;&#x63D0;&#x793A;&#x4FE1;&#x606F;
HAL_TIM_PWM_Start(&amp;htim3, TIM_CHANNEL_1);     // &#x542F;&#x52A8;&#x5B9A;&#x65F6;&#x5668;3&#x901A;&#x9053;1&#x8F93;&#x51FA;PwM&#x4FE1;&#x53F7;
HAL_Delay(1000);
HAL_TIM_IC_Start_IT(&amp;htim2,TIM_CHANNEL_1);    // &#x542F;&#x52A8;&#x5B9A;&#x65F6;&#x5668;2&#x901A;&#x9053;1&#x4E0A;&#x5347;&#x6CBF;&#x6355;&#x83B7;
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
  if (CapFlag)                                      // &#x6355;&#x83B7;&#x5B8C;&#x6210;
  {
    if(CapVal[2] &gt;= CapVal[0])                      // &#x4FE1;&#x53F7;&#x5728;&#x4E00;&#x4E2A;&#x5468;&#x671F;&#x5185;
    {
      Period = CapVal[2] - CapVal[0];
    }
    else
    {
      Period = 65535 + 1 - CapVal[0] + CapVal[2];
    }

    printf(&quot;Period:%.2fms\n&quot;, Period/72000.0);      // &#x8BA1;&#x7B97;&#x4FE1;&#x53F7;&#x5468;&#x671F;(&#x6BEB;&#x79D2;), 72MMHz/s=72kHz/ms
    printf(&quot;Frequency:%dHz\n&quot;, 72000000/Period);    // &#x8BA1;&#x7B97;&#x4FE1;&#x53F7;&#x9891;&#x7387;, &#x4E00;&#x79D2;&#x5185;&#x8BA1;&#x6570;&#x5668;&#x89E6;&#x53D1;&#x591A;&#x5C11;&#x6B21; / &#x4E00;&#x4E2A;&#x5468;&#x671F;&#x7684;&#x8BA1;&#x6570;&#x503C; = &#x9891;&#x7387;

    if(CapVal[1] &gt;= CapVal[0])                      // &#x4FE1;&#x53F7;&#x9AD8;&#x7535;&#x5E73;&#x5BBD;&#x5EA6;&#x5728;&#x540C;&#x4E00;&#x4E2A;&#x8BA1;&#x6570;&#x5468;&#x671F;&#x5185;
    {
      HighTime = CapVal[1] - CapVal[0];
    }
    else                                            // &#x4FE1;&#x53F7;&#x9AD8;&#x7535;&#x5E73;&#x5BBD;&#x5EA6;&#x4E0D;&#x5728;&#x540C;&#x4E00;&#x4E2A;&#x8BA1;&#x6570;&#x5468;&#x671F;&#x5185;
    {
      HighTime = 65535 + 1 - CapVal[0] + CapVal[1];
    }

    printf(&quot;High %.2fms\n&quot;, HighTime/72000.0);      // &#x8BA1;&#x7B97;&#x9AD8;&#x7535;&#x5E73;&#x65F6;&#x95F4;
    printf(&quot;Duty:%.1f%%\n&quot;, HighTime*100.0/Period); // &#x8BA1;&#x7B97;&#x5360;&#x7A7A;&#x6BD4;
    printf(&quot;****************************\n&quot;);
    CapFlag = 0;                                    // &#x6E05;&#x9664;&#x6355;&#x83B7;&#x5B8C;&#x6210;&#x6807;&#x5FD7;

    // &#x542F;&#x52A8;&#x4E0B;&#x4E00;&#x6B21;&#x4FE1;&#x53F7;&#x6D4B;&#x91CF;
    HAL_Delay(1000);
    HAL_TIM_IC_Start_IT(&amp;htim2, TIM_CHANNEL_1);
  }
}
/* USER CODE END 3 */
</code></pre>
<p>&#x6355;&#x83B7;&#x4E2D;&#x65AD;:</p>
<pre><code class="language-c">/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if (htim-&gt;Instance == TIM2) // &#x5224;&#x65AD;&#x53D1;&#x751F;&#x6355;&#x83B7;&#x4E2D;&#x65AD;&#x7684;&#x5B9A;&#x65F6;&#x5668;
  {
    if (htim-&gt;Channel == HAL_TIM_ACTIVE_CHANNEL_1) // &#x5224;&#x65AD;&#x53D1;&#x751F;&#x6355;&#x83B7;&#x4E2D;&#x65AD;&#x7684;&#x901A;&#x9053;
    {
      switch (CapIndex)
      {
        // &#x5B58;&#x653E;&#x7B2C;&#x4E00;&#x6B21;&#x4E0A;&#x5347;&#x6CBF;&#x6355;&#x83B7;&#x65F6;&#x7684;&#x6355;&#x83B7;&#x503C;&#xFF0C;&#x4FEE;&#x6539;&#x6355;&#x83B7;&#x65B9;&#x5F0F;&#x4E3A;&#x4E0B;&#x964D;&#x6CBF;&#xFF0C;&#x5E76;&#x4FEE;&#x6539;&#x6355;&#x83B7;&#x6307;&#x793A;
        case 0:
        {
          CapVal[0] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
          __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1,
                                        TIM_INPUTCHANNELPOLARITY_FALLING);
          CapIndex = 1;
          break;
        }

        // &#x5B58;&#x653E;&#x7B2C;&#x4E00;&#x6B21;&#x4E0B;&#x964D;&#x6CBF;&#x6355;&#x83B7;&#x65F6;&#x7684;&#x6355;&#x83B7;&#x503C;&#xFF0C;&#x4FEE;&#x6539;&#x6355;&#x83B7;&#x65B9;&#x5F0F;&#x4E3A;&#x4E0A;&#x5347;&#x6CBF;&#xFF0C;&#x5E76;&#x4FEE;&#x6539;&#x6355;&#x83B7;&#x6307;&#x793A;
        case 1:
        {
          CapVal[1] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
          __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1,
                                        TIM_INPUTCHANNELPOLARITY_RISING);
          CapIndex = 2;
          break;
        }

        // &#x5B58;&#x653E;&#x7B2C;&#x4E8C;&#x6B21;&#x4E0A;&#x5347;&#x6CBF;&#x6355;&#x83B7;&#x65F6;&#x7684;&#x8BA1;&#x6570;&#x5668;&#x521D;&#x503C;&#xFF0C;&#x505C;&#x6B62;&#x6355;&#x83B7;&#xFF0C;&#x91CD;&#x7F6E;&#x6355;&#x83B7;&#x6307;&#x793A;&#xFF0C;&#x8BBE;&#x7F6E;&#x6355;&#x83B7;&#x5B8C;&#x6210;&#x6807;&#x5FD7;
        case 2:
        {
          CapVal[2] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
          HAL_TIM_IC_Stop_IT(htim, TIM_CHANNEL_1);
          CapIndex = 0;
          CapFlag = 1;
          break;
        }

        // &#x9519;&#x8BEF;&#x72B6;&#x6001;
        default:
        {
          Error_Handler();
          break;
        }
      }
    }
  }
}
/* USER CODE END 4 */
</code></pre>
<p>&#x6355;&#x83B7;&#x8FC7;&#x7A0B;&#x793A;&#x610F;&#x56FE;&#x5982;&#x4E0B;:</p>
<p><img src="https://image.7-0.cc/images/2026/03/04/STM32-TIMER-IC-2.png" alt="STM32-TIMER-IC-2.png" loading="lazy"></p>
<h2 id="%E7%AC%94%E8%AE%B0">&#x7B14;&#x8BB0;</h2>
<blockquote>
<p>&#x5728; <code>STM32F103C8T6</code> &#x9047;&#x5230;&#x4E00;&#x4E2A;&#x6709;&#x8DA3;&#x7684;&#x73B0;&#x8C61;, &#x5F53;&#x8F93;&#x51FA; PWM &#x5360;&#x7A7A;&#x6BD4;&#x4E3A; 10% &#x7684;&#x65F6;&#x5019;, &#x7B2C;&#x4E00;&#x6B21;&#x6D4B;&#x91CF;&#x603B;&#x662F;&#x6BD4;&#x540E;&#x9762;&#x7684;&#x5468;&#x671F;&#x5927;&#x4E24;&#x500D;, &#x540E;&#x9762;&#x5C31;&#x6B63;&#x5E38;&#x4E86;&#x3002;&#x4F46;&#x662F;&#x5360;&#x7A7A;&#x6BD4;&#x8BBE;&#x7F6E;&#x4E3A; 40% &#x8FD9;&#x4E2A;&#x73B0;&#x8C61;&#x5C31;&#x6D88;&#x5931;&#x4E86;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x662F;&#x51FA;&#x73B0;&#x95EE;&#x9898;&#x7684;&#x8F93;&#x51FA;:</p>
</blockquote>
<pre><code class="language-c">/*Timer Capture Function*/
CapVal   : 2752,10672,17152
Period   : 0.20ms(14400)
Frequency: 5000Hz
High     : 0.11ms
Duty     : 55.0%
****************************
CapVal   : 21406,22126,28606
Period   : 0.10ms(7200)
Frequency: 10000Hz
High     : 0.01ms
Duty     : 10.0%
****************************
CapVal   : 32534,33254,39734
Period   : 0.10ms(7200)
Frequency: 10000Hz
High     : 0.01ms
Duty     : 10.0%
****************************
/*Timer Capture Function*/      - &#x91CD;&#x65B0;&#x4E0A;&#x7535;, &#x73B0;&#x8C61;&#x4F9D;&#x65E7;
CapVal   : 2752,10672,17152
Period   : 0.20ms(14400)
Frequency: 5000Hz
High     : 0.11ms
Duty     : 55.0%
****************************
CapVal   : 21414,22134,28614
Period   : 0.10ms(7200)
Frequency: 10000Hz
High     : 0.01ms
Duty     : 10.0%
</code></pre>
<p>&#x5206;&#x6790;&#x8BB0;&#x5F55;&#xFF0C;&#x793A;&#x610F;&#x56FE;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-c">   &#x250C;&#x2510;&#x250C;&#x2510;&#x250C;&#x2510;&#x250C;&#x2510;&#x250C;&#x2510;&#x250C;&#x2510;&#x250C;&#x2510;&#x250C;&#x2510;&#x250C;&#x2510;&#x250C;&#x2510;
   &#x250C;&#x2510;                  &#x250C;&#x2510;                  &#x250C;&#x2510;
   &#x2502;&#x2502;                  &#x2502;&#x2502;                  &#x2502;&#x2502;
&#x2500;&#x2500;&#x2500;&#x2518;&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;&#x2514;&#x2500;&#x2500;&#x2500;
   | 720 + 6480 = 7200 |
</code></pre>
<ul>
<li>72,000,000Hz / (719 + 1) = 100,000Hz # &#x8BA1;&#x65F6;&#x5668;&#x5206;&#x9891;&#x540E;&#x7684;&#x9891;&#x7387;</li>
<li>100,000Hz    / 10        =  10,000Hz # PWM &#x6BCF;&#x4E2A;&#x5468;&#x671F;&#x7684;&#x9891;&#x7387;</li>
<li>PWM &#x6BCF;&#x4E2A;&#x5468;&#x671F; 10 &#x8BA1;&#x6570;&#x70B9;, &#x6BCF;&#x4E2A;&#x8BA1;&#x6570;&#x70B9; 720 &#x4E2A;&#x65F6;&#x949F;&#x70B9;, &#x4E00;&#x4E2A;&#x5468;&#x671F;&#x8BA1;&#x6570;&#x70B9; 7200 &#x4E2A;&#x65F6;&#x949F;&#x70B9;&#xFF08;timer ticks&#xFF09;</li>
<li>PWM &#x6BCF;&#x4E2A;&#x5468;&#x671F;&#x5360;&#x7A7A;&#x6BD4;&#x4E3A; 10%, &#x5373; &#x9AD8;&#x7535;&#x5E73; 720 &#x4E2A;&#x65F6;&#x949F;&#x70B9;, &#x4F4E;&#x7535;&#x5E73; 6480 &#x4E2A;&#x65F6;&#x949F;&#x70B9;</li>
<li>&#x6839;&#x636E;&#x9996;&#x6B21;&#x6D4B;&#x91CF;&#x8BB0;&#x5F55;: 2752,10672,17152:</li>
<li>10672 - 2752  = 7920 &#x7B2C;&#x4E00;&#x6B21;&#x4E0A;&#x5347;&#x6CBF;&#x5230;&#x4E0B;&#x964D;&#x6CBF;&#x7684;&#x8BA1;&#x6570;&#x70B9;&#x5927;&#x4E8E;&#x4E00;&#x4E2A;&#x5468;&#x671F;&#x7684;&#x8BA1;&#x6570;&#x70B9; 7200 &#x4E2A;&#x65F6;&#x949F;&#x70B9;</li>
<li>17152 - 10672 = 6480 &#x4E0B;&#x964D;&#x6CBF;&#x5230;&#x7B2C;&#x4E8C;&#x6B21;&#x4E0A;&#x5347;&#x6CBF;&#x7684;&#x8BA1;&#x6570;&#x70B9;&#x7B26;&#x53F7;&#x6B63;&#x5E38;&#x7684;&#x4F4E;&#x7535;&#x5E73; 6480 &#x4E2A;&#x65F6;&#x949F;&#x70B9;</li>
<li><code>7920 = 6480 + 720 + 720</code> &#x5206;&#x6790;&#x7ED3;&#x6784;&#x5927;&#x6982;&#x662F;&#x8FD9;&#x6837; <code>&#x2518;&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;&#x2514;</code></li>
<li>&#x90A3;&#x4E48;&#x53EF;&#x80FD;&#x7684;&#x539F;&#x56E0;&#x53EF;&#x80FD;&#x662F; &#x5F53;&#x6210;&#x529F;&#x6355;&#x83B7;&#x5230;&#x7B2C;&#x4E00;&#x4E2A;&#x4E0A;&#x5347;&#x6CBF;&#x540E;, &#x89E6;&#x53D1;&#x4E86;&#x4E2D;&#x65AD;, &#x7136;&#x540E;&#x4E2D;&#x65AD;&#x4E2D;&#x4FEE;&#x6539;&#x4E3A;&#x6355;&#x83B7;&#x4E0B;&#x964D;&#x6CBF;, &#x4F46;&#x6B64;&#x65F6;&#x5F88;&#x53EF;&#x80FD;&#x5DF2;&#x7ECF;&#x5230;&#x8FBE;&#x4F4E;&#x7535;&#x5E73;&#x4E86;&#xFF0C;&#x6BD5;&#x7ADF;&#x4E0A;&#x5347;&#x6CBF;&#x53EA;&#x6709;720&#x4E2A;&#x65F6;&#x949F;&#x70B9;&#xFF08;10us&#xFF09;, &#x56E0;&#x6B64;&#x4F1A;&#x8DF3;&#x8FC7;&#x4E00;&#x4E2A;&#x4E0A;&#x5347;&#x6CBF;&#x76F4;&#x5230;&#x4E0B;&#x4E00;&#x4E2A;&#x4E0B;&#x964D;&#x6CBF;&#x624D;&#x4F1A;&#x89E6;&#x53D1;&#x3002;&#x8FD9;&#x6837;&#x4E5F;&#x80FD;&#x540E;&#x89E3;&#x91CA;&#x4E3A;&#x4EC0;&#x4E48;&#x5360;&#x7A7A;&#x6BD4;&#x8BBE;&#x7F6E;&#x4E3A; 40% &#x8FD9;&#x4E2A;&#x73B0;&#x8C61;&#x5C31;&#x6D88;&#x5931;&#x4E86;&#x3002;</li>
<li>&#x4F46;&#x4E3A;&#x4EC0;&#x4E48;&#x5728;&#x7B2C;&#x4E00;&#x6B21;&#x4E4B;&#x540E;&#x7684;&#x6D4B;&#x91CF;&#x4E2D;&#x8FD9;&#x4E2A;&#x73B0;&#x8C61;&#x4E5F;&#x4E0D;&#x4F1A;&#x51FA;&#x73B0;&#x4E86;&#xFF0C;&#x8FD8;&#x6CA1;&#x6709;&#x5206;&#x6790;&#x51FA;&#x6765;&#x3002;</li>
</ul>
<p>&#x6355;&#x83B7;&#x7684;&#x6D41;&#x7A0B;&#x5982;&#x4E0B;, &#x8FD9;&#x4E2A;&#x65F6;&#x95F4;&#x7A97;&#x53E3;&#x5927;&#x6982;&#x53EF;&#x80FD;&#x9700;&#x8981; &#x51E0;&#x5341;&#x5230;&#x4E0A;&#x767E;&#x4E2A;CPU&#x5468;&#x671F;, &#x800C;&#x9AD8;&#x7535;&#x5E73;&#x53EA;&#x6709; (720 timer ticks) &#x56E0;&#x6B64;&#x9519;&#x8FC7;&#x7684;&#x6982;&#x7387;&#x5F88;&#x9AD8;&#x3002;</p>
<pre><code class="language-c">- &#x8FB9;&#x7F18;&#x68C0;&#x6D4B;, &#x6355;&#x83B7;&#x5230;&#x4E0A;&#x5347;&#x6CBF;
- &#x7F6E;&#x4F4D;CC1IF
- NVIC&#x89E6;&#x53D1;&#x4E2D;&#x65AD;
- ISR&#x4E2D;&#x65AD;&#x670D;&#x52A1;&#x7A0B;&#x5E8F;
- HAL_TIM_IC_CaptureCallback
- &#x6781;&#x6027;&#x5207;&#x6362;
</code></pre>
<p>&#x540E;&#x7EED;&#x4F18;&#x5316;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x4F7F;&#x7528;&#x4E24;&#x4E2A;&#x901A;&#x9053;&#x540C;&#x65F6;&#x68C0;&#x6D4B;&#x4E0A;&#x5347;&#x6CBF;&#x4E0E;&#x4E0B;&#x964D;&#x6CBF;, &#x51CF;&#x5C11;&#x6781;&#x6027;&#x5207;&#x6362;&#x5BFC;&#x81F4;&#x7684;&#x7F3A;&#x9677;&#x3002;</p>
]]></content:encoded></item><item><title><![CDATA[STM32 GPIO]]></title><description><![CDATA[读书笔记]]></description><link>https://www.7-0.cc/stm32-gpio/</link><guid isPermaLink="false">69b41300b1f19d0001c3e167</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Wed, 28 Jan 2026 04:38:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: STM32 GPIO<br>
@@ Date: 2026-01-28 1238<br>
@@ Note: ~</p>
<h2 id="%E6%A6%82%E5%BF%B5">&#x6982;&#x5FF5;</h2>
<p>&#x5728;STM32&#x4E2D;&#xFF0C;GPIO &#x4E2D;&#x6709;&#x4E24;&#x4E2A;&#x91CD;&#x8981;&#x7684;&#x6982;&#x5FF5;:</p>
<h3 id="%E7%AB%AF%E5%8F%A3">&#x7AEF;&#x53E3;</h3>
<ul>
<li><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;STM32 &#x5C06; GPIO &#x5206;&#x6210;&#x4E86;&#x5F88;&#x591A;&#x4E2A;&#x7EC4;, &#x6BCF;&#x4E00;&#x7EC4;&#x79F0;&#x4E3A;&#x7AEF;&#x53E3;&#x3002;&#x7AEF;&#x53E3;&#x53EF;&#x4EE5;&#x770B;&#x505A;&#x662F;&#x4E00;&#x4E2A;<strong>&#x72EC;&#x7ACB;&#x7684;GPIO&#x5916;&#x8BBE;&#x6A21;&#x5757;</strong>&#x3002;</li>
<li><strong>&#x547D;&#x540D;</strong>&#xFF1A;&#x7AEF;&#x53E3;&#x7528;&#x5927;&#x5199;&#x5B57;&#x6BCD;&#x8868;&#x793A;&#xFF0C;&#x5982; <code>GPIOA</code>&#x3001;<code>GPIOB</code>&#x3001;<code>GPIOC</code>&#x3001;<code>GPIOD</code>&#x3001;<code>GPIOH</code>&#xFF08;&#x5177;&#x4F53;&#x6570;&#x91CF;&#x53D6;&#x51B3;&#x4E8E;&#x82AF;&#x7247;&#x578B;&#x53F7;&#xFF09;&#x3002;</li>
</ul>
<h3 id="%E5%BC%95%E8%84%9A">&#x5F15;&#x811A;</h3>
<ul>
<li><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;&#x5F15;&#x811A;&#x662F;&#x82AF;&#x7247;&#x7269;&#x7406;&#x4E0A;&#x4F38;&#x51FA;&#x7684;&#x91D1;&#x5C5E;&#x201C;&#x9488;&#x811A;&#x201D;&#xFF0C;&#x662F;&#x4E0E;&#x5916;&#x90E8;&#x7535;&#x8DEF;&#x8FDB;&#x884C;&#x7535;&#x6C14;&#x8FDE;&#x63A5;&#x7684;&#x5B9E;&#x9645;&#x63A5;&#x53E3;&#x3002;&#x5B83;&#x662F;&#x7AEF;&#x53E3;&#x7684;&#x5177;&#x4F53;&#x6210;&#x5458;&#x3002;</li>
<li><strong>&#x547D;&#x540D;</strong>&#xFF1A;&#x7531;&#x201C;<strong>&#x7AEF;&#x53E3;&#x5B57;&#x6BCD; + &#x5F15;&#x811A;&#x7F16;&#x53F7;</strong>&#x201D;&#x7EC4;&#x6210;&#x3002;&#x4F8B;&#x5982;&#xFF1A;
<ul>
<li><strong>PA1</strong>&#xFF1A;&#x8868;&#x793A; <strong>GPIOA&#x7AEF;&#x53E3;</strong> &#x7684; <strong>&#x7B2C;1&#x53F7;&#x5F15;&#x811A;</strong>&#x3002;</li>
<li><strong>PC13</strong>&#xFF1A;&#x8868;&#x793A; <strong>GPIOC&#x7AEF;&#x53E3;</strong> &#x7684; <strong>&#x7B2C;13&#x53F7;&#x5F15;&#x811A;</strong>&#x3002;</li>
</ul>
</li>
</ul>
<h2 id="%E7%94%B5%E8%B7%AF%E7%BB%93%E6%9E%84">&#x7535;&#x8DEF;&#x7ED3;&#x6784;</h2>
<p><img src="https://image.7-0.cc/images/2026/02/03/v2-f66e43589fcf5b5a4e1dbb8b124d3a2c_1440w.png" alt="STM32-GPIO" loading="lazy"></p>
<hr>
<h2 id="%E5%BC%95%E8%84%9A%E6%A8%A1%E5%BC%8F">&#x5F15;&#x811A;&#x6A21;&#x5F0F;</h2>
<h3 id="%E8%BE%93%E5%85%A5%E6%A8%A1%E5%BC%8F">&#x8F93;&#x5165;&#x6A21;&#x5F0F;</h3>
<h4 id="1%E6%B5%AE%E7%A9%BA%E8%BE%93%E5%85%A5">1.&#x6D6E;&#x7A7A;&#x8F93;&#x5165;</h4>
<ul>
<li>
<p><strong>Floating Input / Input floating</strong></p>
</li>
<li>
<p>&#x7EAF;&#x7CB9;&#x7684;<strong>&#x6570;&#x5B57;&#x8F93;&#x5165;</strong>&#x3002;&#x5F15;&#x811A;&#x7535;&#x5E73;&#x5B8C;&#x5168;&#x7531;&#x5916;&#x90E8;&#x7535;&#x8DEF;&#x51B3;&#x5B9A;&#x3002;</p>
</li>
<li>
<p>&#x5185;&#x90E8;&#x65E2;&#x4E0D;&#x4E0A;&#x62C9;&#x4E5F;&#x4E0D;&#x4E0B;&#x62C9;&#x3002;&#x5982;&#x679C;&#x5916;&#x90E8;&#x60AC;&#x7A7A;&#xFF0C;&#x5F15;&#x811A;&#x7535;&#x5E73;&#x5C06;&#x662F;<strong>&#x4E0D;&#x786E;&#x5B9A;&#x7684;</strong>&#xFF0C;&#x6781;&#x6613;&#x53D7;&#x7535;&#x78C1;&#x5E72;&#x6270;&#x5F71;&#x54CD;&#x800C;&#x7FFB;&#x8F6C;&#x3002;</p>
</li>
<li>
<p>&#x65BD;&#x5BC6;&#x7279;&#x89E6;&#x53D1;&#x5668;&#x5F00;&#x542F;&#x3002;</p>
</li>
<li>
<p><strong>&#x5178;&#x578B;&#x5E94;&#x7528;&#xFF1A;</strong> &#x8FDE;&#x63A5;&#x5916;&#x90E8;&#x5DF2;&#x6709;&#x786E;&#x5B9A;&#x9A71;&#x52A8;&#x80FD;&#x529B;&#x7684;&#x4FE1;&#x53F7;&#xFF0C;&#x5982;&#x53E6;&#x4E00;&#x4E2A;MCU&#x7684;&#x63A8;&#x633D;&#x8F93;&#x51FA;&#x3001;&#x901A;&#x4FE1;&#x603B;&#x7EBF;&#x4E2D;&#x4E3B;&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x7684;&#x4FE1;&#x53F7;&#x7EBF;&#xFF08;&#x5982;UART_RX&#xFF0C;&#x5F53;&#x5916;&#x90E8;&#x6709;&#x4E0A;&#x62C9;&#x65F6;&#xFF09;&#x3002;</p>
</li>
</ul>
<h4 id="2%E4%B8%8A%E6%8B%89%E8%BE%93%E5%85%A5">2.&#x4E0A;&#x62C9;&#x8F93;&#x5165;</h4>
<ul>
<li>
<p><strong>Input pull-up</strong></p>
</li>
<li>
<p>&#x6570;&#x5B57;&#x8F93;&#x5165;&#xFF0C;&#x5185;&#x90E8;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x7EA6;40k&#x3A9;&#x7684;&#x7535;&#x963B;&#x8FDE;&#x63A5;&#x5230;VDD&#x3002;</p>
</li>
<li>
<p>&#x5F53;&#x5916;&#x90E8;&#x65E0;&#x9A71;&#x52A8;&#x65F6;&#xFF0C;&#x5F15;&#x811A;&#x88AB;<strong>&#x9ED8;&#x8BA4;&#x62C9;&#x81F3;&#x9AD8;&#x7535;&#x5E73;</strong>&#x3002;</p>
</li>
<li>
<p>&#x9700;&#x8981;&#x8BFB;&#x53D6;&#x4F4E;&#x7535;&#x5E73;&#x65F6;&#xFF0C;&#x5916;&#x90E8;&#x7535;&#x8DEF;&#x9700;&#x63D0;&#x4F9B;&#x8DB3;&#x591F;&#x7684;&#x201C;&#x704C;&#x7535;&#x6D41;&#x201D;&#x5C06;&#x7535;&#x5E73;&#x62C9;&#x4F4E;&#x3002;</p>
</li>
<li>
<p><strong>&#x5178;&#x578B;&#x5E94;&#x7528;&#xFF1A;</strong> &#x6309;&#x952E;&#x3001;&#x5F00;&#x5173;&#xFF0C;&#x4E00;&#x7AEF;&#x63A5;&#x5730;&#xFF0C;&#x6309;&#x4E0B;&#x65F6;&#x5F15;&#x811A;&#x88AB;&#x62C9;&#x4F4E;&#x3002;&#x7A7A;&#x95F2;&#x65F6;&#x56E0;&#x4E0A;&#x62C9;&#x800C;&#x4FDD;&#x6301;&#x9AD8;&#x7535;&#x5E73;&#x3002;</p>
</li>
</ul>
<h4 id="3%E4%B8%8B%E6%8B%89%E8%BE%93%E5%85%A5">3.&#x4E0B;&#x62C9;&#x8F93;&#x5165;</h4>
<ul>
<li><strong>Input pull-down</strong></li>
<li>&#x6570;&#x5B57;&#x8F93;&#x5165;&#xFF0C;&#x5185;&#x90E8;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x7EA6;40k&#x3A9;&#x7684;&#x7535;&#x963B;&#x8FDE;&#x63A5;&#x5230;VSS&#x3002;</li>
<li>&#x5F53;&#x5916;&#x90E8;&#x65E0;&#x9A71;&#x52A8;&#x65F6;&#xFF0C;&#x5F15;&#x811A;&#x88AB;<strong>&#x9ED8;&#x8BA4;&#x62C9;&#x81F3;&#x4F4E;&#x7535;&#x5E73;</strong>&#x3002;</li>
<li>&#x9700;&#x8981;&#x8BFB;&#x53D6;&#x9AD8;&#x7535;&#x5E73;&#x65F6;&#xFF0C;&#x5916;&#x90E8;&#x7535;&#x8DEF;&#x9700;&#x63D0;&#x4F9B;&#x8DB3;&#x591F;&#x7684;&#x201C;&#x62C9;&#x7535;&#x6D41;&#x201D;&#x5C06;&#x7535;&#x5E73;&#x62C9;&#x9AD8;&#x3002;</li>
<li><strong>&#x5178;&#x578B;&#x5E94;&#x7528;&#xFF1A;</strong> &#x6309;&#x952E;&#x3001;&#x5F00;&#x5173;&#xFF0C;&#x4E00;&#x7AEF;&#x63A5;VCC&#xFF0C;&#x6309;&#x4E0B;&#x65F6;&#x5F15;&#x811A;&#x88AB;&#x62C9;&#x9AD8;&#x3002;&#x7A7A;&#x95F2;&#x65F6;&#x56E0;&#x4E0B;&#x62C9;&#x800C;&#x4FDD;&#x6301;&#x4F4E;&#x7535;&#x5E73;&#x3002;</li>
</ul>
<h4 id="4%E6%A8%A1%E6%8B%9F%E8%BE%93%E5%85%A5">4.&#x6A21;&#x62DF;&#x8F93;&#x5165;</h4>
<ul>
<li><strong>Analog Mode</strong></li>
<li>&#x5F15;&#x811A;&#x4F5C;&#x4E3A;<strong>ADC&#xFF08;&#x6A21;&#x6570;&#x8F6C;&#x6362;&#x5668;&#xFF09;</strong> &#x6216;<strong>DAC&#xFF08;&#x6570;&#x6A21;&#x8F6C;&#x6362;&#x5668;&#xFF09;</strong> &#x7684;&#x901A;&#x9053;&#x3002;</li>
<li><strong>&#x6570;&#x5B57;&#x529F;&#x80FD;&#x88AB;&#x5B8C;&#x5168;&#x7981;&#x7528;</strong>&#x3002;&#x65BD;&#x5BC6;&#x7279;&#x89E6;&#x53D1;&#x5668;&#x5173;&#x95ED;&#xFF0C;&#x4E0A;&#x4E0B;&#x62C9;&#x7535;&#x963B;&#x65AD;&#x5F00;&#x3002;&#x5F15;&#x811A;&#x4E0A;&#x7684;&#x7535;&#x538B;&#x88AB;&#x76F4;&#x63A5;&#x9001;&#x81F3;&#x6A21;&#x62DF;&#x5916;&#x8BBE;&#x3002;</li>
<li><strong>&#x529F;&#x8017;&#x6700;&#x4F4E;</strong>&#x7684;&#x8F93;&#x5165;&#x6A21;&#x5F0F;&#xFF0C;&#x56E0;&#x4E3A;&#x6570;&#x5B57;&#x8F93;&#x5165;&#x7535;&#x8DEF;&#x4E0D;&#x5DE5;&#x4F5C;&#x3002;</li>
<li><strong>&#x5178;&#x578B;&#x5E94;&#x7528;&#xFF1A;</strong> &#x8FDE;&#x63A5;&#x6E29;&#x5EA6;&#x4F20;&#x611F;&#x5668;&#x3001;&#x7535;&#x4F4D;&#x5668;&#x3001;&#x9EA6;&#x514B;&#x98CE;&#x7B49;&#x6A21;&#x62DF;&#x4FE1;&#x53F7;&#x6E90;&#x3002;</li>
</ul>
<h3 id="%E8%BE%93%E5%87%BA%E6%A8%A1%E5%BC%8F">&#x8F93;&#x51FA;&#x6A21;&#x5F0F;</h3>
<h4 id="1%E9%80%9A%E7%94%A8%E6%8E%A8%E6%8C%BD%E8%BE%93%E5%87%BA">1.&#x901A;&#x7528;&#x63A8;&#x633D;&#x8F93;&#x51FA;</h4>
<ul>
<li><strong>General-purpose output push-pull</strong></li>
<li><strong>&#x6700;&#x5E38;&#x7528;&#x7684;&#x8F93;&#x51FA;&#x6A21;&#x5F0F;</strong>&#x3002;MCU&#x53EF;&#x4EE5;<strong>&#x4E3B;&#x52A8;&#x9A71;&#x52A8;</strong>&#x5F15;&#x811A;&#x4E3A;&#x9AD8;&#x7535;&#x5E73;&#xFF08;&#x901A;&#x8FC7;P-MOS&#x7BA1;&#x8FDE;&#x63A5;VDD&#xFF09;&#x6216;&#x4F4E;&#x7535;&#x5E73;&#xFF08;&#x901A;&#x8FC7;N-MOS&#x7BA1;&#x8FDE;&#x63A5;VSS&#xFF09;&#x3002;</li>
<li>&#x8F93;&#x51FA;&#x80FD;&#x529B;&#x5F3A;&#xFF08;STM32&#x901A;&#x5E38;&#x5355;&#x5F15;&#x811A;&#x6700;&#x5927;&#xB1;20mA&#xFF0C;&#x5177;&#x4F53;&#x770B;&#x6570;&#x636E;&#x624B;&#x518C;&#xFF09;&#xFF0C;&#x9AD8;&#x4F4E;&#x7535;&#x5E73;&#x7531;MCU&#x7684;VDD&#x548C;VSS&#x51B3;&#x5B9A;&#x3002;</li>
<li>&#x4E24;&#x4E2A;MOS&#x7BA1;&#x50CF;&#x201C;&#x63A8;&#x201D;&#x548C;&#x201C;&#x633D;&#x201D;&#x4E00;&#x6837;&#x4EA4;&#x66FF;&#x5DE5;&#x4F5C;&#xFF0C;&#x56E0;&#x6B64;&#x5F97;&#x540D;&#x3002;</li>
<li><strong>&#x5178;&#x578B;&#x5E94;&#x7528;&#xFF1A;</strong> &#x9A71;&#x52A8;LED&#x3001;&#x7EE7;&#x7535;&#x5668;&#x3001;&#x8702;&#x9E23;&#x5668;&#x3001;&#x7535;&#x5E73;&#x63A7;&#x5236;&#x7B49;&#x7EDD;&#x5927;&#x591A;&#x6570;&#x9700;&#x8981;&#x6570;&#x5B57;&#x8F93;&#x51FA;&#x7684;&#x573A;&#x666F;&#x3002;</li>
</ul>
<h4 id="2%E9%80%9A%E7%94%A8%E5%BC%80%E6%BC%8F%E8%BE%93%E5%87%BA">2.&#x901A;&#x7528;&#x5F00;&#x6F0F;&#x8F93;&#x51FA;</h4>
<ul>
<li><strong>General-purpose output open-drain</strong></li>
<li><strong>&#x53EA;&#x80FD;&#x4E3B;&#x52A8;&#x62C9;&#x4F4E;</strong>&#xFF08;N-MOS&#x7BA1;&#x5DE5;&#x4F5C;&#xFF09;&#xFF0C;<strong>&#x4E0D;&#x80FD;&#x4E3B;&#x52A8;&#x62C9;&#x9AD8;</strong>&#xFF08;P-MOS&#x7BA1;&#x88AB;&#x7981;&#x7528;&#xFF09;&#x3002;&#x9AD8;&#x7535;&#x5E73;&#x72B6;&#x6001;&#x9700;&#x8981;<strong>&#x4F9D;&#x8D56;&#x5916;&#x90E8;&#x4E0A;&#x62C9;&#x7535;&#x963B;</strong>&#x8FDE;&#x63A5;&#x5230;&#x6B63;&#x7535;&#x6E90;&#x3002;</li>
<li>&#x4F18;&#x70B9;1&#xFF1A;<strong>&#x7535;&#x5E73;&#x8F6C;&#x6362;</strong>&#x3002;&#x5916;&#x90E8;&#x4E0A;&#x62C9;&#x7535;&#x963B;&#x53EF;&#x4EE5;&#x63A5;&#x5230;&#x4E00;&#x4E2A;&#x4E0D;&#x540C;&#x4E8E;MCU VDD&#x7684;&#x7535;&#x538B;&#x4E0A;&#xFF08;&#x5982;5V&#xFF09;&#xFF0C;&#x5B9E;&#x73B0;&#x4E0E;&#x4E0D;&#x540C;&#x7535;&#x538B;&#x5668;&#x4EF6;&#x7684;&#x901A;&#x4FE1;&#x3002;</li>
<li>&#x4F18;&#x70B9;2&#xFF1A;<strong>&#x201C;&#x7EBF;&#x4E0E;&#x201D;&#x529F;&#x80FD;</strong>&#x3002;&#x591A;&#x4E2A;&#x5F00;&#x6F0F;&#x8F93;&#x51FA;&#x7684;&#x5F15;&#x811A;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8FDE;&#x5728;&#x4E00;&#x8D77;&#xFF0C;&#x53EA;&#x8981;&#x6709;&#x4E00;&#x4E2A;&#x62C9;&#x4F4E;&#xFF0C;&#x603B;&#x7EBF;&#x5373;&#x4E3A;&#x4F4E;&#xFF1B;&#x6240;&#x6709;&#x90FD;&#x91CA;&#x653E;&#xFF0C;&#x603B;&#x7EBF;&#x624D;&#x88AB;&#x4E0A;&#x62C9;&#x4E3A;&#x9AD8;&#x3002;&#x8FD9;&#x662F;I&#xB2;C&#x603B;&#x7EBF;&#x7684;&#x57FA;&#x7840;&#x3002;</li>
<li>&#x7F3A;&#x70B9;&#xFF1A;&#x9A71;&#x52A8;&#x9AD8;&#x7535;&#x5E73;&#x65F6;&#xFF0C;&#x7535;&#x6D41;&#x7531;&#x5916;&#x90E8;&#x4E0A;&#x62C9;&#x7535;&#x963B;&#x63D0;&#x4F9B;&#xFF0C;&#x56E0;&#x6B64;<strong>&#x4E0A;&#x5347;&#x6CBF;&#x901F;&#x5EA6;&#x8F83;&#x6162;</strong>&#xFF08;RC&#x5145;&#x7535;&#xFF09;&#x3002;</li>
<li><strong>&#x5178;&#x578B;&#x5E94;&#x7528;&#xFF1A;</strong> I&#xB2;C&#x3001;SMBUS&#x603B;&#x7EBF;&#xFF0C;&#x9A71;&#x52A8;&#x9AD8;&#x4E8E;MCU&#x7535;&#x538B;&#x7684;&#x5668;&#x4EF6;&#xFF0C;&#x9700;&#x8981;&#x201C;&#x7EBF;&#x4E0E;&#x201D;&#x903B;&#x8F91;&#x7684;&#x573A;&#x666F;&#x3002;</li>
</ul>
<h4 id="3%E5%A4%8D%E7%94%A8%E5%8A%9F%E8%83%BD%E6%8E%A8%E6%8C%BD%E8%BE%93%E5%87%BA">3.&#x590D;&#x7528;&#x529F;&#x80FD;&#x63A8;&#x633D;&#x8F93;&#x51FA;</h4>
<ul>
<li><strong>Alternate function output push-pull</strong></li>
<li>&#x5F15;&#x811A;&#x7684;&#x63A7;&#x5236;&#x6743;&#x4EA4;&#x7ED9;<strong>&#x7247;&#x4E0A;&#x5916;&#x8BBE;</strong>&#xFF08;&#x5982;SPI&#x3001;USART&#x3001;TIM&#x7B49;&#xFF09;&#xFF0C;&#x800C;&#x975E;CPU&#x6216;GPIO&#x5BC4;&#x5B58;&#x5668;&#x3002;<strong>&#x8F93;&#x51FA;&#x7279;&#x6027;&#x4E0E;&#x901A;&#x7528;&#x63A8;&#x633D;&#x5B8C;&#x5168;&#x76F8;&#x540C;</strong>&#x3002;</li>
<li>&#x4F8B;&#x5982;&#xFF0C;&#x914D;&#x7F6E;UART_TX&#x5F15;&#x811A;&#x4E3A;&#x6B64;&#x6A21;&#x5F0F;&#xFF0C;&#x6570;&#x636E;&#x5C06;&#x7531;USART&#x5916;&#x8BBE;&#x81EA;&#x52A8;&#x4EA7;&#x751F;&#x5E76;&#x8F93;&#x51FA;&#x3002;</li>
<li><strong>&#x5178;&#x578B;&#x5E94;&#x7528;&#xFF1A;</strong> &#x6240;&#x6709;&#x9700;&#x8981;<strong>&#x7531;&#x786C;&#x4EF6;&#x5916;&#x8BBE;&#x9A71;&#x52A8;</strong>&#x7684;<strong>&#x8F93;&#x51FA;</strong>&#x529F;&#x80FD;&#xFF1A;<code>SPI_SCK/MOSI</code>&#x3001;<code>UART_TX</code>&#x3001;<code>I2S_WS/CK</code>&#x3001;<code>TIM_PWM</code>&#x8F93;&#x51FA;&#x7B49;&#x3002;</li>
</ul>
<h4 id="4%E5%A4%8D%E7%94%A8%E5%8A%9F%E8%83%BD%E5%BC%80%E6%BC%8F%E8%BE%93%E5%87%BA">4.&#x590D;&#x7528;&#x529F;&#x80FD;&#x5F00;&#x6F0F;&#x8F93;&#x51FA;</h4>
<ul>
<li><strong>Alternate function output open-drain</strong></li>
<li>&#x5F15;&#x811A;&#x7684;&#x63A7;&#x5236;&#x6743;&#x4EA4;&#x7ED9;<strong>&#x7247;&#x4E0A;&#x5916;&#x8BBE;</strong>&#xFF0C;<strong>&#x8F93;&#x51FA;&#x7279;&#x6027;&#x4E0E;&#x901A;&#x7528;&#x5F00;&#x6F0F;&#x5B8C;&#x5168;&#x76F8;&#x540C;</strong>&#x3002;</li>
<li><strong>&#x5178;&#x578B;&#x5E94;&#x7528;&#xFF1A;</strong> &#x9700;&#x8981;&#x5F00;&#x6F0F;&#x7279;&#x6027;&#x7684;&#x786C;&#x4EF6;&#x5916;&#x8BBE;&#x8F93;&#x51FA;&#xFF0C;&#x6700;&#x7ECF;&#x5178;&#x7684;&#x5C31;&#x662F; <strong>I&#xB2;C &#x7684; SDA &#x548C; SCL &#x7EBF;</strong>&#x3002;I&#xB2;C&#x5916;&#x8BBE;&#x4F1A;&#x81EA;&#x52A8;&#x7BA1;&#x7406;&#x5F00;&#x6F0F;&#x8F93;&#x51FA;&#x548C;&#x8F93;&#x5165;&#x68C0;&#x6D4B;&#x3002;</li>
</ul>
<h3 id="%E8%BE%93%E5%87%BA%E9%80%9F%E5%BA%A6%E9%85%8D%E7%BD%AE">&#x8F93;&#x51FA;&#x901F;&#x5EA6;&#x914D;&#x7F6E;</h3>
<p>&#x5728;&#x914D;&#x7F6E;&#x8F93;&#x51FA;&#x6A21;&#x5F0F;&#xFF08;&#x63A8;&#x633D;/&#x5F00;&#x6F0F;&#xFF0C;&#x901A;&#x7528;/&#x590D;&#x7528;&#xFF09;&#x65F6;&#xFF0C;<code>MODEx</code>&#x4F4D;&#x8FD8;&#x7528;&#x4E8E;&#x9009;&#x62E9;<strong>&#x8F93;&#x51FA;&#x901F;&#x5EA6;</strong>&#xFF0C;&#x8FD9;&#x5BF9;&#x4E8E;&#x4FE1;&#x53F7;&#x5B8C;&#x6574;&#x6027;&#x548C;EMI&#x81F3;&#x5173;&#x91CD;&#x8981;&#x3002;</p>
<ul>
<li><strong>2 MHz&#xFF08;&#x4F4E;&#x901F;&#xFF09;&#xFF1A;</strong> &#x7528;&#x4E8E;&#x4F4E;&#x901F;&#x4FE1;&#x53F7;&#xFF0C;&#x529F;&#x8017;&#x548C;&#x566A;&#x58F0;&#x4F4E;&#x3002;</li>
<li><strong>10 MHz&#xFF08;&#x4E2D;&#x901F;&#xFF09;&#xFF1A;</strong> &#x5E38;&#x7528;&#x5E73;&#x8861;&#x9009;&#x62E9;&#x3002;</li>
<li><strong>50 MHz&#xFF08;&#x9AD8;&#x901F;&#xFF09;&#xFF1A;</strong> &#x7528;&#x4E8E;&#x9AD8;&#x901F;&#x4FE1;&#x53F7;&#xFF08;&#x5982;<code>SPI</code>&#x3001;<code>USB</code>&#xFF09;&#xFF0C;&#x4F46;&#x9700;&#x6CE8;&#x610F;&#x8FC7;&#x51B2;&#x548C;&#x632F;&#x94C3;&#x3002;</li>
<li><strong>&#xFF08;&#x65B0;&#x4E00;&#x4EE3;STM32&#x6709;&#x66F4;&#x9AD8;&#x901F;&#x5EA6;&#x9009;&#x9879;&#xFF0C;&#x5982;Very High&#xFF09;</strong></li>
</ul>
<hr>
<h2 id="gpio-%E7%9B%B8%E5%85%B3%E5%AF%84%E5%AD%98%E5%99%A8">GPIO &#x76F8;&#x5173;&#x5BC4;&#x5B58;&#x5668;</h2>
<p>STM32 &#x7684; <code>GPIO</code> &#x5206;&#x6210;&#x4E86;&#x591A;&#x7EC4;&#x7AEF;&#x53E3;&#xFF0C;&#x7AEF;&#x53E3;&#x6240;&#x542B;&#x5F15;&#x811A;&#x7684;&#x5DE5;&#x4F5C;&#x6A21;&#x5F0F;&#x901A;&#x8FC7;&#x591A;&#x4E2A;&#x5BC4;&#x5B58;&#x5668;&#xFF08;&#x7AEF;&#x53E3;&#x5BC4;&#x5B58;&#x5668;&#x7EC4;&#xFF09;&#x6765;&#x8FDB;&#x884C;&#x914D;&#x7F6E;&#xFF0C;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x7684;&#x5BF9;&#x5E94;&#x4F4D;&#x63A7;&#x5236;&#x8BE5;&#x7AEF;&#x53E3;&#x4E2D;&#x5BF9;&#x5E94;&#x7684;&#x5F15;&#x811A;&#x3002;</p>
<p>&#x6BD4;&#x5982; STM32F411 &#x5206;&#x6210;&#x4E86;5&#x7EC4;&#x7AEF;&#x53E3;&#xFF1A;<code>GPIOA</code>&#x3001;<code>GPIOB</code>&#x3001;<code>GPIOC</code>&#x3001;<code>GPIOD</code> &#x548C; <code>GPIOH</code>&#x3002;&#x6BCF;&#x7EC4;&#x7AEF;&#x53E3;&#x7531;10&#x4E2A;32&#x4F4D;&#x7684;&#x5BC4;&#x5B58;&#x5668;&#x6765;&#x63A7;&#x5236;&#x3002;</p>
<p>&#x6CE8;&#x610F;:</p>
<ul>
<li>&#x5BC4;&#x5B58;&#x5668;&#x5E38;&#x91CF;&#x4E2D;&#x7684; <code>x</code> &#x4EE3;&#x8868;&#x5177;&#x4F53;&#x7684;&#x7AEF;&#x53E3;&#x53F7;, &#x5982; <code>GPIOA</code>&#x3001;<code>GPIOB</code> &#x7B49;&#x3002;</li>
<li>&#x5BC4;&#x5B58;&#x5668;&#x4E2D;<strong>&#x4F4E;&#x4F4D;</strong>&#x5BF9;&#x5E94;<strong>&#x4F4E;&#x5E8F;&#x53F7;&#x5F15;&#x811A;</strong>, &#x5982; <code>GPIOA_MODER</code> &#x4E2D; <code>0~1</code> &#x4F4D;&#x5BF9;&#x5E94; <code>PA0</code>, <code>30~31</code> &#x4F4D;&#x5BF9;&#x5E94; <code>PA15</code>&#x3002;</li>
</ul>
<h3 id="gpioxmoder%EF%BC%88%E6%A8%A1%E5%BC%8F%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%89">GPIOx_MODER&#xFF08;&#x6A21;&#x5F0F;&#x5BC4;&#x5B58;&#x5668;&#xFF09;</h3>
<p>&#x63A7;&#x5236;&#x5F15;&#x811A;&#x7684;&#x5DE5;&#x4F5C;&#x6A21;&#x5F0F;&#xFF0C;&#x6BCF;&#x4E2A;&#x5F15;&#x811A;&#x5360;2&#x4F4D;&#xFF1A;</p>
<ul>
<li><code>00</code>&#xFF1A;&#x8F93;&#x5165;&#x6A21;&#x5F0F;&#xFF08;&#x590D;&#x4F4D;&#x503C;&#xFF09;</li>
<li><code>01</code>&#xFF1A;&#x901A;&#x7528;&#x8F93;&#x51FA;&#x6A21;&#x5F0F;</li>
<li><code>10</code>&#xFF1A;&#x590D;&#x7528;&#x529F;&#x80FD;&#x6A21;&#x5F0F;</li>
<li><code>11</code>&#xFF1A;&#x6A21;&#x62DF;&#x6A21;&#x5F0F;&#xFF08;&#x7528;&#x4E8E;ADC/DAC&#xFF09;</li>
</ul>
<h3 id="gpioxotyper%EF%BC%88%E8%BE%93%E5%87%BA%E7%B1%BB%E5%9E%8B%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%89">GPIOx_OTYPER&#xFF08;&#x8F93;&#x51FA;&#x7C7B;&#x578B;&#x5BC4;&#x5B58;&#x5668;&#xFF09;</h3>
<p>&#x63A7;&#x5236;&#x8F93;&#x51FA;&#x7C7B;&#x578B;&#xFF08;&#x6BCF;&#x4E2A;&#x5F15;&#x811A;&#x5360;1&#x4F4D;&#xFF09;&#xFF1A;</p>
<ul>
<li><code>0</code>&#xFF1A;&#x63A8;&#x633D;&#x8F93;&#x51FA;&#xFF08;&#x590D;&#x4F4D;&#x503C;&#xFF09;</li>
<li><code>1</code>&#xFF1A;&#x5F00;&#x6F0F;&#x8F93;&#x51FA;</li>
</ul>
<h3 id="gpioxospeedr%EF%BC%88%E8%BE%93%E5%87%BA%E9%80%9F%E5%BA%A6%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%89">GPIOx_OSPEEDR&#xFF08;&#x8F93;&#x51FA;&#x901F;&#x5EA6;&#x5BC4;&#x5B58;&#x5668;&#xFF09;</h3>
<p>&#x63A7;&#x5236;&#x8F93;&#x51FA;&#x9A71;&#x52A8;&#x901F;&#x5EA6;&#xFF08;&#x6BCF;&#x4E2A;&#x5F15;&#x811A;&#x5360;2&#x4F4D;&#xFF09;&#xFF1A;</p>
<ul>
<li><code>00</code>&#xFF1A;&#x4F4E;&#x901F;&#xFF08;&#x590D;&#x4F4D;&#x503C;&#xFF09;</li>
<li><code>01</code>&#xFF1A;&#x4E2D;&#x901F;</li>
<li><code>10</code>&#xFF1A;&#x9AD8;&#x901F;</li>
<li><code>11</code>&#xFF1A;&#x8D85;&#x9AD8;&#x901F;&#xFF08;&#x5177;&#x4F53;&#x9891;&#x7387;&#x89C1;&#x82AF;&#x7247;&#x624B;&#x518C;&#xFF09;</li>
</ul>
<h3 id="gpioxpupdr%EF%BC%88%E4%B8%8A%E6%8B%89%E4%B8%8B%E6%8B%89%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%89">GPIOx_PUPDR&#xFF08;&#x4E0A;&#x62C9;/&#x4E0B;&#x62C9;&#x5BC4;&#x5B58;&#x5668;&#xFF09;</h3>
<p>(Pull-up Pull-down Register) &#x63A7;&#x5236;&#x5185;&#x90E8;&#x4E0A;&#x4E0B;&#x62C9;&#xFF08;&#x6BCF;&#x4E2A;&#x5F15;&#x811A;&#x5360;2&#x4F4D;&#xFF09;&#xFF1A;</p>
<ul>
<li><code>00</code>&#xFF1A;&#x65E0;&#x4E0A;&#x4E0B;&#x62C9;&#xFF08;&#x590D;&#x4F4D;&#x503C;&#xFF09;</li>
<li><code>01</code>&#xFF1A;&#x4E0A;&#x62C9;</li>
<li><code>10</code>&#xFF1A;&#x4E0B;&#x62C9;</li>
<li><code>11</code>&#xFF1A;&#x4FDD;&#x7559;</li>
</ul>
<h3 id="gpioxidr%EF%BC%88%E8%BE%93%E5%85%A5%E6%95%B0%E6%8D%AE%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%89">GPIOx_IDR&#xFF08;&#x8F93;&#x5165;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;&#xFF09;</h3>
<p>&#x8BFB;&#x53D6;&#x5F15;&#x811A;&#x8F93;&#x5165;&#x72B6;&#x6001;&#xFF08;&#x6BCF;&#x4E2A;&#x5F15;&#x811A;&#x5360;1&#x4F4D;, &#x9AD8;16&#x4F4D;&#x4FDD;&#x7559;, &#x53EA;&#x8BFB;&#xFF09;&#xFF1A;</p>
<ul>
<li><code>0</code>&#xFF1A;&#x4F4E;&#x7535;&#x5E73;</li>
<li><code>1</code>&#xFF1A;&#x9AD8;&#x7535;&#x5E73;</li>
</ul>
<h3 id="gpioxodr%EF%BC%88%E8%BE%93%E5%87%BA%E6%95%B0%E6%8D%AE%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%89">GPIOx_ODR&#xFF08;&#x8F93;&#x51FA;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;&#xFF09;</h3>
<p>&#x63A7;&#x5236;&#x5F15;&#x811A;&#x8F93;&#x51FA;&#x7535;&#x5E73;&#xFF08;&#x6BCF;&#x4E2A;&#x5F15;&#x811A;&#x5360;1&#x4F4D;, &#x9AD8;16&#x4F4D;&#x4FDD;&#x7559;&#xFF09;&#xFF1A;</p>
<ul>
<li><code>0</code>&#xFF1A;&#x8F93;&#x51FA;&#x4F4E;&#x7535;&#x5E73;</li>
<li><code>1</code>&#xFF1A;&#x8F93;&#x51FA;&#x9AD8;&#x7535;&#x5E73;</li>
</ul>
<h3 id="gpioxbsrr%EF%BC%88%E7%BD%AE%E4%BD%8D%E5%A4%8D%E4%BD%8D%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%89">GPIOx_BSRR&#xFF08;&#x7F6E;&#x4F4D;/&#x590D;&#x4F4D;&#x5BC4;&#x5B58;&#x5668;&#xFF09;</h3>
<p>(Bit Set Reset Register) &#x539F;&#x5B50;&#x64CD;&#x4F5C;&#x8BBE;&#x7F6E;/&#x6E05;&#x9664;&#x8F93;&#x51FA;&#x4F4D;&#xFF1A;</p>
<ul>
<li><code>BSy</code>&#xFF08;00-15&#x4F4D;&#xFF09;&#xFF1A;&#x8BBE;&#x7F6E;&#x5BF9;&#x5E94;&#x5F15;&#x811A;&#x4E3A;&#x9AD8;&#x7535;&#x5E73;&#xFF08;&#x5199;1&#x6709;&#x6548;&#xFF0C;&#x5199;0&#x65E0;&#x5F71;&#x54CD;&#xFF09;</li>
<li><code>BRy</code>&#xFF08;16-31&#x4F4D;&#xFF09;&#xFF1A;&#x8BBE;&#x7F6E;&#x5BF9;&#x5E94;&#x5F15;&#x811A;&#x4E3A;&#x4F4E;&#x7535;&#x5E73;&#xFF08;&#x5199;1&#x6709;&#x6548;&#xFF0C;&#x5199;0&#x65E0;&#x5F71;&#x54CD;&#xFF09;</li>
</ul>
<blockquote>
<p>&#x6CE8;&#x610F;:</p>
<p><code>GPIOx_ODR</code> &#x4E0E; <code>GPIOx_BSRR</code> &#x7684;&#x533A;&#x522B;&#x5728;&#x4E8E;, &#x8BBE;&#x7F6E;&#x67D0;&#x5F15;&#x811A;&#x7684;&#x8F93;&#x51FA;&#x7535;&#x5E73;, &#x524D;&#x8005;&#x9700;&#x8981; <code>&#x8BFB;-&gt;&#x6539;-&gt;&#x5199;</code> &#x540E;&#x8005;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5199;&#x3002;</p>
</blockquote>
<h3 id="gpioxlckr%EF%BC%88%E9%85%8D%E7%BD%AE%E9%94%81%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%89">GPIOx_LCKR&#xFF08;&#x914D;&#x7F6E;&#x9501;&#x5BC4;&#x5B58;&#x5668;&#xFF09;</h3>
<p>&#x9501;&#x5B9A;&#x5F15;&#x811A;&#x914D;&#x7F6E;&#xFF0C;&#x9632;&#x6B62;&#x610F;&#x5916;&#x4FEE;&#x6539;&#x3002;</p>
<h3 id="gpioxafrl%E5%92%8Cgpioxafrh%EF%BC%88%E5%A4%8D%E7%94%A8%E5%8A%9F%E8%83%BD%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%89">GPIOx_AFRL&#x548C;GPIOx_AFRH&#xFF08;&#x590D;&#x7528;&#x529F;&#x80FD;&#x5BC4;&#x5B58;&#x5668;&#xFF09;</h3>
<p>(Alternate Function Register Low/High) &#x9009;&#x62E9;&#x5F15;&#x811A;&#x7684;&#x590D;&#x7528;&#x529F;&#x80FD;&#xFF08;&#x6BCF;&#x4E2A;&#x5F15;&#x811A;&#x5360;4&#x4F4D;&#xFF09;&#xFF0C;AFRL&#x7528;&#x4E8E;&#x5F15;&#x811A;0-7&#xFF0C;AFRH&#x7528;&#x4E8E;&#x5F15;&#x811A;8-15&#x3002;</p>
<h2 id="%E9%80%9A%E8%BF%87%E5%AF%84%E5%AD%98%E5%99%A8%E7%9A%84%E7%BC%96%E7%A8%8B">&#x901A;&#x8FC7;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x7F16;&#x7A0B;</h2>
<p>&#x901A;&#x8FC7;&#x67E5;&#x9605;&#x82AF;&#x7247;&#x7684;&#x53C2;&#x8003;&#x624B;&#x518C;&#x53EF;&#x77E5;, GPIO &#x5404;&#x7AEF;&#x53E3;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x5728;<strong>&#x5185;&#x5B58;&#x5730;&#x5740;&#x7A7A;&#x95F4;</strong>&#x4E2D;&#x7684;&#x5177;&#x4F53;&#x5730;&#x5740;, &#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x901A;&#x8FC7;&#x6307;&#x9488;&#x8BBF;&#x95EE;&#x8FD9;&#x4E9B;&#x5BC4;&#x5B58;&#x5668;&#x3002;</p>
<pre><code class="language-c">#define GPIOA_MODER *(volatile unsigned int *)(0x40020000UL)

GPIOA_MODER = 0x00000003;       // &#x5411; GPIOA_MODER &#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x5199;&#x5165; 0x03 
unsigned int a = GPIOA_MODER;   // &#x8BFB;&#x53D6;GPIOA_MODER&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x5E76;&#x5B58;&#x5165;&#x53D8;&#x91CF;a
</code></pre>
<p>&#x53E6;&#x5916;&#x6211;&#x4EEC;&#x8FD8;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x9884;&#x5B9A;&#x4E49;&#x7684; C &#x7ED3;&#x6784;&#x4F53;&#x6307;&#x9488;&#x8BBF;&#x95EE;&#x5BC4;&#x5B58;&#x5668;, &#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x8981;&#x6BD4;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x5730;&#x5740;&#x53CB;&#x597D;&#x5F97;&#x591A;&#x3002;</p>
<pre><code class="language-c">// stm32f411xe.h
typedef struct
{
  __IO uint32_t MODER;   
  __IO uint32_t OTYPER;  
  __IO uint32_t OSPEEDR; 
  __IO uint32_t PUPDR;   
  __IO uint32_t IDR;     
  __IO uint32_t ODR;     
  __IO uint32_t BSRR;    
  __IO uint32_t LCKR;    
  __IO uint32_t AFRL;    
  __IO uint32_t AFRH;    
} GPIO_TypeDef;

#define GPIOA ((GPIO_TypeDef *)0x40020000UL)

GPIOA-&gt;MODER &amp;= ~(3&lt;&lt;(5*2));      // &#x6E05;&#x9664;&#x6A21;&#x5F0F;&#x5BC4;&#x5B58;&#x5668;&#x7684; bit11:bit10 &#x4E3A; 00 
                                  // - &#x64CD;&#x4F5C;&#x7684;&#x662F;&#x7B2C;5&#x4E2A;&#x5F15;&#x811A; (5)
                                  // - &#x6BCF;&#x4E2A;&#x5F15;&#x811A;&#x5360;2&#x4E2A;bit (*2)
                                  // - &#x6E05;&#x9664;2&#x4E2A;bit (3 &#x5373; 0b11)
GPIOA-&gt;MODER |=   1&lt;&lt;(5*2);       // &#x8BBE;&#x7F6E; bit11:bit10 = 01, &#x5F15;&#x811A;PA5&#x4E3A;&#x63A8;&#x633D;&#x8F93;&#x51FA;
GPIOA-&gt;BSRR   =   1&lt;&lt;5;           // &#x8BBE;&#x7F6E; bit5 &#x4E3A; 1&#xFF0C;PA5 &#x8F93;&#x51FA;&#x9AD8;&#x7535;&#x5E73;&#xFF0C;&#x5F00;&#x542F;LD2
GPIOA-&gt;BSRR   =   1&lt;(5+16);       // &#x8BBE;&#x7F6E; bit21 &#x4E3A;1&#xFF0C;PA5 &#x8F93;&#x51FA;&#x4F4E;&#x7535;&#x5E73;&#xFF0C;&#x5173;&#x95ED;LD2
</code></pre>
<h2 id="%E9%80%9A%E8%BF%87-hal-%E5%BA%93%E7%9A%84%E6%96%B9%E5%BC%8F%E7%BC%96%E7%A8%8B">&#x901A;&#x8FC7; HAL &#x5E93;&#x7684;&#x65B9;&#x5F0F;&#x7F16;&#x7A0B;</h2>
<pre><code class="language-c">// stm32f4xx_hal_gpio.h
typedef struct
{
  uint32_t Pin;         // &#x9009;&#x62E9;&#x9700;&#x8981;&#x914D;&#x7F6E;&#x7684;&#x5F15;&#x811A;
  uint32_t Mode;        // &#x8BBE;&#x7F6E;&#x6240;&#x9009;&#x5F15;&#x811A;&#x7684;&#x5DE5;&#x4F5C;&#x6A21;&#x5F0F;
  uint32_t Pull;        // &#x4F7F;&#x80FD;&#x6240;&#x9009;&#x5F15;&#x811A;&#x7684;&#x4E0A;&#x62C9;/&#x4E0B;&#x62C9;&#x7535;&#x963B;
  uint32_t Speed;       // &#x8BBE;&#x7F6E;&#x6240;&#x9009;&#x5F15;&#x811A;&#x7684;&#x8F93;&#x51FA;&#x901F;&#x5EA6;
  uint32_t Alternate;   // &#x8BBE;&#x7F6E;&#x5F15;&#x811A;&#x7684;&#x590D;&#x7528;&#x529F;&#x80FD;
} GPIO_InitTypeDef;

typedef enum
{
  GPIO_PIN_RESET = 0u,  // &#x5F15;&#x811A;&#x4F4E;&#x7535;&#x5E73;
  GPIO_PIN_SET          // &#x5F15;&#x811A;&#x9AD8;&#x7535;&#x5E73;
} GPIO_PinState;

#define GPIO_PIN_0                 ((uint16_t)0x0001)  /* Pin 0 selected    */
                                                       /* ..............    */
#define GPIO_PIN_15                ((uint16_t)0x8000)  /* Pin 15 selected   */
#define GPIO_PIN_All               ((uint16_t)0xFFFF)  /* All pins selected */

#define GPIO_PIN_MASK              0x0000FFFFu /* PIN mask for assert test */

// &#x914D;&#x7F6E;&#x5F15;&#x811A; PA5&#x548C; PA15:&#x63A8;&#x633D;&#x8F93;&#x51FA;&#xFF0C;&#x65E0;&#x4E0A;&#x62C9;/&#x4E0B;&#x62C9;&#xFF0C;&#x8F93;&#x51FA;&#x901F;&#x5EA6;&#x4E3A;&#x4F4E;&#x901F;
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin   = GPIO_PIN_5 | GPIO_PIN_15;
GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull  = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &amp;GPIO_InitStruct);

// PA15 &#x5F15;&#x811A;&#x8BBE;&#x7F6E;&#x4E3A;&#x4F4E;&#x7535;&#x5E73;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
</code></pre>
<h2 id="%E5%8F%82%E8%80%83">&#x53C2;&#x8003;</h2>
<ul>
<li><a href="https://zhuanlan.zhihu.com/p/661515170?ref=7-0.cc">STM32 GPIO &#x5F15;&#x811A;&#x6A21;&#x5F0F;</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[STM32 基础]]></title><description><![CDATA[读书笔记]]></description><link>https://www.7-0.cc/stm32-base/</link><guid isPermaLink="false">69b413a8b1f19d0001c3e177</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Sat, 24 Jan 2026 14:50:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: STM32<br>
@@ Date: 2026-01-24 2250<br>
@@ Note: ~</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/STM32?ref=7-0.cc">STM32 &#x7EF4;&#x57FA;&#x767E;&#x79D1;</a></li>
</ul>
<h2 id="%E7%AE%80%E4%BB%8B">&#x7B80;&#x4ECB;</h2>
<p>STM32 &#x662F;<strong>&#x610F;&#x6CD5;&#x534A;&#x5BFC;&#x4F53;&#xFF08;STMicroelectronics&#xFF09;&#x516C;&#x53F8;</strong>&#x57FA;&#x4E8E; <strong>ARM Cortex-M</strong> &#x5185;&#x6838;&#x5F00;&#x53D1;&#x7684;<strong>32&#x4F4D;&#x9AD8;&#x6027;&#x80FD;&#x5FAE;&#x63A7;&#x5236;&#x5668;</strong>&#x7CFB;&#x5217;&#x3002;&#x5B83;&#x662F;&#x5168;&#x7403;&#x6700;&#x53D7;&#x6B22;&#x8FCE;&#x3001;&#x751F;&#x6001;&#x6700;&#x4E30;&#x5BCC;&#x7684;MCU&#x5BB6;&#x65CF;&#x4E4B;&#x4E00;&#x3002;</p>
<p>STM32 &#x5FAE;&#x63A7;&#x5236;&#x5668;&#x5206;&#x4E3A;&#x591A;&#x4E2A;&#x7CFB;&#x5217;&#xFF0C;&#x8FD9;&#x4E9B;&#x7CFB;&#x5217;&#x90FD;&#x57FA;&#x4E8E;&#x76F8;&#x540C;&#x7684;32 &#x4F4D;ARM&#x5904;&#x7406;&#x5668;&#x5185;&#x6838;&#xFF1A;Cortex-M0&#x3001;M0+&#x3001;M3&#x3001;M4 M7&#x3001;M33&#x3001;M55 &#x6216; M85&#x3002;&#x6BCF;&#x4E2A;&#x5FAE;&#x63A7;&#x5236;&#x5668;&#x7684;&#x5185;&#x90E8;&#x7ED3;&#x6784;&#x90FD;&#x5305;&#x542B;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A; ARM &#x5904;&#x7406;&#x5668;&#x5185;&#x6838;&#x3001;&#x95EA;&#x5B58;&#x3001;&#x9759;&#x6001;RAM&#x3001;&#x8C03;&#x8BD5;&#x63A5;&#x53E3;&#x4EE5;&#x53CA;&#x5404;&#x79CD;&#x5916;&#x8BBE;&#x3002;</p>
<ul>
<li>2006&#x5E74;10&#x6708; ST &#x83B7;&#x5F97;&#x4E86;ARM Cortex-M3&#x5185;&#x6838;&#x7684;&#x6388;&#x6743;&#x3002;</li>
<li>2007&#x5E74;06&#x6708; ST &#x5728;&#x5317;&#x4EAC;&#x53D1;&#x5E03;&#x4E86;&#x57FA;&#x4E8E; ARM Cortex-M3 &#x7684; STM32 F1 &#x7CFB;&#x5217;&#x82AF;&#x7247;&#x3002;</li>
<li>2026&#x5E74;01&#x6708; STM32 &#x81EA;2007&#x5E74;&#x53D1;&#x5E03;&#x4EE5;&#x6765;&#xFF0C;&#x51FA;&#x8D27;&#x91CF;&#x8D85;&#x8FC7;&#x4E86; 150 &#x4EBF;&#x9897;&#x3002;</li>
</ul>
<h2 id="%E9%83%A8%E5%88%86%E8%8A%AF%E7%89%87%E4%BB%8B%E7%BB%8D">&#x90E8;&#x5206;&#x82AF;&#x7247;&#x4ECB;&#x7ECD;</h2>
<p>TODO &#x547D;&#x540D;</p>
<h3 id="stm32f103c8t6">STM32F103C8T6</h3>
<ul>
<li>&#x91C7;&#x7528; <strong>ARM Cortex-M3</strong> &#x5185;&#x6838;&#xFF0C;&#x4E3B;&#x9891;<strong>72MHz</strong>&#xFF0C;&#x62E5;&#x6709; <strong>64KB Flash</strong>&#xFF08;&#x5B58;&#x50A8;&#x7A0B;&#x5E8F;&#xFF09;&#x548C; <strong>20KB RAM</strong>&#xFF08;&#x8FD0;&#x884C;&#x65F6;&#x5185;&#x5B58;&#xFF09;&#xFF0C;&#x6027;&#x80FD;&#x8DB3;&#x4EE5;&#x5E94;&#x5BF9;&#x591A;&#x6570;&#x4E2D;&#x5C0F;&#x578B;&#x5D4C;&#x5165;&#x5F0F;&#x9879;&#x76EE;&#x3002;</li>
<li>&#x591A;&#x8FBE; <strong>37&#x4E2A;</strong>&#x53EF;&#x7528;GPIO&#xFF0C;&#x96C6;&#x6210;<strong>3&#x4E2A;USART</strong>&#x3001;<strong>2&#x4E2A;SPI</strong>&#x3001;<strong>2&#x4E2A;I2C</strong>&#x3001;<strong>1&#x4E2A;USB</strong>&#x548C;<strong>1&#x4E2A;CAN</strong>&#x603B;&#x7EBF;&#xFF0C;&#x65B9;&#x4FBF;&#x8FDE;&#x63A5;&#x5404;&#x7C7B;&#x6A21;&#x5757;&#x3002;</li>
<li>&#x5185;&#x7F6E;2&#x4E2A;<strong>12&#x4F4D;ADC</strong>&#xFF0C;&#x53EF;&#x7528;&#x4E8E;&#x91C7;&#x96C6;&#x4F20;&#x611F;&#x5668;&#x6570;&#x636E;&#x3002;</li>
<li>&#x591A;&#x4E2A;&#x5B9A;&#x65F6;&#x5668;&#xFF0C;&#x652F;&#x6301;PWM&#x8F93;&#x51FA;&#xFF0C;&#x975E;&#x5E38;&#x9002;&#x5408;&#x63A7;&#x5236;&#x7535;&#x673A;&#x3001;&#x8235;&#x673A;&#x7B49;&#x3002;</li>
</ul>
<p><strong>USB&#x8F6C;&#x4E32;&#x53E3;&#x6A21;&#x5757;</strong>&#xFF1A;&#x7528;&#x4E8E;&#x4E32;&#x53E3;&#x901A;&#x4FE1;&#x548C;&#x6253;&#x5370;&#x8C03;&#x8BD5;&#x4FE1;&#x606F;&#xFF08;&#x5F88;&#x591A;&#x6838;&#x5FC3;&#x677F;&#x7684;USB&#x53E3;&#x4EC5;&#x4F9B;&#x7535;&#xFF09;&#x9700;&#x8981;&#x6A21;&#x5757;&#x548C; <strong>CH340/CH341&#x9A71;&#x52A8;</strong>&#x3002;</p>
<h3 id="stm32f411ret6">STM32F411RET6</h3>
<p>TODO</p>
<h3 id="%E5%85%B6%E4%BB%96%E6%9C%89%E6%84%8F%E6%80%9D%E7%9A%84%E5%9E%8B%E5%8F%B7">&#x5176;&#x4ED6;&#x6709;&#x610F;&#x601D;&#x7684;&#x578B;&#x53F7;</h3>
<ul>
<li>STM32C0
<ul>
<li>&#x5165;&#x95E8;&#x7EA7;&#x3001;&#x6027;&#x4EF7;&#x6BD4;&#x4E4B;&#x738B;&#x3002;&#x4E3B;&#x6253;&#x201C;32&#x4F4D;&#x6027;&#x80FD;&#xFF0C;8&#x4F4D;&#x6210;&#x672C;&#x201D;</li>
<li>&#x63D0;&#x4F9B;<strong>8&#x5230;64&#x5F15;&#x811A;</strong>&#x7684;&#x591A;&#x79CD;&#x5C01;&#x88C5;<strong>8&#x5F15;&#x811A;</strong>&#x662F;&#x5176;&#x6700;&#x5C0F;&#x5C01;&#x88C5;(<code>STM32C011F4U6TR</code>)&#xFF0C;&#x975E;&#x5E38;&#x9002;&#x5408;&#x5F15;&#x811A;&#x8981;&#x6C42;&#x5C11;&#x7684;&#x5E94;&#x7528;&#x3002;</li>
</ul>
</li>
</ul>
<h2 id="%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83">&#x5F00;&#x53D1;&#x73AF;&#x5883;</h2>
<ul>
<li>&#x5B89;&#x88C5; <code>STM32CubeMX</code>
<ul>
<li>&#x5B89;&#x88C5; MCU &#x56FA;&#x4EF6;&#x5305;
<ul>
<li>&#x5305;&#x62EC;: &#x6587;&#x6863;, &#x9A71;&#x52A8;, &#x4E2D;&#x95F4;&#x4EF6;, &#x53C2;&#x8003;&#x4F8B;&#x7A0B;</li>
</ul>
</li>
</ul>
</li>
<li>&#x5B89;&#x88C5; <code>MDK-ARM</code> (Keil MDK)</li>
<li>&#x5B89;&#x88C5; <code>ST-Link</code> &#x9A71;&#x52A8;
<ul>
<li>&#x641C;&#x7D22; <code>STSW-LINK007</code></li>
<li>&#x4E5F;&#x53EF;&#x4EE5;&#x5728; <code>MDK-ARM</code> &#x5B89;&#x88C5;&#x76EE;&#x5F55;&#x627E;&#x5230;: <code>Keil_v5\ARM\STLink\USBDriver</code></li>
</ul>
</li>
<li>&#x5B89;&#x88C5; &#x4E32;&#x53E3;&#x8C03;&#x8BD5;&#x8F6F;&#x4EF6;
<ul>
<li><code>SSCOM</code></li>
<li><code>XCOM</code></li>
<li><code>SecureCRT</code></li>
</ul>
</li>
</ul>
<h3 id="%E7%8E%AF%E5%A2%83%E8%AE%BE%E7%BD%AE">&#x73AF;&#x5883;&#x8BBE;&#x7F6E;</h3>
<ul>
<li><code>STM32CubeMX</code>
<ul>
<li>&#x9009;&#x62E9;&#x82AF;&#x7247;: <code>STM32F103C8T6</code></li>
<li>&#x5F00;&#x542F;&#x8C03;&#x8BD5;: <code>System Core</code> -&gt; <code>sys</code> -&gt; <code>Serial Wire</code></li>
<li>&#x65F6;&#x949F;&#x6765;&#x6E90;: <code>System Core</code> -&gt; <code>rcc</code> -&gt; <code>Crystal/Ceramic Resonato</code></li>
<li>&#x9009;&#x62E9;&#x65F6;&#x949F;: <code>HSI</code> -&gt; <code>PLLCLK</code>-&gt; <code>72MHz</code></li>
<li>&#x8BBE;&#x7F6E;&#x5F15;&#x811A;</li>
<li>&#x751F;&#x6210;&#x4EE3;&#x7801;</li>
</ul>
</li>
<li><code>MDK-ARM</code>
<ul>
<li>&#x6253;&#x5F00;&#x5DE5;&#x7A0B;</li>
<li>&#x7F16;&#x8F91;&#x8BBE;&#x7F6E;: <code>Edit</code>  -&gt; <code>Configuration</code> -&gt; <code>Encoding: &#x8BBE;&#x7F6E;&#x4E3A; Encode in UTF-8 without signature</code></li>
<li>&#x8C03;&#x8BD5;&#x8BBE;&#x7F6E;: <code>Debug</code> -&gt; <code>Debugger</code> -&gt; <code>ST-Link</code></li>
<li>&#x4E32;&#x53E3;&#x652F;&#x6301;: <code>Options for Target</code> -&gt; <code>Target</code> -&gt; <code>&#x52FE;&#x9009;&#x4E0A; &#x201C;Use MicroLIB&#x201D;</code></li>
<li>&#x81EA;&#x52A8;&#x8FD0;&#x884C;: <code>Options for Target</code> -&gt; <code>Utilities</code> -&gt; <code>Settings</code>
<ul>
<li><code>Pack: &#x53D6;&#x6D88;&#x52FE;&#x9009; &#x201C;Enable&#x201D;</code></li>
<li><code>Flash Download: &#x52FE;&#x9009;&#x4E0A; &#x201C;Reset and Run&#x201D;</code></li>
</ul>
</li>
<li>&#x4EE3;&#x7801;&#x4F18;&#x5316;: <code>Options for Target</code> -&gt; <code>C/C++ (AC6)</code> -&gt; <code>Optimization</code>:
<ul>
<li><code>-O0</code> &#x8868;&#x793A;&#x4E0D;&#x4F18;&#x5316;, &#x7528;&#x4E8E;&#x8C03;&#x8BD5;</li>
<li><code>-O2</code> &#x9ED8;&#x8BA4;&#x4F18;&#x5316;</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="%E8%BE%85%E5%8A%A9%E4%BB%A3%E7%A0%81%E6%A0%87%E8%AE%B0">&#x8F85;&#x52A9;&#x4EE3;&#x7801;&#x6807;&#x8BB0;</h4>
<p>&#x5728; STM32CubeIDE/STM32CubeMX &#x751F;&#x6210;&#x7684;&#x5DE5;&#x7A0B;&#x4E2D;&#xFF0C;<code>/* USER CODE BEGIN xxx */</code> &#x548C; <code>/* USER CODE END xxx */</code> &#x8FD9;&#x4E9B;&#x6CE8;&#x91CA;&#x6807;&#x8BB0;&#x5B9A;&#x4E49;&#x4E86;&#x7528;&#x6237;&#x4EE3;&#x7801;&#x7684;&#x5B89;&#x5168;&#x533A;&#x57DF;&#x3002;</p>
<p>&#x5F53;&#x4F60;&#x4F7F;&#x7528; STM32CubeMX &#x91CD;&#x65B0;&#x751F;&#x6210;&#x4EE3;&#x7801;&#x65F6;&#xFF1A;</p>
<ul>
<li><strong>&#x6807;&#x8BB0;&#x5185;&#x7684;&#x7528;&#x6237;&#x4EE3;&#x7801;&#x4F1A;&#x88AB;&#x4FDD;&#x7559;</strong></li>
<li><strong>&#x6807;&#x8BB0;&#x5916;&#x7684;&#x4EE3;&#x7801;&#x53EF;&#x80FD;&#x4F1A;&#x88AB;&#x8986;&#x76D6;</strong></li>
</ul>
<p>&#x4E0B;&#x9762;&#x662F;&#x5E38;&#x7528;&#x6807;&#x8BB0;&#x7684;&#x8BF4;&#x660E;:</p>
<pre><code class="language-c">/* USER CODE BEGIN Includes */      // Private includes (&#x5305;&#x542B;&#x81EA;&#x5B9A;&#x4E49;&#x5934;&#x6587;&#x4EF6;)
/* USER CODE END Includes */

/* USER CODE BEGIN PV */            // Private variables (&#x79C1;&#x6709;&#x53D8;&#x91CF;&#x58F0;&#x660E;)
/* USER CODE END PV */

/* USER CODE BEGIN PFP */           // Private function prototypes (&#x79C1;&#x6709;&#x51FD;&#x6570;&#x539F;&#x578B;&#x58F0;&#x660E;)
/* USER CODE END PFP */

/* USER CODE BEGIN ET */            // External Types&#xFF08;&#x5916;&#x90E8;&#x7C7B;&#x578B;&#x5B9A;&#x4E49;&#xFF09;
/* USER CODE END ET */

/* USER CODE BEGIN EM */            // Error Macros&#xFF08;&#x9519;&#x8BEF;&#x5B8F;&#x5B9A;&#x4E49;&#xFF09;
/* USER CODE END EM */

/* USER CODE BEGIN PTD */           // Private typedef (&#x79C1;&#x6709;&#x7C7B;&#x578B;&#x5B9A;&#x4E49;)
/* USER CODE END PTD */

/* USER CODE BEGIN PD */            // Private define (&#x4E0D;&#x5E26;&#x53C2;&#x6570;&#x7684;&#x5B8F;&#x5B9A;&#x4E49;)
/* USER CODE END PD */

/* USER CODE BEGIN PM */            // Private macro (&#x5E26;&#x53C2;&#x6570;&#x7684;&#x5B8F;&#x5B9A;&#x4E49;)
/* USER CODE END PM */
</code></pre>
<h3 id="%E6%97%B6%E9%92%9F%E9%85%8D%E7%BD%AE">&#x65F6;&#x949F;&#x914D;&#x7F6E;</h3>
<ul>
<li>
<p>&#x5185;&#x90E8;&#x65F6;&#x949F; LSI HSI&#x200B;</p>
<ul>
<li>STM32 MCU &#x5185;&#x90E8;&#x81EA;&#x5E26;RC&#x632F;&#x8361;&#x7535;&#x8DEF;&#xFF0C;&#x5176;&#x5185;&#x90E8;&#x65F6;&#x949F;&#x5C31;&#x662F;RC&#x632F;&#x8361;&#x5668;&#x4EA7;&#x751F;&#x7684;&#x3002;&#x200B;</li>
<li>&#x4F46;&#x662F;RC&#x632F;&#x8361;&#x5668;&#x7CBE;&#x5EA6;&#x8FDC;&#x4F4E;&#x4E8E;&#x6676;&#x632F;&#xFF0C;&#x4E14;&#x5BB9;&#x6613;&#x53D7;&#x5230;&#x6E29;&#x5EA6;&#x7684;&#x5F71;&#x54CD;&#x3002;&#x200B;</li>
</ul>
</li>
<li>
<p>&#x5916;&#x90E8;&#x65F6;&#x949F; LSE HSE&#x200B;</p>
<ul>
<li>&#x4E00;&#x822C;&#x6709;&#x4E24;&#x79CD;&#x63A5;&#x6CD5;&#x200B;:</li>
<li>&#x5916;&#x90E8;&#x63A5;&#x6709;&#x6E90;&#x6676;&#x632F; &#x6216;&#x5176; &#x4ED6;&#x76F4;&#x63A5;&#x65F6;&#x949F;&#x8F93;&#x5165;&#x6E90;&#xFF1A;<code>BYPASS Clock Source</code> &#x6A21;&#x5F0F;&#xFF08;&#x65C1;&#x8DEF;&#x65F6;&#x949F;&#x6E90;&#xFF09;&#x200B;</li>
<li>&#x5916;&#x90E8;&#x63A5;&#x65E0;&#x6E90;&#x6676;&#x632F;&#xFF1A;<code>Crystal/Ceramic Resonator</code>&#x6A21;&#x5F0F;&#xFF08;&#x6676;&#x4F53;/&#x9676;&#x74F7;&#x6676;&#x632F;&#xFF09;&#x200B;</li>
</ul>
</li>
</ul>
<h3 id="vs-code-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83">VS Code &#x5F00;&#x53D1;&#x73AF;&#x5883;</h3>
<ul>
<li><a href="https://www.st.com.cn/content/st_com/zh/campaigns/stm32-vs-code-extension-z11.html?ref=7-0.cc">STM32 VS Code&#x6269;&#x5C55;</a></li>
</ul>
<h2 id="%E6%9C%AF%E8%AF%AD">&#x672F;&#x8BED;</h2>
<h3 id="dma">DMA</h3>
<p>&#x76F4;&#x63A5;&#x5B58;&#x50A8;&#x5668;&#x8BBF;&#x95EE;&#x65B9;&#x5F0F;(DMA), &#x662F;&#x5728;&#x5904;&#x7406;&#x5668;&#x5185;&#x90E8;&#x5EFA;&#x7ACB;&#x7247;&#x5185;&#x5916;&#x8BBE;&#x548C;&#x5185;&#x5B58;&#x4E4B;&#x95F4;&#x7684;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x901A;&#x9053;&#xFF0C;&#x4F20;&#x8F93;&#x8FC7;&#x7A0B;&#x4E0D;&#x9700;<br>
&#x8981;&#x5904;&#x7406;&#x5668;&#x53C2;&#x4E0E;&#x3002;</p>
<p>DMA&#x65B9;&#x5F0F;&#x7531;&#x786C;&#x4EF6;&#x5B9E;&#x73B0;&#xFF0C;&#x7279;&#x522B;&#x9002;&#x5408;&#x4E8E;&#x6279;&#x91CF;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x7684;&#x573A;&#x5408;&#x3002;</p>
<h3 id="%E8%B0%83%E8%AF%95%E4%B8%8B%E8%BD%BD%E5%99%A8">&#x8C03;&#x8BD5;/&#x4E0B;&#x8F7D;&#x5668;</h3>
<p>&#x7528;&#x4E8E;&#x70E7;&#x5F55;&#x548C;&#x8C03;&#x8BD5;&#x4EE3;&#x7801;&#x3002;&#x4E00;&#x822C;&#x662F; ST-Link V2&#xFF0C;&#x6BD4;DAP-Link&#x5BF9;&#x65B0;&#x624B;&#x66F4;&#x53CB;&#x597D;&#x3002;</p>
]]></content:encoded></item><item><title><![CDATA[Linux 挂载群辉硬盘]]></title><description><![CDATA[群辉的下载盘断电后导致文件系统损坏，通过挂载到 Linux 抢救，并分析事故原因。]]></description><link>https://www.7-0.cc/mount-synology-hard-drives-on-linux/</link><guid isPermaLink="false">69b40869b1f19d0001c3e103</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Sun, 18 Jan 2026 12:52:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: Synology;Btrfs<br>
@@ Date: 2026-01-18<br>
@@ Note:</p>
<p>Linux &#x7CFB;&#x7EDF;&#x4E2D;&#x6302;&#x8F7D; Synology Btrfs &#x6587;&#x4EF6;&#x7CFB;&#x7EDF;</p>
<pre><code class="language-sh">zero@ubuntu-2404-x64:/mnt$ lsblk
NAME                            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda                               8:0    0    40G  0 disk
&#x251C;&#x2500;sda1                            8:1    0     1M  0 part
&#x251C;&#x2500;sda2                            8:2    0     2G  0 part  /boot
&#x2514;&#x2500;sda3                            8:3    0    38G  0 part
  &#x2514;&#x2500;ubuntu--vg-ubuntu--lv       252:0    0    19G  0 lvm   /
sdb                               8:16   0 465.8G  0 disk  # &#x8FD9;&#x662F;&#x6211;&#x7684;&#x7FA4;&#x8F89;&#x78C1;&#x76D8;
&#x251C;&#x2500;sdb1                            8:17   0     8G  0 part
&#x2502; &#x2514;&#x2500;md125                         9:125  0     0B  0 md
&#x251C;&#x2500;sdb2                            8:18   0     2G  0 part
&#x2502; &#x2514;&#x2500;md126                         9:126  0     0B  0 md
&#x2514;&#x2500;sdb3                            8:19   0 455.5G  0 part
  &#x2514;&#x2500;md127                         9:127  0 455.5G  0 raid1
    &#x251C;&#x2500;vg3-syno_vg_reserved_area 252:1    0    12M  0 lvm
    &#x2514;&#x2500;vg3-volume_3              252:2    0   455G  0 lvm

zero@ubuntu-2404-x64:~$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md127 : active raid1 sdb3[0]
      477662208 blocks super 1.2 [1/1] [U]

md125 : inactive sdb1[29](S)
      8387584 blocks super 1.2

md126 : inactive sdb2[29](S)
      2096128 blocks super 1.2

unused devices: &lt;none&gt;


zero@ubuntu-2404-x64:~$ sudo lvs
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- &lt;19.00g


zero@ubuntu-2404-x64:~$ sudo mdadm --detail /dev/md127
/dev/md127:
           Version : 1.2
     Creation Time : Tue Jul  2 22:41:46 2024
        Raid Level : raid1
        Array Size : 477662208 (455.53 GiB 489.13 GB)
     Used Dev Size : 477662208 (455.53 GiB 489.13 GB)
      Raid Devices : 1
     Total Devices : 1
       Persistence : Superblock is persistent

       Update Time : Thu Jan  8 23:56:44 2026
             State : clean, FAILED
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

    Number   Major   Minor   RaidDevice State
       0       8       19        0      active sync   missing
</code></pre>
<p>&#x5728;&#x9AD8;&#x7248;&#x672C;&#x7684;&#x5185;&#x6838;&#x4E2D;&#x76F4;&#x63A5;&#x6302;&#x8F7D;&#x7FA4;&#x6656; Btrfs &#x5377;&#x5F88;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;:</p>
<pre><code class="language-sh">$ sudo mount -t btrfs -o ro /dev/vg3/volume_3 /mnt/syno-btrfs
mount: /mnt/syno-btrfs: can&apos;t read superblock on /dev/mapper/vg3-volume_3.
       dmesg(1) may have more information after failed mount system call.
</code></pre>
<p>&#x539F;&#x56E0;&#x662F;:</p>
<p>Synology&#x5728;BTRFS&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x4E2D;&#x4F7F;&#x7528;&#x4E86;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x6807;&#x5FD7;&#x4F4D;&#xFF08;flags&#xFF09;</p>
<p>&#x4ECE;Linux 5.4-rc1&#x5F00;&#x59CB;&#xFF0C;&#x5185;&#x6838;&#x6DFB;&#x52A0;&#x4E86;&#x4E25;&#x683C;&#x7684;BTRFS&#x6839;&#x6807;&#x5FD7;&#x68C0;&#x67E5;&#xFF08;commit 259ee7754b67&#xFF09;&#xFF0C;&#x62D2;&#x7EDD;&#x6302;&#x8F7D;&#x542B;&#x6709;&#x4E0D;&#x652F;&#x6301;&#x6807;&#x5FD7;&#x7684;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x3002;</p>
<p>&#x8FD9;&#x4E2A;&#x68C0;&#x67E5;&#x88AB;&#x53CD;&#x5411;&#x79FB;&#x690D;&#x5230;Ubuntu LTS&#x7248;&#x672C;&#xFF08;&#x5305;&#x62EC;4.15&#x5185;&#x6838;&#xFF09;&#xFF0C;&#x5BFC;&#x81F4;&#x5B98;&#x65B9;Synology&#x6062;&#x590D;&#x6307;&#x5357;&#x5931;&#x6548;&#x3002;</p>
<p>&#x89E3;&#x51B3;&#x65B9;&#x6848;:</p>
<p>&#x4F7F;&#x7528;&#x7279;&#x5B9A;&#x5185;&#x6838;&#x7248;&#x672C;</p>
<ul>
<li>Ubuntu Bionic&#xFF08;18.04&#xFF09; + &#x5185;&#x6838; 4.15.0-108</li>
<li>Ubuntu Xenial&#xFF08;16.04&#xFF09; + &#x5185;&#x6838; 4.15.0-107</li>
</ul>
<h2 id="%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4">&#x64CD;&#x4F5C;&#x6B65;&#x9AA4;</h2>
<p>&#x4E0B;&#x8F7D;&#x5B89;&#x88C5; Ubuntu Bionic&#xFF08;18.04&#xFF09;&#x7248;&#x672C;, &#x5F00;&#x59CB;&#x5B89;&#x88C5;&#x670D;&#x52A1;&#x5668;&#x7248;&#x672C;, &#x4F46;&#x5B89;&#x88C5;&#x8FC7;&#x7A0B;&#x603B;&#x662F;&#x51FA;&#x73B0;&#x9519;&#x8BEF;, &#x8F6C;&#x800C;&#x5B89;&#x88C5;&#x4E86; desktop &#x7248;&#x672C;.</p>
<ol>
<li><code>sudo apt install linux-image-4.15.0-108-generic</code></li>
<li><code>sudo reboot</code></li>
<li>&#x91CD;&#x542F;&#x65F6;&#xFF0C;&#x5728;Grub&#x5F15;&#x5BFC;&#x754C;&#x9762;&#xFF08;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x6309; Shift &#x6216; Esc &#x952E;&#x5524;&#x51FA;&#xFF09;&#x9009;&#x62E9; &#x201C;Advanced options for Ubuntu&#x201D;&#xFF0C;&#x7136;&#x540E;&#x627E;&#x5230;&#x5E76;&#x542F;&#x52A8;&#x4F60;&#x521A;&#x5B89;&#x88C5;&#x7684; 4.15 &#x5185;&#x6838;</li>
<li>&#x786E;&#x5B9A;&#x7269;&#x7406;&#x8FDE;&#x63A5;&#x60C5;&#x51B5;: <code>sudo lsblk -f</code></li>
<li><code>sudo apt install -y btrfs-progs mdadm lvm2</code></li>
<li><code>sudo mdadm --assemble --scan</code>
<ol>
<li>&#x8FD9;&#x4E00;&#x6B65;&#x5982;&#x679C;&#x5931;&#x8D25;, &#x53EF;&#x80FD;&#x9700;&#x8981;&#x5148;&#x505C;&#x6B62;&#x73B0;&#x6709;&#x7684;md&#x8BBE;&#x5907;
<ul>
<li>&#x68C0;&#x67E5;md&#x8BBE;&#x5907; <code>cat /proc/mdstat</code></li>
<li>&#x518D;&#x6B21;&#x6267;&#x884C;: <code>sudo mdadm --assemble --scan --detail</code></li>
</ul>
</li>
<li>&#x5230;&#x4E86;&#x8FD9;&#x4E00;&#x6B65;, &#x5728;&#x684C;&#x9762;&#x7248;&#x7CFB;&#x7EDF;&#x4E0A;, &#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6587;&#x4EF6;&#x6D4F;&#x89C8;&#x5668;&#x81EA;&#x52A8;&#x6302;&#x8F7D;&#x5230; <code>/media/&lt;user&gt;/</code> &#x76EE;&#x5F55;&#x4E0B;</li>
</ol>
</li>
<li><code>sudo vgscan --mknodes</code></li>
<li><code>sudo vgchange -ay</code></li>
<li><code>sudo lvs</code></li>
<li><code>sudo mount -o ro,rescue=all /dev/&#x4F60;&#x7684;&#x78C1;&#x76D8;&#x5206;&#x533A; /mnt/recovery</code>
<ol>
<li>&#x6216;&#x8005;&#x7528; <code>-o ro,rescue=usebackuproot</code> &#x9009;&#x9879;</li>
</ol>
</li>
</ol>
<h3 id="%E5%AE%89%E5%85%A8%E7%9A%84%E7%A7%BB%E9%99%A4%E8%AE%BE%E5%A4%87">&#x5B89;&#x5168;&#x7684;&#x79FB;&#x9664;&#x8BBE;&#x5907;</h3>
<ul>
<li>&#x9996;&#x5148;&#x5378;&#x8F7D;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;
<ul>
<li><code>sudo umount /dev/&#x4F60;&#x7684;&#x78C1;&#x76D8;&#x5206;&#x533A;</code></li>
<li><code>sudo umount /dev/sdb*</code></li>
</ul>
</li>
<li>&#x505C;&#x6B62;LVM&#x903B;&#x8F91;&#x5377;, &#x5982;&#x679C;&#x4F7F;&#x7528;LVM&#x903B;&#x8F91;&#x5377;
<ul>
<li><code>sudo vgchange -an vg1</code></li>
</ul>
</li>
<li>&#x505C;&#x6B62;md&#x8BBE;&#x5907;, &#x5982;&#x679C;&#x4F7F;&#x7528;mdadm
<ul>
<li><code>sudo mdadm --stop /dev/md*</code></li>
</ul>
</li>
<li>&#x786E;&#x4FDD;&#x6CA1;&#x6709;&#x8FDB;&#x7A0B;&#x5360;&#x7528;&#x8BBE;&#x5907;
<ul>
<li><code>sudo lsof | grep /dev/sdb</code></li>
<li><code>sudo fuser -mv /dev/sdb*</code></li>
</ul>
</li>
<li>&#x5237;&#x65B0;&#x5E76;&#x79FB;&#x9664;&#x8BBE;&#x5907;
<ul>
<li><code>sudo sync</code></li>
<li><code>sudo blockdev --flushbufs /dev/sdb</code></li>
</ul>
</li>
</ul>
<p>&#x6216;&#x8005;(&#x63A8;&#x8350;)</p>
<pre><code class="language-sh"># &#x67E5;&#x770B;&#x8BBE;&#x5907;&#x4FE1;&#x606F;
udisksctl status

# &#x5378;&#x8F7D;&#x5E76;&#x5F39;&#x51FA;&#xFF08;&#x4F1A;&#x81EA;&#x52A8;&#x6267;&#x884C;&#x6240;&#x6709;&#x5FC5;&#x8981;&#x6B65;&#x9AA4;&#xFF09;
udisksctl unmount -b /dev/sdb*
udisksctl power-off -b /dev/sdb
</code></pre>
<h2 id="%E5%8E%9F%E5%9B%A0%E5%88%86%E6%9E%90">&#x539F;&#x56E0;&#x5206;&#x6790;</h2>
<p>&#x7FA4;&#x8F89;&#x65AD;&#x7535;&#x540E;, &#x51FA;&#x73B0; Btrfs &#x78C1;&#x76D8;&#x53EF;&#x4EE5;&#x8BFB;&#x53D6;&#x76EE;&#x5F55;, &#x4F46;&#x4E0D;&#x80FD;&#x8BFB;&#x53D6;&#x5185;&#x5BB9;&#x3002;</p>
<ul>
<li>&#x5C06;&#x78C1;&#x76D8;&#x6302;&#x8F7D;&#x5230; Windows &#x540E;, &#x901A;&#x8FC7; winhex &#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x6253;&#x5F00;, &#x5E76;&#x53EF;&#x4EE5;&#x62F7;&#x8D1D;&#x78C1;&#x76D8;&#x6570;&#x636E;&#x5EFA;&#x7ACB;&#x78C1;&#x76D8;&#x955C;&#x50CF;&#x3002;</li>
<li>&#x901A;&#x8FC7; Ubuntu &#x6302;&#x8F7D;&#x540E;, &#x4E5F;&#x662F;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x76EE;&#x5F55;, &#x4F46;&#x4E0D;&#x80FD;&#x62F7;&#x8D1D;&#x6587;&#x4EF6;(&#x51FA;&#x73B0;io&#x65E0;&#x54CD;&#x5E94;)&#x3002;</li>
<li>&#x8BE5;&#x78C1;&#x76D8;&#x4F5C;&#x4E3A;&#x4E0B;&#x8F7D;&#x78C1;&#x76D8;&#xFF0C;&#x65AD;&#x7535;&#x65F6;&#x53EF;&#x80FD;&#x6B63;&#x5728;&#x5199;&#x5165;&#x6570;&#x636E;&#xFF08;&#x5C11;&#x91CF;&#x6570;&#x636E;&#xFF09;&#x3002;</li>
</ul>
<p>&#x8FD9;&#x662F; <strong>&#x5178;&#x578B;&#x7684; Btrfs &#x5728;&#x5F02;&#x5E38;&#x65AD;&#x7535;&#x540E;&#x51FA;&#x73B0;&#x7684;&#x201C;&#x903B;&#x8F91;&#x4E00;&#x81F4;&#x6027;&#x7834;&#x574F; + &#x8BFB;&#x8DEF;&#x5F84;&#x5DEE;&#x5F02;&#x201D;&#x95EE;&#x9898;</strong>:</p>
<blockquote>
<p>&#x65AD;&#x7535;&#x5BFC;&#x81F4;&#x201C;&#x5168;&#x76D8;&#x201D;&#x6216;&#x5168;&#x5C40;&#x6027;&#x95EE;&#x9898;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x4EC5;&#x4EC5;&#x5F71;&#x54CD;&#x6B63;&#x5728;&#x5199;&#x5165;&#x7684;&#x5355;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x56E0;&#x4E3A; <strong>Btrfs&#x662F;&#x4E00;&#x4E2A;&#x201C;&#x5199;&#x65F6;&#x590D;&#x5236;&#x201D;&#xFF08;CoW&#xFF09;&#x7684;&#x3001;&#x65E5;&#x5FD7;&#x5F0F;&#x5143;&#x6570;&#x636E;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;</strong>&#x3002;<br>
&#x7B80;&#x5355;&#x6765;&#x8BF4;&#xFF0C;&#x4E00;&#x6B21;&#x65AD;&#x7535;&#x53EF;&#x80FD;&#x540C;&#x65F6;&#x7834;&#x574F;&#x4E86;<strong>&#x7528;&#x4E8E;&#x63CF;&#x8FF0;&#x5168;&#x76D8;&#x6587;&#x4EF6;&#x5E03;&#x5C40;&#x7684;&#x201C;&#x5730;&#x56FE;&#x201D;&#xFF08;&#x5143;&#x6570;&#x636E;&#xFF09;</strong>&#xFF0C;&#x4EE5;&#x53CA;<strong>&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x8BB0;&#x5F55;&#x81EA;&#x5DF1;&#x53D8;&#x66F4;&#x7684;&#x201C;&#x7B14;&#x8BB0;&#x672C;&#x201D;&#xFF08;&#x65E5;&#x5FD7;&#xFF09;</strong></p>
</blockquote>
<h3 id="%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88">&#x89E3;&#x51B3;&#x65B9;&#x6848;</h3>
<p>&#x80FD;&#x8BC6;&#x522B;&#x5230;&#x5377;&#x7684;&#x57FA;&#x7840;&#x4E0A;, &#x4E0D;&#x6302;&#x8F7D;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;, &#x6267;&#x884C; <code>btrfs restore</code></p>
<pre><code class="language-sh">btrfs restore -v [-i -s] /dev/sdX /path/to/backup/
</code></pre>
<p>&#x5E38;&#x7528;&#x53C2;&#x6570;:</p>
<ul>
<li><code>-v</code><br>
&#x663E;&#x793A;&#x6B63;&#x5728;&#x6062;&#x590D;&#x7684;&#x6587;&#x4EF6;</li>
<li><code>-vv</code><br>
&#x663E;&#x793A; inode&#x3001;extent&#x3001;block &#x7EA7;&#x522B;&#x4FE1;&#x606F;</li>
<li><code>-i</code><br>
&#x4EA4;&#x4E92;&#x5F0F;: &#x9047;&#x5230;&#x9519;&#x8BEF;&#x65F6;, &#x8BE2;&#x95EE;&#x662F;&#x5426;&#x8DF3;&#x8FC7;</li>
<li><code>-s</code><br>
&#x8DF3;&#x8FC7;&#x9519;&#x8BEF;</li>
<li><code>-x</code><br>
&#x8DF3;&#x8FC7; xattr / ACL / SELinux label&#xFF08;&#x6551;&#x547D;&#x53C2;&#x6570;&#xFF09;</li>
</ul>
<h2 id="%E6%8C%82%E8%BD%BD-ext4">&#x6302;&#x8F7D; ext4</h2>
<p>&#x6302;&#x8F7D;&#x6D41;&#x7A0B;&#x57FA;&#x672C;&#x4E0E; Btrfs &#x76F8;&#x540C;, &#x78C1;&#x76D8;&#x7ED3;&#x6784;&#x57FA;&#x672C;&#x76F8;&#x540C;, &#x552F;&#x4E00;&#x533A;&#x522B;&#x5C31;&#x662F;&#x5377;&#x7684;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x4E0D;&#x540C;&#x3002;</p>
<pre><code class="language-sh">sdb                               8:16   0 465.8G  0 disk
&#x251C;&#x2500;sdb1                            8:17   0     8G  0 part
&#x2502; &#x2514;&#x2500;md125                         9:125  0     8G  0 raid1
&#x251C;&#x2500;sdb2                            8:18   0     2G  0 part
&#x2502; &#x2514;&#x2500;md126                         9:126  0     2G  0 raid1
&#x2514;&#x2500;sdb3                            8:19   0 455.5G  0 part
  &#x2514;&#x2500;md127                         9:127  0 455.5G  0 raid1
    &#x251C;&#x2500;vg1-syno_vg_reserved_area 253:0    0    12M  0 lvm
    &#x2514;&#x2500;vg1-volume_1              253:1    0   455G  0 lvm   /mnt/g
</code></pre>
<h2 id="%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5">&#x53C2;&#x8003;&#x94FE;&#x63A5;</h2>
<ul>
<li><a href="https://comate.baidu.com/zh/page/hm3y82brg2j?ref=7-0.cc">https://comate.baidu.com/zh/page/hm3y82brg2j</a></li>
<li><a href="https://community.synology.com/enu/forum/1/post/159579?ref=7-0.cc">https://community.synology.com/enu/forum/1/post/159579</a></li>
<li><a href="https://www.reddit.com/r/synology/comments/u6y5qm/has_anyone_found_a_solution_for_mounting_synology/?ref=7-0.cc">https://www.reddit.com/r/synology/comments/u6y5qm/has_anyone_found_a_solution_for_mounting_synology/</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[git-crypt 小记]]></title><description><![CDATA[git-crypt 的编译、使用与笔记]]></description><link>https://www.7-0.cc/git-crypt/</link><guid isPermaLink="false">69b40abab1f19d0001c3e114</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Wed, 07 Jan 2026 13:04:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: git-crypt<br>
@@ Date: 2026-01-07</p>
<ul>
<li><a href="https://github.com/AGWA/git-crypt?ref=7-0.cc">git-crypt</a></li>
<li><a href="https://www.agwa.name/projects/git-crypt/?ref=7-0.cc">git-crypt Home</a></li>
</ul>
<p>git-crypt &#x662F;&#x4E00;&#x4E2A;&#x7528;&#x4E8E;git&#x4ED3;&#x5E93;&#x4E2D;&#x6587;&#x4EF6;&#x52A0;&#x5BC6;&#x7684;&#x5DE5;&#x5177;&#xFF0C;&#x652F;&#x6301; git &#x4ED3;&#x5E93;&#x4E2D;&#x7684;&#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x900F;&#x660E;&#x7684;&#x52A0;&#x5BC6;&#x548C;&#x89E3;&#x5BC6;&#x3002;</p>
<p>git-crypt &#x5141;&#x8BB8;&#x9009;&#x62E9;&#x67D0;&#x4E9B;&#x6587;&#x4EF6;&#x5728; &#x63D0;&#x4EA4;(commit) &#x65F6;&#x52A0;&#x5BC6;&#xFF0C;&#x5728; &#x68C0;&#x51FA;(checkout) &#x65F6;&#x89E3;&#x5BC6;&#x3002;</p>
<p>git-crypt &#x4E5F;&#x4F1A;&#x4F18;&#x96C5;&#x5730;&#x964D;&#x7EA7;&#xFF0C;&#x56E0;&#x6B64;&#x6CA1;&#x6709;&#x79D8;&#x94A5;&#x7684;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x4ECD;&#x7136;&#x53EF;&#x4EE5;&#x514B;&#x9686;&#x5E76;&#x63D0;&#x4EA4;&#x5230;<strong>&#x5305;&#x542B;&#x52A0;&#x5BC6;&#x6587;&#x4EF6;&#x7684;&#x5B58;&#x50A8;&#x5E93;</strong>&#x4E2D;&#x3002;&#x8FD9;&#x5141;&#x8BB8;&#x60A8;&#x5C06;&#x79D8;&#x5BC6;&#x8D44;&#x6599;&#xFF08;&#x5982;&#x5BC6;&#x94A5;&#x6216;&#x5BC6;&#x7801;&#xFF09;&#x5B58;&#x50A8;&#x5728;&#x4E0E;&#x4EE3;&#x7801;&#x76F8;&#x540C;&#x7684;&#x5B58;&#x50A8;&#x5E93;&#x4E2D;&#xFF0C;&#x800C;&#x4E0D;&#x9700;&#x8981;&#x9501;&#x5B9A;&#x6574;&#x4E2A;&#x5B58;&#x50A8;&#x5E93;&#x3002;</p>
<h2 id="%E5%AE%89%E8%A3%85">&#x5B89;&#x88C5;</h2>
<pre><code class="language-sh">git clone https://github.com/AGWA/git-crypt.git
cd git-crypt
make
</code></pre>
<p>&#x62A5;&#x9519;&#x5982;&#x4E0B;:</p>
<pre><code class="language-sh">g++ -Wall -pedantic -Wno-long-long -O2 -std=c++11   -c -o util.o util.cpp
In file included from util.cpp:156:
util-unix.cpp: In member function &#x2018;void temp_fstream::open(std::ios_base::openmode)&#x2019;:
util-unix.cpp:79:38: &#x9519;&#x8BEF;&#xFF1A;&#x2018;mkstemp&#x2019; was not declared in this scope; did you mean &#x2018;mkdtemp&#x2019;?
   79 |         int                     fd = mkstemp(path);
      |                                      ^~~~~~~
      |                                      mkdtemp
util-unix.cpp: In function &#x2018;std::string our_exe_path()&#x2019;:
util-unix.cpp:135:51: &#x9519;&#x8BEF;&#xFF1A;&#x2018;realpath&#x2019;&#x5728;&#x6B64;&#x4F5C;&#x7528;&#x57DF;&#x4E2D;&#x5C1A;&#x672A;&#x58F0;&#x660E;
  135 |                 char*           resolved_path_p = realpath(argv0, nullptr);
      |                                                   ^~~~~~~~
make: *** [&lt;&#x5185;&#x7F6E;&gt;&#xFF1A;util.o] &#x9519;&#x8BEF; 1
</code></pre>
<p>&#x53C2;&#x8003;: <a href="https://github.com/AGWA/git-crypt/issues/152?ref=7-0.cc">https://github.com/AGWA/git-crypt/issues/152</a></p>
<p>&#x589E;&#x52A0; <code>-U__STRICT_ANSI__</code> &#x5355;&#x72EC;&#x7F16;&#x8BD1; <code>util.cpp</code></p>
<pre><code class="language-sh">g++ -Wall -pedantic -Wno-long-long -O2 -std=c++11 -U__STRICT_ANSI__  -c -o util.o util.cpp
make

# &#x5B89;&#x88C5;&#x5230; /usr/local/bin
make install

# &#x5B89;&#x88C5;&#x5230; /bin
make install PREFIX=
</code></pre>
<p>&#x6CE8;&#x610F;: &#x5728; cygwin &#x4E0B;&#x7F16;&#x8BD1;&#x5E76;&#x5728; windows &#x4E0B;&#x8FD0;&#x884C;&#x65F6;, &#x5B58;&#x5728; bug.</p>
<h2 id="%E4%BD%BF%E7%94%A8">&#x4F7F;&#x7528;</h2>
<pre><code class="language-sh"># &#x914D;&#x7F6E;&#x4ED3;&#x5E93;&#x4EE5;&#x4F7F;&#x7528; git-crypt
# &#x6B64;&#x65F6;&#x4F1A;&#x751F;&#x6210;&#x79D8;&#x94A5;: .git/git-crypt/key/default
cd repo
git-crypt init

# &#x901A;&#x8FC7;&#x521B;&#x5EFA; .gitattributes &#x6587;&#x4EF6;&#x6765;&#x6307;&#x5B9A;&#x8981;&#x52A0;&#x5BC6;&#x7684;&#x6587;&#x4EF6;&#xFF1A;
echo &quot;*.key        filter=git-crypt diff=git-crypt&quot; &gt;&gt; .gitattributes
echo &quot;*.pem        filter=git-crypt diff=git-crypt&quot; &gt;&gt; .gitattributes
echo &quot;secretdir/** filter=git-crypt diff=git-crypt&quot; &gt;&gt; .gitattributes

# &#x4F7F;&#x7528; GPG &#x4E0E;&#x4ED6;&#x4EBA;&#xFF08;&#x6216;&#x81EA;&#x5DF1;&#xFF09;&#x5171;&#x4EAB;&#x5B58;&#x50A8;&#x5E93;
git-crypt add-gpg-user &lt;USERID&gt;

# &#x6216;&#x8005;&#xFF0C;&#x60A8;&#x53EF;&#x4EE5;&#x5BFC;&#x51FA;&#x5BF9;&#x79F0;&#x5BC6;&#x94A5; (.git/git-crypt/key/default)
# &#x5982;&#x679C;&#x4E0D;&#x5BFC;&#x51FA;, &#x5219;&#x4E00;&#x65E6;&#x9501;&#x4F4F;&#x5B58;&#x50A8;&#x5E93;, &#x5219;&#x65E0;&#x6CD5;&#x89E3;&#x9501;(&#x4EE4;&#x4EBA;&#x6DF1;&#x523B;&#x7684;&#x6559;&#x8BAD;&#x1F62D;)
git-crypt export-key /path/to/key

# &#x514B;&#x9686;&#x5305;&#x542B;&#x52A0;&#x5BC6;&#x6587;&#x4EF6;&#x7684;&#x5B58;&#x50A8;&#x5E93;&#x540E;&#xFF0C;&#x4F7F;&#x7528; GPG &#x89E3;&#x9501;
git-crypt unlock

# &#x6216;&#x8005;&#x4F7F;&#x7528;&#x5BF9;&#x79F0;&#x5BC6;&#x94A5;
git-crypt unlock /path/to/key
</code></pre>
<h2 id="%E5%B1%80%E9%99%90%E6%80%A7">&#x5C40;&#x9650;&#x6027;</h2>
<p>git-crypt &#x4F9D;&#x8D56;&#x4E8E; Git &#x8FC7;&#x6EE4;&#x5668;&#xFF0C;&#x800C;&#x8FD9;&#x4E9B;&#x8FC7;&#x6EE4;&#x5668;&#x5728;&#x8BBE;&#x8BA1;&#x4E4B;&#x521D;&#x5E76;&#x672A;&#x8003;&#x8651;&#x52A0;&#x5BC6;&#x3002;</p>
<p>&#x56E0;&#x6B64;&#xFF0C;&#x5BF9;&#x4E8E;&#x9700;&#x8981;&#x52A0;&#x5BC6;&#x4ED3;&#x5E93;&#x4E2D;&#x5927;&#x90E8;&#x5206;&#x6216;&#x5168;&#x90E8;&#x6587;&#x4EF6;&#x7684;&#x60C5;&#x51B5;&#xFF0C;git-crypt &#x5E76;&#x975E;&#x6700;&#x4F73;&#x5DE5;&#x5177;&#x3002;</p>
<p>git-crypt &#x771F;&#x6B63;&#x64C5;&#x957F;&#x7684;&#x573A;&#x666F;&#x662F;&#xFF1A;&#x4F60;&#x7684;&#x4ED3;&#x5E93;&#x5927;&#x90E8;&#x5206;&#x5185;&#x5BB9;&#x662F;&#x516C;&#x5F00;&#x7684;&#xFF0C;&#x4F46;&#x4F60;&#x9700;&#x8981;&#x52A0;&#x5BC6;&#x5C11;&#x6570;&#x51E0;&#x4E2A;&#x6587;&#x4EF6;&#xFF08;&#x4F8B;&#x5982;&#x540D;&#x4E3A; *.key &#x7684;&#x79C1;&#x94A5;&#x6587;&#x4EF6;&#xFF0C;&#x6216;&#x5305;&#x542B; API &#x51ED;&#x636E;&#x7684;&#x6587;&#x4EF6;&#xFF09;&#x3002;&#x5982;&#x679C;&#x9700;&#x8981;&#x52A0;&#x5BC6;&#x6574;&#x4E2A;&#x4ED3;&#x5E93;&#xFF0C;&#x8BF7;&#x8003;&#x8651;&#x4F7F;&#x7528;&#x50CF; <code>git-remote-gcrypt</code> &#x8FD9;&#x6837;&#x7684;&#x7CFB;&#x7EDF;&#x3002;</p>
]]></content:encoded></item><item><title><![CDATA[卷积神经网络-卷积层]]></title><description><![CDATA[从数据以及算法层面上对卷积层做一个演示，理解卷积的过程以及反向传播的原理。]]></description><link>https://www.7-0.cc/convolutional-neural-network-convolutional-layer/</link><guid isPermaLink="false">69b42543b1f19d0001c3e1fa</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Wed, 24 Dec 2025 16:54:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;;&#x5377;&#x79EF;&#x5C42;<br>
@@ Date: 12/25/2025, 6:15:47</p>
<p>&#x4ECE;&#x6570;&#x636E;&#x4EE5;&#x53CA;&#x7B97;&#x6CD5;&#x5C42;&#x9762;&#x4E0A;&#x5BF9;&#x5377;&#x79EF;&#x5C42;&#x505A;&#x4E00;&#x4E2A;&#x6F14;&#x793A;&#xFF0C;&#x7406;&#x89E3;&#x5377;&#x79EF;&#x7684;&#x8FC7;&#x7A0B;&#x4EE5;&#x53CA;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#x7684;&#x539F;&#x7406;&#x3002;</p>
<p>&#x9996;&#x5148;&#x51C6;&#x5907;&#x6570;&#x636E;</p>
<pre><code class="language-python">import numpy as np
from termcolor import cprint

# &#x8F93;&#x5165;&#x6837;&#x672C;&#x3001;&#x5377;&#x79EF;&#x6838;&#x3001;&#x5377;&#x79EF;&#x5C42;&#x504F;&#x7F6E;&#x9879;
sample = np.arange(16).reshape(4, 4)
filter = np.array([[-1, -2, 0], [1, 0, -2], [0, -1, 2]])
biases = np.array([5])

# &#x9884;&#x8BBE;&#x53C2;&#x6570;
N, channels = (1, 1)
H, W = sample.shape
FH, FW = filter.shape
padding = 0
stride = 1
out_h = (H + 2 * padding - FH) // stride + 1
out_w = (W + 2 * padding - FW) // stride + 1

cprint(f&apos;sample:\n{sample}\n&apos;)
cprint(f&apos;filter:\n{filter}\n&apos;, &apos;magenta&apos;)
</code></pre>
<p>&#x8F93;&#x51FA;:</p>
<pre><code class="language-sh">sample:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

filter:
[[-1 -2  0]
 [ 1  0 -2]
 [ 0 -1  2]]
</code></pre>
<h2 id="%E5%89%8D%E5%90%91%E4%BC%A0%E6%92%AD%E5%8D%B7%E7%A7%AF%E8%BF%87%E7%A8%8B">&#x524D;&#x5411;&#x4F20;&#x64AD;(&#x5377;&#x79EF;)&#x8FC7;&#x7A0B;</h2>
<p>&#x5377;&#x79EF;&#x6838;&#x5728;&#x8F93;&#x5165;&#x56FE;&#x50CF;&#x4E0A;&#x6ED1;&#x52A8;&#xFF0C;&#x5C06;&#x6BCF;&#x6B21;&#x6ED1;&#x52A8;&#x4EA7;&#x751F;&#x5377;&#x79EF;&#x7A97;&#x53E3;&#x7684;&#x6570;&#x636E;&#x62F7;&#x8D1D;&#x51FA;&#x6765;&#xFF0C;&#x4EE5;&#x4FBF;&#x540E;&#x9762;&#x77E9;&#x9635;&#x4E58;&#x6CD5;&#x8BA1;&#x7B97;&#x5377;&#x79EF;&#x3002;</p>
<pre><code class="language-python"># &#x6ED1;&#x52A8;&#x6B65;&#x6570;(&#x8F93;&#x51FA;&#x7279;&#x5F81;&#x56FE;&#x7684;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x90FD;&#x662F;&#x4E00;&#x4E2A;&#x6ED1;&#x52A8;&#x7684;&#x5377;&#x79EF;&#x7A97;&#x53E3;) * &#x5377;&#x79EF;&#x7A97;&#x53E3;
matrix = np.zeros((out_h, out_w,
                   FH, FW), np.int64)

# &#x5728;&#x8F93;&#x5165;&#x6570;&#x636E;&#x4E0A;&#x6ED1;&#x52A8;, &#x62F7;&#x8D1D;&#x6BCF;&#x4E2A;&#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x6570;&#x636E;&#x5230;&#x77E9;&#x9635;&#x4E2D;
for i in range(out_h):
    for j in range(out_w):
        y = i * stride
        x = j * stride
        y_end = y + FH
        x_end = x + FW

        matrix[i, j] = sample[y:y_end, x:x_end]

cprint(f&apos;matrix:\n{matrix}\n&apos;, &apos;green&apos;)
</code></pre>
<p>&#x8F93;&#x51FA;:</p>
<pre><code class="language-sh">32mmatrix:
[[[[ 0  1  2]
   [ 4  5  6]
   [ 8  9 10]]

  [[ 1  2  3]
   [ 5  6  7]
   [ 9 10 11]]]


 [[[ 4  5  6]
   [ 8  9 10]
   [12 13 14]]

  [[ 5  6  7]
   [ 9 10 11]
   [13 14 15]]]]
</code></pre>
<p>&#x5C06;&#x5377;&#x79EF;&#x7A97;&#x53E3;&#x4E2D;&#x7684;&#x50CF;&#x7D20;&#x503C;&#x4E0E;&#x5377;&#x79EF;&#x6838;&#x7684;&#x6743;&#x91CD;&#x6267;&#x884C;&#x70B9;&#x79EF;&#xFF0C;&#x5F97;&#x5230;&#x8F93;&#x51FA;<strong>&#x7279;&#x5F81;&#x56FE;</strong>&#x3002;</p>
<pre><code class="language-python"># &#x5C06;&#x77E9;&#x9635;&#x8868;&#x793A;&#x7684;&#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x6570;&#x636E;&#x91CD;&#x5851;&#x4E3A;&#x884C;&#x683C;&#x5F0F;, &#x4EE5;&#x4FBF;&#x8FDB;&#x884C;&#x77E9;&#x9635;&#x4E58;&#x6CD5;
matrix = matrix.reshape(-1, FH * FW)
cprint(f&apos;matrix:\n{matrix}\n&apos;, &apos;cyan&apos;)

# &#x5C06;&#x5377;&#x79EF;&#x6838;&#x77E9;&#x9635;&#x91CD;&#x5851;&#x4E3A;&#x5217;&#x683C;&#x5F0F;
weight = filter.reshape(-1).T
cprint(f&apos;weight:\n{weight}\n&apos;, &apos;magenta&apos;)

# &#x6267;&#x884C;&#x77E9;&#x9635;&#x4E58;&#x6CD5;&#x5B9E;&#x73B0;&#x5377;&#x79EF;
output = np.dot(matrix, weight) + biases
cprint(f&apos;biases:\n{biases}\n&apos;, &apos;green&apos;)
cprint(f&apos;output:\n{output}\n&apos;, &apos;green&apos;)

# &#x5C06;&#x8F93;&#x51FA;&#x91CD;&#x5851;&#x4E3A;&#x7279;&#x5F81;&#x56FE;&#x7684;&#x5F62;&#x72B6;
output = output.reshape(-1, out_h, out_w)
cprint(f&apos;output.reshape:\n{output}\n&apos;, &apos;green&apos;)
</code></pre>
<p>&#x8F93;&#x51FA;:</p>
<pre><code class="language-sh">matrix:
[[ 0  1  2  4  5  6  8  9 10]
 [ 1  2  3  5  6  7  9 10 11]
 [ 4  5  6  8  9 10 12 13 14]
 [ 5  6  7  9 10 11 13 14 15]]

weight:
[-1 -2  0  1  0 -2  0 -1  2]

biases:
[5]

output:
[ 6  3 -6 -9]

output.reshape:
[[[ 6  3]
  [-6 -9]]]
</code></pre>
<!-- #region -->
<p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F;&#x5377;&#x79EF;&#x5230;&#x8F93;&#x51FA;&#x7279;&#x5F81;&#x56FE;&#x7684;&#x8FC7;&#x7A0B;&#x3002;&#x4E3A;&#x4E86;&#x4FBF;&#x4E8E;&#x7406;&#x89E3;&#xFF0C;&#x6211;&#x4EEC;&#x5FFD;&#x7565;&#x4E86; <strong>&#x591A;&#x6837;&#x672C;&#x3001;&#x591A;&#x901A;&#x9053;</strong>&#x7684;&#x6570;&#x636E;&#x7EF4;&#x5EA6;&#x3002;</p>
<h3 id="%E5%89%8D%E5%90%91%E4%BC%A0%E6%92%AD%E7%9A%84%E6%95%B0%E5%AD%A6%E8%A1%A8%E8%BE%BE">&#x524D;&#x5411;&#x4F20;&#x64AD;&#x7684;&#x6570;&#x5B66;&#x8868;&#x8FBE;</h3>
<h3 id="%E5%8D%95%E9%80%9A%E9%81%93%E5%8D%B7%E7%A7%AF%EF%BC%88%E5%9F%BA%E7%A1%80%E5%BD%A2%E5%BC%8F%EF%BC%89">&#x5355;&#x901A;&#x9053;&#x5377;&#x79EF;&#xFF08;&#x57FA;&#x7840;&#x5F62;&#x5F0F;&#xFF09;</h3>
<p>&#x8BBE;&#x8F93;&#x5165; <code>sample</code> &#x662F;&#x4E00;&#x4E2A;&#x4E8C;&#x7EF4;&#x77E9;&#x9635; $X$&#xFF0C;&#x5377;&#x79EF;&#x6838;&#x4E3A; $W$&#xFF0C;&#x504F;&#x7F6E;&#x4E3A; $b$&#x3002;&#x8F93;&#x51FA;&#x7279;&#x5F81;&#x56FE; $Y$ &#x7684;&#x6BCF;&#x4E00;&#x4E2A;&#x5143;&#x7D20; $y_{i,j}$ &#x7684;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#x4E3A;&#xFF08;&#x6B65;&#x5E45;=1&#xFF0C;&#x586B;&#x5145;=0&#xFF09;&#xFF1A;</p>
<p>$$<br>
y_{i,j} = \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} (x_{i+m, j+n} \cdot w_{m,n}) + b<br>
$$</p>
<ul>
<li>$x_{i+m, j+n}$&#xFF1A;&#x8F93;&#x5165;&#x56FE;&#x50CF;&#x5728;<strong>&#x5377;&#x79EF;&#x7A97;&#x53E3;</strong>&#x5185;&#x7684;&#x6BCF;&#x4E00;&#x4E2A;&#x50CF;&#x7D20;&#x3002;</li>
<li>$w_{m,n}$&#xFF1A;&#x5377;&#x79EF;&#x6838;&#x5728; $(m,n)$ &#x4F4D;&#x7F6E;&#x7684;&#x6743;&#x91CD;&#x3002;</li>
<li>$k$&#xFF1A;&#x5377;&#x79EF;&#x6838;&#x7684;&#x5927;&#x5C0F;&#xFF08;&#x5047;&#x8BBE;&#x4E3A; $k \times k$&#xFF09;&#x3002;</li>
</ul>
<h3 id="%E5%A4%9A%E9%80%9A%E9%81%93%E5%8D%B7%E7%A7%AF%EF%BC%88%E5%AE%9E%E9%99%85%E5%B7%A5%E7%A8%8B%E5%BD%A2%E5%BC%8F%EF%BC%89">&#x591A;&#x901A;&#x9053;&#x5377;&#x79EF;&#xFF08;&#x5B9E;&#x9645;&#x5DE5;&#x7A0B;&#x5F62;&#x5F0F;&#xFF09;</h3>
<p>&#x5728;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x4E2D;&#xFF0C;&#x8F93;&#x5165;&#x901A;&#x5E38;&#x662F;&#x4E09;&#x7EF4;&#x7684; <strong>&#x901A;&#x9053;x&#x9AD8;x&#x5BBD;</strong>&#xFF08;$C \times H \times W$&#xFF09;&#xFF0C;&#x524D;&#x5411;&#x4F20;&#x64AD;&#x4F1A;&#x6D89;&#x53CA;&#x591A;&#x4E2A;&#x8F93;&#x5165;&#x901A;&#x9053;&#x7684;&#x7D2F;&#x52A0;&#x3002;</p>
<p>&#x5047;&#x8BBE;&#xFF1A;</p>
<ul>
<li>&#x8F93;&#x5165; $X$ &#x7684;&#x7EF4;&#x5EA6;&#x4E3A; $(C_{in}, H_{in}, W_{in})$</li>
<li>&#x5377;&#x79EF;&#x6838; $W$ &#x7684;&#x7EF4;&#x5EA6;&#x4E3A; $(C_{out}, C_{in}, k, k)$</li>
<li>&#x8F93;&#x51FA; $Y$ &#x7684;&#x7EF4;&#x5EA6;&#x4E3A; $(C_{out}, H_{out}, W_{out})$</li>
</ul>
<p>&#x7B2C; $f$ &#x4E2A;&#x8F93;&#x51FA;&#x7279;&#x5F81;&#x56FE;&#xFF08;Feature Map&#xFF09;&#x7684;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;&#x4E3A;&#xFF1A;</p>
<p>$$<br>
Y_f = \sum_{c=1}^{C_{in}} (X_c \star W_{f,c}) + b_f<br>
$$</p>
<p>&#x5176;&#x4E2D; $\star$ &#x8868;&#x793A;&#x4E8C;&#x7EF4;&#x5377;&#x79EF;&#x64CD;&#x4F5C;&#x3002;&#x8FD9;&#x610F;&#x5473;&#x7740;&#xFF1A;</p>
<ul>
<li>&#x6BCF;&#x4E00;&#x4E2A;&#x8F93;&#x51FA;&#x901A;&#x9053;&#x90FD;&#x662F;&#x6240;&#x6709;&#x8F93;&#x5165;&#x901A;&#x9053;&#x4E0E;&#x5BF9;&#x5E94;&#x5377;&#x79EF;&#x6838;&#x53C2;&#x6570;&#x5377;&#x79EF;&#x540E;&#x7684;&#x603B;&#x548C;&#x3002;</li>
<li>$C_{out}$&#xFF08;&#x8F93;&#x51FA;&#x901A;&#x9053;&#x6570;&#xFF09;&#x672C;&#x8D28;&#x4E0A;&#x5C31;&#x662F;&#x8FD9;&#x4E00;&#x5C42;&#x6240;&#x4F7F;&#x7528;&#x7684;&#x5377;&#x79EF;&#x6838;&#xFF08;Filters/Kernels&#xFF09;&#x7684;&#x6570;&#x91CF;&#x3002;</li>
</ul>
<p>&#x6216;&#x8005;&#x66F4;&#x8BE6;&#x7EC6;&#x7684;&#x516C;&#x5F0F;:</p>
<p>$$<br>
Y[c_{\text{out}}, i, j] = \sum_{c_{\text{in}}=0}^{C_{\text{in}}-1} \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} X[c_{\text{in}}, i+m, j+n] \cdot W[c_{\text{out}}, c_{\text{in}}, m, n] + B[c_{\text{out}}]<br>
$$</p>
<!-- #endregion -->
<h2 id="im2col%E3%80%81col2im%E5%87%BD%E6%95%B0">im2col&#x3001;col2im&#x51FD;&#x6570;</h2>
<p>&#x7ECF;&#x8FC7;&#x4E0A;&#x9762;&#x7684;&#x6B65;&#x9AA4;&#xFF0C;&#x53EF;&#x77E5;&#x5377;&#x79EF;&#x7B97;&#x6CD5;&#x7684;&#x8FC7;&#x7A0B;&#x5B9E;&#x9645;&#x4E0A;&#x5206;&#x4E3A;&#x4E24;&#x6B65;&#xFF1A;</p>
<ol>
<li>&#x5C06;&#x8F93;&#x5165;&#x56FE;&#x7247;&#x6309;&#x7167;&#x5377;&#x79EF;&#x7A97;&#x53E3;&#x5C55;&#x5F00;</li>
<li>&#x5C06;&#x5C55;&#x5F00;&#x7684;&#x6570;&#x636E;&#x77E9;&#x9635; &#x4E0E; &#x6743;&#x91CD;&#x77E9;&#x9635;&#x8FDB;&#x884C;&#x77E9;&#x9635;&#x4E58;&#x6CD5;</li>
</ol>
<p>&#x56E0;&#x6B64;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86; <code>im2col</code> &#x548C; <code>col2im</code> &#x51FD;&#x6570;&#xFF0C;&#x7528;&#x4E8E;&#x5C06;&#x8F93;&#x5165;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x5C55;&#x5F00;&#x548C;&#x8FD8;&#x539F;&#x3002;</p>
<p>im2col&#x51FD;&#x6570;&#x548C;col2im&#x51FD;&#x6570;&#x7684;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-python">def im2col(input_data, filter_h, filter_w, stride=1, pad=0):
    &quot;&quot;&quot;
    &#x5C06;&#x8F93;&#x5165;&#x56FE;&#x50CF;&#x8F6C;&#x6362;&#x4E3A;&#x5217;&#x77E9;&#x9635;&#xFF0C;&#x4EE5;&#x4FBF;&#x4E8E;&#x540E;&#x7EED;&#x7684;&#x77E9;&#x9635;&#x4E58;&#x6CD5;&#x8FD0;&#x7B97;&#x3002;

    &#x53C2;&#x6570;&#xFF1A;
    input_data: &#x8F93;&#x5165;&#x6570;&#x636E;&#xFF0C;&#x5F62;&#x72B6;&#x4E3A;(N, C, H, W)
    stride : &#x5377;&#x79EF;&#x6B65;&#x957F;
    pad : &#x96F6;&#x586B;&#x5145;&#x5927;&#x5C0F;
    return: &#x8F6C;&#x6362;&#x540E;&#x7684;&#x4E8C;&#x7EF4;&#x77E9;&#x9635;, &#x5F62;&#x72B6;&#x4E3A;(N * out_h * out_w, C * filter_h * filter_w)
    &quot;&quot;&quot;
    N, C, H, W = input_data.shape
    out_h = (H + 2 * pad - filter_h) // stride + 1
    out_w = (W + 2 * pad - filter_w) // stride + 1

    # &#x586B;&#x5145; (Padding)
    img = np.pad(input_data, [(0, 0), (0, 0),
                 (pad, pad), (pad, pad)], &apos;constant&apos;)

    # &#x6BCF;&#x4E00;&#x884C;&#x7684;&#x5927;&#x5C0F;&#x662F;: &#x901A;&#x9053;&#x6570; * &#x5377;&#x79EF;&#x6838;&#x9AD8; * &#x5377;&#x79EF;&#x6838;&#x5BBD;
    # &#x8FD9;&#x91CC;&#x7684;&#x5F62;&#x72B6;&#x5B9A;&#x4E49;&#x53EA;&#x662F;&#x4E3A;&#x4E86;&#x65B9;&#x9762;&#x4E0B;&#x9762;&#x7684;&#x62F7;&#x8D1D;&#x64CD;&#x4F5C;, &#x6700;&#x540E;&#x4F1A;&#x8FDB;&#x884C;&#x7EF4;&#x5EA6;&#x91CD;&#x6392;
    col = np.zeros((N, C, filter_h, filter_w, out_h, out_w))

    for y in range(filter_h):
        y_max = y + stride * out_h
        for x in range(filter_w):
            x_max = x + stride * out_w
            col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]

    # &#x8F6C;&#x7F6E;&#x5E76;&#x91CD;&#x5851;
    return col.transpose(0, 4, 5, 1, 2, 3).reshape(N * out_h * out_w, -1)


def col2im(col, input_shape, filter_h, filter_w, stride=1, pad=0):
    &quot;&quot;&quot;
    &#x5C06;&#x5217;&#x77E9;&#x9635;&#x8F6C;&#x6362;&#x56DE;&#x56FE;&#x50CF;&#x683C;&#x5F0F;&#xFF0C;&#x7528;&#x4E8E;&#x53CD;&#x5411;&#x4F20;&#x64AD;

    &#x53C2;&#x6570;:
    col: &#x5C55;&#x5F00;&#x540E;&#x7684;&#x5217;&#x77E9;&#x9635;, &#x5F62;&#x72B6;&#x4E3A; (N * out_h * out_w, C * filter_h * filter_w)
    input_shape: &#x539F;&#x59CB;&#x6570;&#x636E;&#x7684;&#x5F62;&#x72B6; (N, C, H, W)

    &#x8FD4;&#x56DE;: &#x91CD;&#x5EFA;&#x7684;&#x56FE;&#x50CF;(&#x628A;col&#x4E2D;&#x5377;&#x79EF;&#x7A97;&#x53E3;&#x7684;&#x503C;&#x201C;&#x7D2F;&#x52A0;&#x201D;&#x56DE;&#x6765;, &#x56E0;&#x6B64;&#x8F93;&#x51FA;&#x4E0E;&#x8F93;&#x5165;&#x662F;&#x4E0D;&#x540C;&#x7684;: col2im(im2col(x)) &#x2260; x)
    &quot;&quot;&quot;
    N, C, H, W = input_shape
    out_h = (H + 2 * pad - filter_h) // stride + 1
    out_w = (W + 2 * pad - filter_w) // stride + 1

    # &#x91CD;&#x5851;&#x5E76;&#x8F6C;&#x7F6E;&#x56DE;&#x539F;&#x59CB;&#x7EF4;&#x5EA6;&#x987A;&#x5E8F;
    col = col.reshape(N, out_h, out_w, C, filter_h,
                      filter_w).transpose(0, 3, 4, 5, 1, 2)

    img = np.zeros((N, C, H + 2 * pad + stride - 1, W + 2 * pad + stride - 1))

    for y in range(filter_h):
        y_max = y + stride * out_h
        for x in range(filter_w):
            x_max = x + stride * out_w
            # &#x5173;&#x952E;&#xFF1A;&#x7D2F;&#x52A0;&#x91CD;&#x53E0;&#x90E8;&#x5206;&#x7684;&#x68AF;&#x5EA6;
            img[:, :, y:y_max:stride, x:x_max:stride] += col[:, :, y, x, :, :]

    # &#x5207;&#x9664; padding &#x90E8;&#x5206;
    return img[:, :, pad:H + pad, pad:W + pad]
</code></pre>
<pre><code class="language-python">images = sample.reshape(1, 1, H, W)
cprint(f&apos;images:\n{images}\n&apos;)

col = im2col(images, FH, FW)
cprint(f&apos;col:\n{col}\n&apos;)

img = col2im(col, images.shape, FH, FW)
cprint(f&apos;img:\n{img}\n&apos;, &apos;yellow&apos;)
</code></pre>
<p>&#x8F93;&#x51FA;:</p>
<pre><code class="language-sh">images:
[[[[ 0  1  2  3]
   [ 4  5  6  7]
   [ 8  9 10 11]
   [12 13 14 15]]]]

col:
[[ 0.  1.  2.  4.  5.  6.  8.  9. 10.]
 [ 1.  2.  3.  5.  6.  7.  9. 10. 11.]
 [ 4.  5.  6.  8.  9. 10. 12. 13. 14.]
 [ 5.  6.  7.  9. 10. 11. 13. 14. 15.]]

img:
[[[[ 0.  2.  4.  3.]
   [ 8. 20. 24. 14.]
   [16. 36. 40. 22.]
   [12. 26. 28. 15.]]]]
</code></pre>
<p>&#x89C2;&#x5BDF;<code>images</code>&#x5230;<code>img</code>&#x7684;&#x7ED3;&#x679C;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;:</p>
<p><strong>&#x4E2D;&#x95F4;&#x50CF;&#x7D20;&#x88AB;&#x5377;&#x79EF;&#x7A97;&#x53E3;&#x8986;&#x76D6;&#x4E86;&#x591A;&#x6B21;&#xFF0C;&#x5728; <code>col2im</code> &#x4E2D;&#x88AB;&#x591A;&#x6B21;&#x7D2F;&#x52A0;&#x4E86;&#x3002;</strong> &#x800C;&#x8FB9;&#x89D2;&#x50CF;&#x7D20;&#x53EA;&#x88AB;&#x8986;&#x76D6;&#x4E00;&#x6B21;&#xFF0C;&#x6240;&#x4EE5;&#x5B83;&#x4EEC;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;</p>
<p>&#x56E0;&#x6B64;, &#x5BF9;&#x4E8E;<strong>&#x8FB9;&#x7F18;&#x975E;&#x8FB9;&#x89D2;</strong>&#x5143;&#x7D20;&#x88AB;&#x7D2F;&#x52A0;&#x4E24;&#x6B21;, &#x4E2D;&#x95F4;&#x5143;&#x7D20;&#x88AB;&#x7D2F;&#x52A0;&#x56DB;&#x6B21;&#x3002;</p>
<p>&#x5173;&#x4E8E;&#x8F93;&#x51FA;&#x7684;&#x5F62;&#x72B6;, &#x53EF;&#x80FD;&#x4E0E;&#x5176;&#x4ED6;&#x5B9E;&#x73B0;&#x5B58;&#x5728;&#x5DEE;&#x5F02;&#xFF0C;&#x4F46;&#x4E0D;&#x5F71;&#x54CD;&#x903B;&#x8F91;&#x3002;</p>
<hr>
<p>&#x518D;&#x770B;&#x770B;&#x5B8C;&#x6574;&#x7684;RGB&#x56FE;&#x50CF;&#x7684;&#x6570;&#x636E;&#x6837;&#x672C;:</p>
<pre><code class="language-python">cprint(f&apos;RGB&#x4E09;&#x901A;&#x9053;&#x56FE;&#x7247;:\n&apos;)
C = 3  # RGB &#x4E09;&#x901A;&#x9053;
img = np.arange(1*C*H*W).reshape(1, C, H, W)
col = im2col(img, FH, FW)
# cprint(f&apos;&#x539F;&#x59CB;&#x6570;&#x636E;:\n{img}\n&apos;)
cprint(f&apos;&#x5377;&#x79EF;&#x7A97;&#x53E3;&#x6570;&#x636E;:\n{col}\n&apos;, &apos;green&apos;)

FN = 2  # &#x5377;&#x79EF;&#x6838;&#x4E2A;&#x6570;
kernel = np.arange(FN*C*FH*FW).reshape(FN, C, FH, FW)
weight = kernel.reshape(FN, -1).T
# cprint(f&apos;&#x5377;&#x79EF;&#x6838;:\n{kernel}\n&apos;, &apos;red&apos;)
# cprint(f&apos;&#x6743;&#x91CD;&#x503C;:\n{weight}\n&apos;, &apos;red&apos;)
output = np.dot(col, weight)
cprint(f&apos;&#x7279;&#x5F81;&#x6570;&#x636E;:\n{output}\n&apos;, &apos;yellow&apos;)

# &#x8F6C;&#x6362;&#x4E3A;&#x7279;&#x5F81;&#x56FE;
out_h, out_w = (2, 2)  # &#x7279;&#x5F81;&#x56FE;&#x5927;&#x5C0F;
output = output.reshape(N, out_h, out_w, -1)
output = output.transpose(0, 3, 1, 2)
cprint(f&apos;&#x7279;&#x5F81;&#x56FE;:\n{output}\n&apos;, &apos;red&apos;)
</code></pre>
<p>&#x8F93;&#x51FA;:</p>
<pre><code class="language-sh">RGB&#x4E09;&#x901A;&#x9053;&#x56FE;&#x7247;:

&#x5377;&#x79EF;&#x7A97;&#x53E3;&#x6570;&#x636E;:
[[ 0.  1.  2.  4.  5.  6.  8.  9. 10. 16. 17. 18. 20. 21. 22. 24. 25. 26.
  32. 33. 34. 36. 37. 38. 40. 41. 42.]
 [ 1.  2.  3.  5.  6.  7.  9. 10. 11. 17. 18. 19. 21. 22. 23. 25. 26. 27.
  33. 34. 35. 37. 38. 39. 41. 42. 43.]
 [ 4.  5.  6.  8.  9. 10. 12. 13. 14. 20. 21. 22. 24. 25. 26. 28. 29. 30.
  36. 37. 38. 40. 41. 42. 44. 45. 46.]
 [ 5.  6.  7.  9. 10. 11. 13. 14. 15. 21. 22. 23. 25. 26. 27. 29. 30. 31.
  37. 38. 39. 41. 42. 43. 45. 46. 47.]]

&#x7279;&#x5F81;&#x6570;&#x636E;:
[[10197. 25506.]
 [10548. 26586.]
 [11601. 29826.]
 [11952. 30906.]]

&#x7279;&#x5F81;&#x56FE;:
[[[[10197. 10548.]
   [11601. 11952.]]

  [[25506. 26586.]
   [29826. 30906.]]]]
</code></pre>
<p>&#x5BF9;&#x6BD4;&#x4E0A;&#x4E00;&#x4E2A;&#x5355;&#x901A;&#x9053;&#x6570;&#x636E;, &#x53EF;&#x4EE5;&#x770B;&#x51FA; <code>im2col</code> &#x51FD;&#x6570;&#x8F93;&#x51FA;&#x7684;&#x4E8C;&#x7EF4;&#x6570;&#x636E;&#x4E2D;, &#x6BCF;&#x4E00;&#x884C; &#x8868;&#x793A;&#x6837;&#x672C;&#x5728;<code>&#x5377;&#x79EF;&#x6838;</code>&#x4E2D;&#x6ED1;&#x52A8;&#x65F6;&#x7684;<code>&#x7A97;&#x53E3;&#x6570;&#x636E;</code>&#x3002;</p>
<p>&#x5982;&#x679C;&#x6709;&#x591A;&#x4E2A;&#x901A;&#x9053;, &#x5219;&#x540C;&#x65F6;&#x5305;&#x542B;&#x591A;&#x4E2A;&#x901A;&#x9053;&#x7684;<code>&#x7A97;&#x53E3;&#x6570;&#x636E;</code>&#x3002; &#x672C;&#x8D28;&#x4E0A;&#x5C31;&#x662F;&#x4E3A;&#x4E86;&#x6EE1;&#x8DB3;&#x540E;&#x9762;&#x7684;&#x77E9;&#x9635;&#x8FD0;&#x7B97;, &#x56E0;&#x6B64;&#x9700;&#x8981;&#x5148;&#x6784;&#x5EFA;&#x6570;&#x636E;&#x3002;</p>
<p>&#x518D;&#x770B;&#x7279;&#x5F81;&#x6570;&#x636E;&#x90E8;&#x5206;, &#x6BCF;&#x4E00;&#x884C;&#x662F;&#x5377;&#x79EF;&#x6838;&#x5728;&#x5F53;&#x524D;&#x6ED1;&#x52A8;&#x7684;&#x5377;&#x79EF;&#x7A97;&#x53E3;&#x4E2D;&#x7684;&#x7279;&#x5F81;&#x503C;, &#x5217;&#x662F;&#x4E0D;&#x540C;&#x7684;&#x5377;&#x79EF;&#x6838;&#x3002;</p>
<p>&#x901A;&#x8FC7;&#x7279;&#x5F81;&#x6570;&#x636E;&#x53D8;&#x5F62;&#x518D;&#x91CD;&#x6392;&#x540E;, &#x5C31;&#x53EF;&#x4EE5;&#x5F97;&#x5230;&#x5377;&#x79EF;&#x6838;&#x5BF9;&#x5E94;&#x7684;&#x7279;&#x5F81;&#x56FE;&#x4E86;&#x3002;</p>
<p>&#x7279;&#x5F81;&#x56FE;&#x6D53;&#x7F29;&#x4E86;&#x6574;&#x4E2A;&#x8F93;&#x5165;&#x6837;&#x672C;&#x76F8;&#x5BF9;&#x4E8E;&#x5377;&#x79EF;&#x6838;&#x7684;&#x7279;&#x6027;&#x4FE1;&#x606F;&#xFF0C;&#x76F8;&#x5F53;&#x4E8E;&#x6570;&#x636E;&#x88AB;&#x5377;&#x79EF;&#x6838;&#x7B5B;&#x9009;&#x51FA;&#x6765;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x56E0;&#x6B64;&#x5377;&#x79EF;&#x6838;&#x53C8;&#x53EB;<strong>&#x8FC7;&#x6EE4;&#x5668;</strong>&#x3002;</p>
<h2 id="%E5%8D%B7%E7%A7%AF%E5%B1%82%E7%9A%84%E5%AE%9E%E7%8E%B0">&#x5377;&#x79EF;&#x5C42;&#x7684;&#x5B9E;&#x73B0;</h2>
<pre><code class="language-python">class ConvolutionalLayer:
    &quot;&quot;&quot;&#x5377;&#x79EF;&#x5C42;&#x5B9E;&#x73B0;&quot;&quot;&quot;

    def __init__(self, weights, biases, stride=1, padding=0):
        &quot;&quot;&quot;
        &#x521D;&#x59CB;&#x5316;&#x5377;&#x79EF;&#x5C42;

        &#x53C2;&#x6570;:
        weights : &#x5377;&#x79EF;&#x6838;&#x6743;&#x91CD;&#xFF0C;&#x5F62;&#x72B6;&#x4E3A;(&#x8F93;&#x51FA;&#x901A;&#x9053;&#x6570;, &#x8F93;&#x5165;&#x901A;&#x9053;&#x6570;, &#x9AD8;&#x5EA6;, &#x5BBD;&#x5EA6;)
        biases : &#x504F;&#x7F6E;&#x9879;&#xFF0C;&#x5F62;&#x72B6;&#x4E3A;(&#x8F93;&#x51FA;&#x901A;&#x9053;&#x6570;,)
        stride : &#x5377;&#x79EF;&#x6B65;&#x957F;
        padding : &#x96F6;&#x586B;&#x5145;&#x5927;&#x5C0F;
        &quot;&quot;&quot;
        self.weights = weights
        self.biases = biases
        self.stride = stride
        self.padding = padding

        # &#x4E2D;&#x95F4;&#x53D8;&#x91CF;&#xFF08;&#x7528;&#x4E8E;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#xFF09;
        self.x = None
        self.col = None
        self.colWeights = None

        # &#x53C2;&#x6570;&#x7684;&#x68AF;&#x5EA6;
        self.dweights = None
        self.dbiases = None

    def forward(self, input_data):
        &quot;&quot;&quot;
        &#x524D;&#x5411;&#x4F20;&#x64AD;

        &#x53C2;&#x6570;:
        input_data : &#x8F93;&#x5165;&#x6570;&#x636E;&#xFF0C;&#x5F62;&#x72B6;&#x4E3A;(&#x6837;&#x672C;&#x5927;&#x5C0F;, &#x901A;&#x9053;&#x6570;, &#x9AD8;&#x5EA6;, &#x5BBD;&#x5EA6;)

        &#x8FD4;&#x56DE;:
        output : &#x5377;&#x79EF;&#x6838;&#x5BF9;&#x5E94;&#x7684;&#x7279;&#x5F81;&#x56FE;&#xFF0C;&#x5F62;&#x72B6;&#x4E3A;(N, FN, out_h, out_w)
        &quot;&quot;&quot;
        FN, C, FH, FW = self.weights.shape
        N, C, H, W = input_data.shape

        # &#x8BA1;&#x7B97;&#x8F93;&#x51FA;&#x7279;&#x5F81;&#x56FE;&#x7684;&#x5927;&#x5C0F;
        out_h = (H + 2 * self.padding - FH) // self.stride + 1
        out_w = (W + 2 * self.padding - FW) // self.stride + 1

        # &#x5C06;&#x8F93;&#x5165;&#x56FE;&#x50CF;&#x8F6C;&#x6362;&#x4E3A;&#x884C;&#x77E9;&#x9635;
        row_matrix = im2col(input_data, FH, FW, self.stride, self.padding)

        # &#x5C06;&#x6743;&#x91CD;&#x77E9;&#x9635;&#x91CD;&#x5851;&#x4E3A;&#x5217;&#x683C;&#x5F0F;
        column_matrix = self.weights.reshape(FN, -1).T

        # &#x6267;&#x884C;&#x77E9;&#x9635;&#x4E58;&#x6CD5;&#x5B9E;&#x73B0;&#x5377;&#x79EF;
        output = np.dot(row_matrix, column_matrix) + self.biases

        # &#x5C06;&#x8F93;&#x51FA;&#x91CD;&#x5851;&#x4E3A;&#x6B63;&#x786E;&#x7684;4&#x7EF4;&#x683C;&#x5F0F;
        output = output.reshape(N, out_h, out_w, -1)
        output = output.transpose(0, 3, 1, 2)

        # &#x4FDD;&#x5B58;&#x4E2D;&#x95F4;&#x53D8;&#x91CF;&#x7528;&#x4E8E;&#x53CD;&#x5411;&#x4F20;&#x64AD;
        self.x = input_data
        self.col = row_matrix
        self.colWeights = column_matrix

        return output

    def backward(self, dout):
        &quot;&quot;&quot;
        &#x53CD;&#x5411;&#x4F20;&#x64AD;

        &#x53C2;&#x6570;:
        dout : &#x8F93;&#x51FA;&#x5C42;&#x7684;&#x68AF;&#x5EA6;, &#x5F62;&#x72B6;(N, FN, out_h, out_w)

        &#x8FD4;&#x56DE;:
        gradient_input : &#x8F93;&#x5165;&#x5C42;&#x7684;&#x68AF;&#x5EA6;
        &quot;&quot;&quot;
        FN, C, FH, HW = self.weights.shape

        # &#x8C03;&#x6574;&#x68AF;&#x5EA6;&#x8F93;&#x51FA;&#x7684;&#x5F62;&#x72B6;, &#x901A;&#x9053;&#x8C03;&#x6574;&#x5230;&#x6700;&#x540E;
        dout = dout.transpose(0, 2, 3, 1).reshape(-1, FN)

        # &#x8BA1;&#x7B97;&#x504F;&#x7F6E;&#x9879;&#x7684;&#x68AF;&#x5EA6;, &#x6BCF;&#x4E2A;&#x7279;&#x5F81;&#x56FE;&#x7684;&#x68AF;&#x5EA6;&#x6C42;&#x548C;&#x4F5C;&#x4E3A;&#x8BE5;&#x5377;&#x79EF;&#x6838;&#x7684;&#x504F;&#x7F6E;
        self.dbiases = np.sum(dout, axis=0)

        # &#x8BA1;&#x7B97;&#x6743;&#x91CD;&#x7684;&#x68AF;&#x5EA6;
        self.dweights = np.dot(self.col.T, dout)
        self.dweights = self.dweights.transpose(1, 0).reshape(FN,
                                                              C,
                                                              FH,
                                                              HW)

        # &#x8BA1;&#x7B97;&#x8F93;&#x5165;&#x6570;&#x636E;&#x7684;&#x68AF;&#x5EA6;
        dcol = np.dot(dout, self.colWeights.T)
        dx = col2im(dcol,
                    self.x.shape,
                    FH,
                    HW,
                    self.stride,
                    self.padding)
        return dx


# -------------------------------------------------------------------
# &#x6784;&#x9020;&#x8F93;&#x5165;
x = np.random.randn(2, 3, 5, 5)        # N=2, C=3
w = np.random.randn(4, 3, 3, 3)        # FN=4
b = np.random.randn(4)

conv = ConvolutionalLayer(w, b, stride=1, padding=1)

# &#x524D;&#x5411;&#x4F20;&#x64AD;
out = conv.forward(x)

# &#x6CE8;&#x610F;&#x8F93;&#x51FA;&#x683C;&#x5F0F;&#x4E3A;: (N, FN, out_h, out_w)
# &#x8FD9;&#x8868;&#x793A;&#x6BCF;&#x4E2A;&#x6837;&#x672C;&#x7684;
print(&quot;output shape:&quot;, out.shape)  # (2, 4, 5, 5)

# &#x6784;&#x9020;&#x4E0A;&#x6E38;&#x68AF;&#x5EA6;
dout = np.random.randn(*out.shape)

# backward
dx = conv.backward(dout)
print(&quot;dx shape:&quot;, dx.shape)
print(&quot;dw shape:&quot;, conv.dweights.shape)
print(&quot;db shape:&quot;, conv.dbiases.shape)
</code></pre>
<p>&#x8F93;&#x51FA;:</p>
<pre><code class="language-sh">output shape: (2, 4, 5, 5)
dx shape: (2, 3, 5, 5)
dw shape: (4, 3, 3, 3)
db shape: (4,)
</code></pre>
<pre><code class="language-python">
def numerical_gradient(conv, x, dout, eps=1e-5):
    grad_w = np.zeros_like(conv.weights)

    it = np.nditer(conv.weights, flags=[&apos;multi_index&apos;], op_flags=[&apos;readwrite&apos;])
    while not it.finished:
        idx = it.multi_index
        old = conv.weights[idx]

        conv.weights[idx] = old + eps
        out1 = conv.forward(x)
        loss1 = np.sum(out1 * dout)

        conv.weights[idx] = old - eps
        out2 = conv.forward(x)
        loss2 = np.sum(out2 * dout)

        grad_w[idx] = (loss1 - loss2) / (2 * eps)
        conv.weights[idx] = old
        it.iternext()

    return grad_w


# &#x6570;&#x503C;&#x68AF;&#x5EA6; vs &#x53CD;&#x5411;&#x4F20;&#x64AD;
num_dw = numerical_gradient(conv, x, dout)
max_diff = np.max(np.abs(num_dw - conv.dweights))
print(&quot;max diff:&quot;, max_diff)
</code></pre>
<p>&#x8F93;&#x51FA;:</p>
<pre><code class="language-sh">max diff: 2.0845973836003395e-09
</code></pre>
<h2 id="%E5%8F%8D%E5%90%91%E4%BC%A0%E6%92%AD%E7%9A%84%E6%95%B0%E5%AD%A6%E8%A1%A8%E8%BE%BE">&#x53CD;&#x5411;&#x4F20;&#x64AD;&#x7684;&#x6570;&#x5B66;&#x8868;&#x8FBE;</h2>
<p>&#x53CD;&#x5411;&#x4F20;&#x64AD;&#x7684;&#x4E3B;&#x8981;&#x76EE;&#x6807;&#x662F;&#x8BA1;&#x7B97;&#x4E24;&#x4E2A;&#x68AF;&#x5EA6;&#xFF1A;</p>
<ul>
<li>&#x635F;&#x5931;&#x51FD;&#x6570;&#x5BF9;&#x8F93;&#x5165;&#x7684;&#x68AF;&#x5EA6;&#xFF08;&#x7528;&#x4E8E;&#x5C06;&#x8BEF;&#x5DEE;&#x4F20;&#x9012;&#x7ED9;&#x524D;&#x4E00;&#x5C42;&#xFF09;&#x3002;</li>
<li>&#x635F;&#x5931;&#x51FD;&#x6570;&#x5BF9;&#x5377;&#x79EF;&#x6838;&#x53C2;&#x6570;&#x7684;&#x68AF;&#x5EA6;&#xFF08;&#x7528;&#x4E8E;&#x66F4;&#x65B0;&#x5F53;&#x524D;&#x5C42;&#x7684;&#x6743;&#x91CD;&#xFF09;&#x3002;</li>
</ul>
<p>&#x5728;&#x5377;&#x79EF;&#x5C42;&#x7684;&#x524D;&#x5411;&#x4F20;&#x64AD;&#x4E2D;&#xFF0C;&#x8F93;&#x5165;&#x77E9;&#x9635; $X \in \mathbb{R}^{C_{\text{in}} \times H_{\text{in}} \times W_{\text{in}}}$ &#x4E0E;&#x5377;&#x79EF;&#x6838; $W \in \mathbb{R}^{C_{\text{out}} \times C_{\text{in}} \times k_H \times k_W}$ &#x8FDB;&#x884C;&#x5377;&#x79EF;&#x5F97;&#x5230;&#x8F93;&#x51FA; <strong>&#x7279;&#x5F81;&#x56FE;</strong> $Y \in \mathbb{R}^{C_{\text{out}} \times H_{\text{out}} \times W_{\text{out}}}$&#x3002;</p>
<p>&#x5728;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x4ECE;&#x4E0B;&#x4E00;&#x5C42;&#x62FF;&#x5230;&#x4E86;<strong>&#x8F93;&#x51FA;&#x68AF;&#x5EA6;</strong>&#xFF08;$\frac{\partial L}{\partial Y}$&#xFF09;&#xFF0C;&#x901A;&#x5E38;&#x88AB;&#x79F0;&#x4E3A;&#x201C;&#x8BEF;&#x5DEE;&#x9879;&#x201D;&#x6216; $\delta$&#x3002;</p>
<p>$$<br>
\frac{\partial L}{\partial Y} \in \mathbb{R}^{C_{\text{out}} \times H_{\text{out}} \times W_{\text{out}}}<br>
$$</p>
<p>&#x8BBE;<strong>&#x8BEF;&#x5DEE;&#x6216;&#x635F;&#x5931;&#x51FD;&#x6570;</strong>&#x4E3A;:</p>
<p>$$<br>
L = Loss(Y)<br>
$$</p>
<p>&#x6839;&#x636E; <strong>&#x524D;&#x5411;&#x4F20;&#x64AD;</strong>&#x7684;&#x516C;&#x5F0F;&#xFF1A;</p>
<p>$$<br>
Y = \sum_{c=1}^{C_{in}} (X \star W) + b<br>
$$</p>
<p>&#x5206;&#x522B;&#x8BA1;&#x7B97; $\frac{\partial L}{\partial W}$ &#x3001;$\frac{\partial L}{\partial X}$ &#x548C; $\frac{\partial L}{\partial b}$&#x3002;</p>
<h3 id="%E5%AF%B9%E6%9D%83%E9%87%8D-w-%E6%B1%82%E5%AF%BC%EF%BC%88%E6%9B%B4%E6%96%B0%E5%8F%82%E6%95%B0%EF%BC%89">&#x5BF9;&#x6743;&#x91CD; $W$ &#x6C42;&#x5BFC;&#xFF08;&#x66F4;&#x65B0;&#x53C2;&#x6570;&#xFF09;</h3>
<p>&#x6839;&#x636E;&#x94FE;&#x5F0F;&#x6CD5;&#x5219;&#xFF0C;&#x5BF9;&#x4E8E;&#x6743;&#x91CD; $W[c_{\text{out}}, c_{\text{in}}, i, j]$&#xFF1A;</p>
<p>$$<br>
\frac{\partial L}{\partial W[c_{\text{out}}, c_{\text{in}}, i, j]} = \sum_{m=0}^{H_{\text{out}}-1} \sum_{n=0}^{W_{\text{out}}-1} \frac{\partial L}{\partial Y[c_{\text{out}}, m, n]} \cdot \frac{\partial Y[c_{\text{out}}, m, n]}{\partial W[c_{\text{out}}, c_{\text{in}}, i, j]}<br>
$$</p>
<p>&#x4ECE;&#x524D;&#x5411;&#x516C;&#x5F0F;&#x53EF;&#x77E5;&#xFF1A;</p>
<p>$$<br>
\frac{\partial Y[c_{\text{out}}, m, n]}{\partial W[c_{\text{out}}, c_{\text{in}}, i, j]} = X[c_{\text{in}}, m+i, n+j]<br>
$$</p>
<p>&#x56E0;&#x6B64;&#xFF1A;</p>
<p>$$<br>
\frac{\partial L}{\partial W[c_{\text{out}}, c_{\text{in}}, i, j]} = \sum_{m=0}^{H_{\text{out}}-1} \sum_{n=0}^{W_{\text{out}}-1} \frac{\partial L}{\partial Y[c_{\text{out}}, m, n]} \cdot X[c_{\text{in}}, m+i, n+j]<br>
$$</p>
<h4 id="32-%E5%90%91%E9%87%8F%E5%8C%96%E5%BD%A2%E5%BC%8F%EF%BC%88%E4%BA%92%E7%9B%B8%E5%85%B3%E8%BF%90%E7%AE%97%EF%BC%89">3.2 &#x5411;&#x91CF;&#x5316;&#x5F62;&#x5F0F;&#xFF08;&#x4E92;&#x76F8;&#x5173;&#x8FD0;&#x7B97;&#xFF09;</h4>
<p>&#x8FD9;&#x7B49;&#x4EF7;&#x4E8E;&#x5BF9;&#x6BCF;&#x4E2A;&#x8F93;&#x51FA;&#x901A;&#x9053; $c_{\text{out}}$ &#x548C;&#x8F93;&#x5165;&#x901A;&#x9053; $c_{\text{in}}$&#xFF0C;&#x6267;&#x884C;&#x4EE5;&#x4E0B;&#x4E92;&#x76F8;&#x5173;&#x8FD0;&#x7B97;&#xFF1A;</p>
<p>$$<br>
\frac{\partial L}{\partial W[c_{\text{out}}, c_{\text{in}}]} = X[c_{\text{in}}] \star \frac{\partial L}{\partial Y[c_{\text{out}}]}<br>
$$</p>
<p><strong>&#x5B8C;&#x6574;&#x516C;&#x5F0F;</strong>&#xFF1A;<br>
$$<br>
\boxed{\frac{\partial L}{\partial W} = X \star \frac{\partial L}{\partial Y}}<br>
$$</p>
<p>&#x5176;&#x4E2D; $\star$ &#x662F;&#x4E92;&#x76F8;&#x5173;&#x8FD0;&#x7B97;&#xFF0C;&#x7EF4;&#x5EA6;&#x53D8;&#x5316;&#xFF1A;</p>
<ul>
<li>$X$: $(C_{\text{in}}, H_{\text{in}}, W_{\text{in}})$</li>
<li>$\frac{\partial L}{\partial Y}$: $(C_{\text{out}}, H_{\text{out}}, W_{\text{out}})$</li>
<li>$\frac{\partial L}{\partial W}$: $(C_{\text{out}}, C_{\text{in}}, k_H, k_W)$</li>
</ul>
<h3 id="%E5%AF%B9%E8%BE%93%E5%85%A5-x-%E6%B1%82%E5%AF%BC%EF%BC%88%E4%BC%A0%E9%80%92%E8%AF%AF%E5%B7%AE%EF%BC%89">&#x5BF9;&#x8F93;&#x5165; $X$ &#x6C42;&#x5BFC;&#xFF08;&#x4F20;&#x9012;&#x8BEF;&#x5DEE;&#xFF09;</h3>
<p>&#x4E3A;&#x4E86;&#x8BA9;&#x8BEF;&#x5DEE;&#x7EE7;&#x7EED;&#x5411;&#x524D;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x8BA1;&#x7B97; $\frac{\partial L}{\partial X}$&#x3002;</p>
<p>&#x5BF9;&#x4E8E;&#x8F93;&#x5165;&#x5143;&#x7D20; $X[c_{\text{in}}, h_x, w_x]$&#xFF1A;</p>
<p>$$<br>
\frac{\partial L}{\partial X[c_{\text{in}}, h_x, w_x]} = \sum_{c_{\text{out}}=0}^{C_{\text{out}}-1} \sum_{h=0}^{H_{\text{out}}-1} \sum_{w=0}^{W_{\text{out}}-1} \frac{\partial L}{\partial Y[c_{\text{out}}, h, w]} \cdot \frac{\partial Y[c_{\text{out}}, h, w]}{\partial X[c_{\text{in}}, h_x, w_x]}<br>
$$</p>
<p><strong>&#x6CE8;&#x610F;</strong>&#xFF1A;</p>
<ul>
<li>$h$&#x3001;$w$ &#x8868;&#x793A;&#x8F93;&#x51FA;&#x7279;&#x5F81;&#x56FE;&#x7684;&#x884C;&#x3001;&#x5217;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x89C6;&#x4E3A;<strong>&#x6ED1;&#x52A8;&#x5377;&#x79EF;&#x7A97;&#x53E3;&#x5728;&#x8F93;&#x5165;&#x5143;&#x7D20;&#x5185;&#x90E8;&#x7684;&#x504F;&#x79FB;&#x91CF;</strong>&#x3002;</li>
<li>$h_x$&#x3001;$w_x$ &#x8868;&#x793A;&#x8F93;&#x5165;&#x5143;&#x7D20;&#x5185;&#x7684;&#x5B9E;&#x9645;&#x5750;&#x6807;&#x3002;</li>
<li>$k_H$&#x3001;$k_W$ &#x8868;&#x793A;&#x5377;&#x79EF;&#x6838;&#x7684;&#x5BBD;&#x3001;&#x9AD8;&#x3002;</li>
</ul>
<p>&#x4ECE;&#x524D;&#x5411;&#x516C;&#x5F0F;&#x53EF;&#x77E5;&#xFF0C;&#x53EA;&#x6709;&#x5F53;&#x6EE1;&#x8DB3;&#x4EE5;&#x4E0B;&#x6761;&#x4EF6;&#x65F6;&#xFF0C;&#x504F;&#x5BFC;&#x6570;&#x975E;&#x96F6;&#xFF1A;</p>
<p>$$<br>
\frac{\partial Y[c_{\text{out}}, h, w]}{\partial X[c_{\text{in}}, h_x, w_x]} =<br>
\begin{cases}<br>
W[c_{\text{out}}, c_{\text{in}}, h_x-h, w_x-w] &amp; \text{if } 0 \leq h_x-h &lt; k_H \text{ and } 0 \leq w_x-w &lt; k_W \\<br>
0 &amp; \text{otherwise}<br>
\end{cases}<br>
$$</p>
<p>&#x4EE4; $i = h_x - h$, $j = w_x - w$&#xFF0C;&#x5219;&#xFF1A;<br>
$$<br>
\frac{\partial L}{\partial X[c_{\text{in}}, h_x, w_x]} = \sum_{c_{\text{out}}=0}^{C_{\text{out}}-1} \sum_{i=0}^{k_H-1} \sum_{j=0}^{k_W-1} \frac{\partial L}{\partial Y[c_{\text{out}}, h_x-i, w_x-j]} \cdot W[c_{\text{out}}, c_{\text{in}}, i, j]<br>
$$</p>
<p><strong>&#x6CE8;&#x610F;</strong>&#xFF1A;$i$&#x3001;$j$ &#x53EF;&#x4EE5;&#x770B;&#x4F5C;&#x662F;&#x6ED1;&#x52A8;&#x5377;&#x79EF;&#x7A97;&#x53E3;&#x5185;&#x90E8;&#x5143;&#x7D20;&#x8DDD;&#x79BB;&#x7A97;&#x53E3;&#x5DE6;&#x4E0A;&#x89D2;&#x7684;&#x504F;&#x79FB;&#xFF0C;&#x56E0;&#x6B64;&#x5B83;&#x4EEC;&#x7684;&#x53D6;&#x503C;&#x8303;&#x56F4;&#x662F; $[0, K]$&#x3002;</p>
<h4 id="42-%E5%90%91%E9%87%8F%E5%8C%96%E5%BD%A2%E5%BC%8F%EF%BC%88%E5%85%A8%E5%8D%B7%E7%A7%AF%E8%BF%90%E7%AE%97%EF%BC%89">4.2 &#x5411;&#x91CF;&#x5316;&#x5F62;&#x5F0F;&#xFF08;&#x5168;&#x5377;&#x79EF;&#x8FD0;&#x7B97;&#xFF09;</h4>
<p>&#x8FD9;&#x7B49;&#x4EF7;&#x4E8E;&#x4E00;&#x4E2A;<strong>&#x5168;&#x5377;&#x79EF;</strong>&#xFF08;full convolution&#xFF09;&#x8FD0;&#x7B97;&#xFF1A;<br>
$$<br>
\frac{\partial L}{\partial X[c_{\text{in}}]} = \sum_{c_{\text{out}}=0}^{C_{\text{out}}-1} \text{full_conv}\left( \frac{\partial L}{\partial Y[c_{\text{out}}]}, \text{rot180}(W[c_{\text{out}}, c_{\text{in}}]) \right)<br>
$$</p>
<p>&#x5176;&#x4E2D; $\text{rot180}(\cdot)$ &#x8868;&#x793A;&#x5C06;&#x77E9;&#x9635;&#x65CB;&#x8F6C;180&#x5EA6;&#xFF08;&#x5373;&#x4E0A;&#x4E0B;&#x7FFB;&#x8F6C;+&#x5DE6;&#x53F3;&#x7FFB;&#x8F6C;&#xFF09;&#xFF0C;$\text{full_conv}$ &#x8868;&#x793A;&#x5168;&#x5377;&#x79EF;&#x3002;</p>
<p><strong>&#x7B49;&#x4EF7;&#x5F62;&#x5F0F;&#xFF08;&#x4F7F;&#x7528;&#x4E92;&#x76F8;&#x5173;&#x548C;&#x586B;&#x5145;&#xFF09;</strong>&#xFF1A;<br>
$$<br>
\boxed{\frac{\partial L}{\partial X} = \text{pad}\left(\frac{\partial L}{\partial Y}\right) \star \text{rot180}(W)}<br>
$$</p>
<p>&#x6216;&#x8005;&#x4F7F;&#x7528;&#x8F6C;&#x7F6E;&#x5377;&#x79EF;&#x8868;&#x793A;&#xFF1A;<br>
$$<br>
\boxed{\frac{\partial L}{\partial X} = \text{transposed_conv}\left(\frac{\partial L}{\partial Y}, W\right)}<br>
$$</p>
<p>&#x7EF4;&#x5EA6;&#x53D8;&#x5316;&#xFF1A;</p>
<ul>
<li>$\frac{\partial L}{\partial Y}$: $(C_{\text{out}}, H_{\text{out}}, W_{\text{out}})$</li>
<li>$W$: $(C_{\text{out}}, C_{\text{in}}, k_H, k_W)$</li>
<li>$\frac{\partial L}{\partial X}$: $(C_{\text{in}}, H_{\text{in}}, W_{\text{in}})$</li>
</ul>
<h3 id="%E5%AF%B9%E5%81%8F%E7%BD%AE-b-%E6%B1%82%E5%AF%BC">&#x5BF9;&#x504F;&#x7F6E; $b$ &#x6C42;&#x5BFC;</h3>
<p>&#x504F;&#x7F6E;&#x9879;&#x7684;&#x8BA1;&#x7B97;&#x6700;&#x7B80;&#x5355;&#x3002;&#x7531;&#x4E8E;&#x4E00;&#x4E2A;&#x5377;&#x79EF;&#x6838;&#x901A;&#x5E38;&#x5171;&#x4EAB;&#x4E00;&#x4E2A;&#x504F;&#x7F6E;&#xFF0C;&#x56E0;&#x6B64;&#x504F;&#x7F6E;&#x7684;&#x68AF;&#x5EA6;&#x5C31;&#x662F;&#x5BF9;&#x5E94;&#x8F93;&#x51FA;&#x68AF;&#x5EA6;&#x56FE;&#xFF08;Feature Map&#xFF09;&#x4E2D;&#x6240;&#x6709;&#x5143;&#x7D20;&#x7684;&#x603B;&#x548C;&#x3002;</p>
<p>&#x5982;&#x679C;&#x524D;&#x5411;&#x4F20;&#x64AD;&#x5305;&#x542B;&#x504F;&#x7F6E;&#xFF1A;$Y = X \star W + b$&#xFF0C;&#x5176;&#x4E2D; $b \in \mathbb{R}^{C_{\text{out}}}$&#xFF0C;&#x5219;&#xFF1A;</p>
<p>$$<br>
\frac{\partial L}{\partial b[c_{\text{out}}]} = \sum_{m=0}^{H_{\text{out}}-1} \sum_{n=0}^{W_{\text{out}}-1} \frac{\partial L}{\partial Y[c_{\text{out}}, m, n]} \cdot \frac{\partial Y[c_{\text{out}}, m, n]}{\partial b[c_{\text{out}}]}<br>
$$</p>
<p>&#x7531;&#x4E8E; $\frac{\partial Y[c_{\text{out}}, m, n]}{\partial b[c_{\text{out}}]} = 1$&#xFF1A;</p>
<p>$$<br>
\boxed{\frac{\partial L}{\partial b[c_{\text{out}}]} = \sum_{m=0}^{H_{\text{out}}-1} \sum_{n=0}^{W_{\text{out}}-1} \frac{\partial L}{\partial Y[c_{\text{out}}, m, n]}}<br>
$$</p>
<p>&#x5411;&#x91CF;&#x5316;&#x5F62;&#x5F0F;&#xFF1A;</p>
<p>$$<br>
\boxed{\frac{\partial L}{\partial b} = \sum_{m,n} \frac{\partial L}{\partial Y[:, m, n]}}<br>
$$</p>
]]></content:encoded></item><item><title><![CDATA[K3s - 轻量级 Kubernetes]]></title><description><![CDATA[K3s 小记]]></description><link>https://www.7-0.cc/k3s-introduction/</link><guid isPermaLink="false">69b40dddb1f19d0001c3e13e</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Tue, 04 Nov 2025 13:16:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: Kubernetes;K3s<br>
@@ Date: 2025-11-04</p>
<ul>
<li><a href="https://docs.k3s.io/zh/quick-start?ref=7-0.cc">K3s &#x5FEB;&#x901F;&#x5F00;&#x59CB;</a></li>
</ul>
<p>K3s &#x662F;&#x8F7B;&#x91CF;&#x7EA7;&#x7684; Kubernetes&#x3002;K3s &#x6613;&#x4E8E;&#x5B89;&#x88C5;&#xFF0C;&#x4EC5;&#x9700;&#x8981; Kubernetes &#x5185;&#x5B58;&#x7684;&#x4E00;&#x534A;&#xFF0C;&#x6240;&#x6709;&#x7EC4;&#x4EF6;&#x90FD;&#x5728;&#x4E00;&#x4E2A;&#x5C0F;&#x4E8E; 100 MB &#x7684;&#x4E8C;&#x8FDB;&#x5236;&#x6587;&#x4EF6;&#x4E2D;&#x3002;</p>
<p>K3s &#x662F;&#x4E00;&#x4E2A;&#x5B8C;&#x5168;&#x517C;&#x5BB9;&#x7684; Kubernetes &#x53D1;&#x884C;&#x7248;&#xFF0C;&#x5177;&#x6709;&#x4EE5;&#x4E0B;&#x589E;&#x5F3A;&#x529F;&#x80FD;&#xFF1A;</p>
<ul>
<li>&#x6253;&#x5305;&#x4E3A;&#x5355;&#x4E2A;&#x4E8C;&#x8FDB;&#x5236;&#x6587;&#x4EF6;&#x3002;</li>
<li>&#x4F7F;&#x7528;&#x57FA;&#x4E8E; sqlite3 &#x4F5C;&#x4E3A;&#x9ED8;&#x8BA4;&#x5B58;&#x50A8;&#x673A;&#x5236;&#x7684;&#x8F7B;&#x91CF;&#x7EA7;&#x5B58;&#x50A8;&#x540E;&#x7AEF;&#x3002;&#x540C;&#x65F6;&#x652F;&#x6301;&#x4F7F;&#x7528; etcd3&#x3001;MySQL &#x548C; Postgres&#x3002;</li>
<li>&#x5C01;&#x88C5;&#x5728;&#x7B80;&#x5355;&#x7684;&#x542F;&#x52A8;&#x7A0B;&#x5E8F;&#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x5904;&#x7406;&#x5F88;&#x591A;&#x590D;&#x6742;&#x7684; TLS &#x548C;&#x9009;&#x9879;&#x3002;</li>
<li>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#x662F;&#x5B89;&#x5168;&#x7684;&#xFF0C;&#x5BF9;&#x8F7B;&#x91CF;&#x7EA7;&#x73AF;&#x5883;&#x6709;&#x5408;&#x7406;&#x7684;&#x9ED8;&#x8BA4;&#x503C;&#x3002;</li>
<li>&#x6DFB;&#x52A0;&#x4E86;&#x7B80;&#x5355;&#x4F46;&#x5F3A;&#x5927;&#x7684; <code>batteries-included</code> &#x529F;&#x80FD;</li>
<li>&#x6240;&#x6709; Kubernetes control plane &#x7EC4;&#x4EF6;&#x7684;&#x64CD;&#x4F5C;&#x90FD;&#x5C01;&#x88C5;&#x5728;&#x5355;&#x4E2A;&#x4E8C;&#x8FDB;&#x5236;&#x6587;&#x4EF6;&#x548C;&#x8FDB;&#x7A0B;&#x4E2D;&#x3002;&#x56E0;&#x6B64;&#xFF0C;K3s &#x652F;&#x6301;&#x81EA;&#x52A8;&#x5316;&#x548C;&#x7BA1;&#x7406;&#x590D;&#x6742;&#x7684;&#x96C6;&#x7FA4;&#x64CD;&#x4F5C;&#xFF08;&#x4F8B;&#x5982;&#x8BC1;&#x4E66;&#x5206;&#x53D1;&#x7B49;&#xFF09;&#x3002;</li>
<li>&#x6700;&#x5927;&#x7A0B;&#x5EA6;&#x51CF;&#x8F7B;&#x4E86;&#x5916;&#x90E8;&#x4F9D;&#x8D56;&#x6027;&#xFF0C;K3s &#x4EC5;&#x9700;&#x8981;&#x73B0;&#x4EE3;&#x5185;&#x6838;&#x548C; cgroup &#x6302;&#x8F7D;&#x3002;K3s &#x6253;&#x5305;&#x4E86;&#x6240;&#x9700;&#x7684;&#x4F9D;&#x8D56;</li>
</ul>
<h2 id="%E5%AE%89%E8%A3%85">&#x5B89;&#x88C5;</h2>
<p>&#x5EFA;&#x8BAE;&#x5B89;&#x88C5;&#x9700;&#x6C42;</p>
<ul>
<li>&#x4EC5; Linux</li>
<li>CPU 2 cores(&#x6700;&#x5C0F; 1)</li>
<li>RAM 1 GB(&#x6700;&#x5C0F; 512MB)</li>
</ul>
<p>&#x5B89;&#x88C5; Server &#x8282;&#x70B9;</p>
<pre><code class="language-bash">curl -sfL https://get.k3s.io | sh -
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

# &#x67E5;&#x770B; node token
sudo cat /var/lib/rancher/k3s/server/node-token
</code></pre>
<ul>
<li>K3s &#x670D;&#x52A1;&#x5C06;&#x88AB;&#x914D;&#x7F6E;&#x4E3A;&#x5728;&#x8282;&#x70B9;&#x91CD;&#x542F;&#x540E;&#x6216;&#x8FDB;&#x7A0B;&#x5D29;&#x6E83;&#x6216;&#x88AB;&#x6740;&#x6B7B;&#x65F6;&#x81EA;&#x52A8;&#x91CD;&#x542F;&#x3002;</li>
<li>&#x5C06;&#x5B89;&#x88C5;&#x5176;&#x4ED6;&#x5B9E;&#x7528;&#x7A0B;&#x5E8F;&#xFF0C;&#x5305;&#x62EC; kubectl&#x3001;crictl&#x3001;ctr&#x3001;k3s-killall.sh &#x548C; k3s-uninstall.sh&#x3002;</li>
<li>kubeconfig &#x6587;&#x4EF6;&#x5C06;&#x5199;&#x5165;&#x5230; /etc/rancher/k3s/k3s.yaml&#xFF0C;&#x7531; K3s &#x5B89;&#x88C5;&#x7684; kubectl &#x5C06;&#x81EA;&#x52A8;&#x4F7F;&#x7528;&#x8BE5;&#x6587;&#x4EF6;&#x3002;</li>
</ul>
<p>&#x5B89;&#x88C5; Agent &#x8282;&#x70B9;&#x5E76;&#x5C06;&#x5B83;&#x4EEC;&#x6DFB;&#x52A0;&#x5230;&#x96C6;&#x7FA4;</p>
<pre><code class="language-bash">curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
</code></pre>
<p><code>K3S_URL</code> &#x53C2;&#x6570;&#x4F1A;&#x5BFC;&#x81F4;&#x5B89;&#x88C5;&#x7A0B;&#x5E8F;&#x5C06; K3s &#x914D;&#x7F6E;&#x4E3A; Agent &#x800C;&#x4E0D;&#x662F; Server&#x3002;K3s Agent &#x5C06;&#x6CE8;&#x518C;&#x5230;&#x5728; URL &#x4E0A;&#x76D1;&#x542C;&#x7684; K3s Server&#x3002;<code>K3S_TOKEN</code> &#x4F7F;&#x7528;&#x7684;&#x503C;&#x5B58;&#x50A8;&#x5728; Server &#x8282;&#x70B9;&#x4E0A;&#x7684; <code>/var/lib/rancher/k3s/server/node-token</code> &#x4E2D;&#x3002;</p>
<blockquote>
<p>&#x5907;&#x6CE8;</p>
<p>&#x6BCF;&#x53F0;&#x4E3B;&#x673A;&#x5FC5;&#x987B;&#x5177;&#x6709;&#x552F;&#x4E00;&#x7684;&#x4E3B;&#x673A;&#x540D;&#x3002;&#x5982;&#x679C;&#x4F60;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x6CA1;&#x6709;&#x552F;&#x4E00;&#x7684;&#x4E3B;&#x673A;&#x540D;&#xFF0C;&#x8BF7;&#x4F20;&#x9012; <code>K3S_NODE_NAME</code> &#x73AF;&#x5883;&#x53D8;&#x91CF;&#xFF0C;&#x5E76;&#x4E3A;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x6709;&#x6548;&#x4E14;&#x552F;&#x4E00;&#x7684;&#x4E3B;&#x673A;&#x540D;&#x3002;</p>
</blockquote>
<pre><code class="language-bash"># &#x67E5;&#x770B;&#x670D;&#x52A1;&#x7684;&#x65E5;&#x5FD7;
sudo journalctl -u k3s -n 100 --no-pager
sudo journalctl -u k3s-agent -n 100 --no-pager


# &#x62C9;&#x53D6;&#x955C;&#x50CF;
sudo k3s ctr image pull docker.io/rancher/mirrored-pause:3.6
</code></pre>
<h3 id="%E7%AE%A1%E7%90%86%E9%9B%86%E7%BE%A4">&#x7BA1;&#x7406;&#x96C6;&#x7FA4;</h3>
<pre><code class="language-bash"># Server &#x8282;&#x70B9;&#x6267;&#x884C;
# &#x62F7;&#x8D1D; k3s.yaml &#x5230;&#x7528;&#x6237;&#x76EE;&#x5F55;, &#x5E76;&#x4FEE;&#x6539;&#x6743;&#x9650;
sudo cp /etc/rancher/k3s/k3s.yaml ~/
sudo chown $USER:$USER ~/k3s.yaml

# &#x8FDC;&#x7A0B;&#x7BA1;&#x7406;&#x673A;&#x5668;&#x6267;&#x884C;
# &#x5C06; kk3s.yaml &#x62F7;&#x8D1D;&#x5230;&#x672C;&#x5730; ~/.kube/config
mkidr ~\.kube
scp user@server_ip:~/k3s.yaml ~\.kube\config
# &#x4FEE;&#x6539; config &#x6587;&#x4EF6;&#x7684;server&#x5B57;&#x6BB5;&#x5230;&#x8282;&#x70B9;&#x5730;&#x5740;, &#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;
nano ~\.kube\config
</code></pre>
<pre><code class="language-bash"># kubeconfig &#x914D;&#x7F6E;&#x6587;&#x4EF6;
# &#x6765;&#x81EA;: /etc/rancher/k3s/k3s.yaml
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: # CA &#x8BC1;&#x4E66;&#xFF08;Base64&#x7F16;&#x7801;
    LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnk
    ....
    NFUlRJRklDQVRFLS0tLS0K
    server: https://192.168.3.225:6443  # API Server &#x7AEF;&#x70B9;
  name: default                         # &#x96C6;&#x7FA4;&#x540D;&#x79F0;
contexts:
- context:
    cluster: default
    user: default
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default               # &#x7528;&#x6237;&#x540D;&#x79F0;
  user:
    client-certificate-data:  # &#x5BA2;&#x6237;&#x7AEF;&#x8BC1;&#x4E66;&#x6570;&#x636E;
    LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrRENDQVRlZ0F3SUJBZ0lJWjYxeldWcHVhSVl3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1k
    ....
    V09UUzQ0WXcySXZERzFVN3BWdW95Zm5rdWd4UFd6V29DS0t3QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    client-key-data:          # &#x5BA2;&#x6237;&#x7AEF;&#x5BC6;&#x94A5;&#x6570;&#x636E;
    LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSU9UeHVicGVIcXYvd3J1VzNxU25KUVhrbXQwK3JGR1F3T3ZKMm1wRFZRR3FvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFSWFLakNNNzFOK3UyNDRKcGZYSGY4Wm9Bekw4Q1RwaVV0Z1QxUk5hMmpxRzk1MTdSTDg2ZwpINjE1T3htc2tWQ3JrRmVzUi9rT0dIQW1zTTZNbXM1ZTNRPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=
</code></pre>
<blockquote>
<p>server &#x8282;&#x70B9;&#x751F;&#x6210;&#x3000;<code>/etc/rancher/k3s/k3s.yaml</code> &#x7684;&#x4E3B;&#x8981;&#x76EE;&#x7684;:</p>
<ol>
<li>&#x8BA9;&#x7BA1;&#x7406;&#x5458;&#x80FD;&#x591F;&#x5728; Server &#x8282;&#x70B9;&#x672C;&#x673A; &#x4E0A;&#x4F7F;&#x7528; kubectl &#x7BA1;&#x7406;&#x6574;&#x4E2A; K3s &#x96C6;&#x7FA4;</li>
<li>&#x96C6;&#x7FA4;&#x7BA1;&#x7406;&#x5458;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;:&#x3000;&#x8FD9;&#x4E2A; k3s.yaml &#x5305;&#x542B;&#x4E86; &#x6700;&#x9AD8;&#x6743;&#x9650; &#x7684;&#x8BA4;&#x8BC1;&#x51ED;&#x8BC1;</li>
<li>&#x4F5C;&#x4E3A;&#x5176;&#x4ED6;&#x7BA1;&#x7406;&#x914D;&#x7F6E;&#x7684;&#x57FA;&#x51C6;</li>
</ol>
</blockquote>
<p>&#x6B64;&#x65F6;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; kubectl &#x547D;&#x4EE4;&#x6765;&#x7BA1;&#x7406;&#x96C6;&#x7FA4;&#x3002;</p>
<pre><code class="language-bash"># &#x6D4B;&#x8BD5;&#x96C6;&#x7FA4;&#x8FDE;&#x63A5;
kubectl cluster-info

# &#x67E5;&#x770B;&#x8282;&#x70B9;
kubectl get nodes

# &#x67E5;&#x770B;&#x6240;&#x6709; pods
kubectl get pods -A
kubectl get pods -A -o wide

# &#x67E5;&#x8BE2;&#x6240;&#x6709;&#x7684; ingress
kubectl get ingress -A

# &#x67E5;&#x770B;&#x6240;&#x6709;&#x670D;&#x52A1;&#x7684;&#x72B6;&#x6001;
kubectl get svc -A -o wide

# &#x67E5;&#x770B;&#x6240;&#x6709; namespace=kube-system &#x7684;pods&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;
kubectl describe pod -n kube-system

# &#x67E5;&#x770B; pods traefik-c98fdf6fb-629q2 &#x7684;&#x72B6;&#x6001; (tail)
kubectl logs traefik-c98fdf6fb-629q2 -n kube-system -f

# &#x67E5;&#x770B;&#x6240;&#x6709;&#x8282;&#x70B9;&#x7684;&#x72B6;&#x6001;
kubectl top node

# &#x5220;&#x9664;&#x5355;&#x4E2A;&#x5931;&#x8D25;&#x7684; Pod
kubectl delete pod &lt;pod-name&gt;

# &#x5220;&#x9664;&#x6240;&#x6709;&#x5931;&#x8D25;&#x7684; Pod
kubectl delete pods --field-selector=status.phase=Failed

# &#x5220;&#x9664;&#x6240;&#x6709;&#x72B6;&#x6001;&#x4E0D;&#x662F; Running &#x7684; Pod&#xFF08;&#x8C28;&#x614E;&#x4F7F;&#x7528;&#xFF09;
kubectl delete pods --field-selector=status.phase!=Running

# &#x67E5;&#x770B;&#x6240;&#x6709; configmap(&#x914D;&#x7F6E;&#x6570;&#x636E;)
kubectl.exe get configmap -A

# &#x67E5;&#x770B;&#x6240;&#x6709; configmap &#x7684;&#x5185;&#x5BB9;
kubectl.exe get configmap traefik-conf -n kube-system -o yaml

# &#x901A;&#x8FC7;&#x91CD;&#x542F; Pod, &#x53EF;&#x4EE5;&#x6E05;&#x7406;&#x65E5;&#x5FD7;
kubectl rollout restart deployment/traefik -n kube-system

# &#x5220;&#x9664; Pod &#x8FEB;&#x4F7F;&#x5176;&#x91CD;&#x5EFA;&#xFF08;&#x5982;&#x679C;&#x662F; Deployment &#x7BA1;&#x7406;&#x7684;&#xFF09;
kubectl delete pod traefik-c98fdf6fb-629q2 -n kube-system

# &#x67E5;&#x770B;&#x8282;&#x70B9;, &#x6807;&#x7B7E;
kubectl get nodes --show-labels

# &#x8BBE;&#x7F6E;&#x8282;&#x70B9;&#x6807;&#x7B7E;
kubectl label nodes &lt;node-name&gt; node-type=worker

# &#x6DFB;&#x52A0;&#x6807;&#x51C6;&#x7684; worker &#x89D2;&#x8272;
kubectl label node &lt;node-name&gt; node-role.kubernetes.io/worker=true
</code></pre>
<h3 id="pod-%E7%8A%B6%E6%80%81">POD &#x72B6;&#x6001;</h3>
<p>ContainerCreating<br>
&#x5BB9;&#x5668;&#x521B;&#x5EFA;&#x4E2D;<br>
Running<br>
&#x6B63;&#x5728;&#x8FD0;&#x884C;<br>
Completed<br>
&#x5DF2;&#x5B8C;&#x6210;<br>
ErrImagePull<br>
&#x955C;&#x50CF;&#x62C9;&#x53D6;&#x5931;&#x8D25;, &#x955C;&#x50CF;&#x4ED3;&#x5E93;&#x5F02;&#x5E38;<br>
ImagePullBackOff<br>
&#x955C;&#x50CF;&#x62C9;&#x53D6;&#x5931;&#x8D25;, &#x53EF;&#x80FD;&#x662F;&#x955C;&#x50CF;&#x4E0D;&#x5B58;&#x5728;, &#x955C;&#x50CF;&#x4ED3;&#x5E93;&#x5F02;&#x5E38;<br>
CrashLoopBackOff<br>
&#x5BB9;&#x5668;&#x542F;&#x52A8;&#x540E;&#x5D29;&#x6E83;<br>
CreateContainerConfigBackOff<br>
&#x521B;&#x5EFA;&#x5BB9;&#x5668;&#x914D;&#x7F6E;&#x5931;&#x8D25;, &#x4F8B;&#x5982;&#xFF0C;&#x5F15;&#x7528;&#x4E86;&#x4E0D;&#x5B58;&#x5728;&#x7684; Secret &#x6216; ConfigMap&#x3002;<br>
Error<br>
&#x5BB9;&#x5668;&#x542F;&#x52A8;&#x5931;&#x8D25;<br>
Terminating<br>
&#x7EC8;&#x6B62;&#x72B6;&#x6001;, &#x53EF;&#x80FD;&#x8282;&#x70B9;&#x5931;&#x8054;</p>
<h2 id="%E9%85%8D%E7%BD%AE">&#x914D;&#x7F6E;</h2>
<p>server &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4F4D;&#x4E8E; <code>/etc/rancher/k3s/config.yaml</code>, &#x5B57;&#x6BB5;&#x5185;&#x5BB9;&#x53C2;&#x8003; &#x5B98;&#x65B9;&#x6587;&#x6863;;</p>
<p>&#x4E5F;&#x652F;&#x6301;&#x591A;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x3002;</p>
<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x914D;&#x7F6E;&#x6587;&#x4EF6;<code>/etc/rancher/k3s/config.yaml</code>&#x6309;<code>/etc/rancher/k3s/config.yaml.d/*.yaml</code>&#x5B57;&#x6BCD;&#x987A;&#x5E8F;&#x8BFB;&#x53D6;&#x3002;</p>
<h3 id="%E6%9C%8D%E5%8A%A1%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86">&#x670D;&#x52A1;&#x89D2;&#x8272;&#x7BA1;&#x7406;</h3>
<p>&#x542F;&#x52A8; K3s &#x670D;&#x52A1;&#x5668;<code>--cluster-init</code>&#x5C06;&#x8FD0;&#x884C;&#x6240;&#x6709;&#x63A7;&#x5236;&#x5E73;&#x9762;&#x7EC4;&#x4EF6;&#xFF0C;&#x5305;&#x62EC; API &#x670D;&#x52A1;&#x5668;&#x3001;&#x63A7;&#x5236;&#x5668;&#x7BA1;&#x7406;&#x5668;&#x3001;&#x8C03;&#x5EA6;&#x5668;&#x548C; etcd&#x3002;&#x53EF;&#x4EE5;&#x7981;&#x7528;&#x7279;&#x5B9A;&#x7EC4;&#x4EF6;&#xFF0C;&#x4EE5;&#x4FBF;&#x5C06;&#x63A7;&#x5236;&#x5E73;&#x9762;&#x548C; etcd &#x89D2;&#x8272;&#x62C6;&#x5206;&#x5230;&#x4E0D;&#x540C;&#x7684;&#x8282;&#x70B9;&#x4E0A;&#x3002;</p>
<p>&#x6BD4;&#x5982;&#x521B;&#x5EFA; &#x4E13;&#x7528;etcd&#x8282;&#x70B9;:</p>
<pre><code class="language-bash">curl -fL https://get.k3s.io | sh -s - server --cluster-init --disable-apiserver --disable-controller-manager --disable-scheduler
</code></pre>
<h3 id="%E9%9B%86%E7%BE%A4%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8">&#x96C6;&#x7FA4;&#x6570;&#x636E;&#x5B58;&#x50A8;</h3>
<p>K3s &#x652F;&#x6301;&#x4EE5;&#x4E0B;&#x6570;&#x636E;&#x5B58;&#x50A8;&#x9009;&#x9879;&#xFF1A;</p>
<ul>
<li><strong>&#x5D4C;&#x5165;&#x5F0F;<a href="https://www.sqlite.org/index.html?ref=7-0.cc">SQLite</a></strong>
<ul>
<li>SQLite &#x65E0;&#x6CD5;&#x5728;&#x591A;&#x670D;&#x52A1;&#x5668;&#x96C6;&#x7FA4;&#x4E2D;&#x4F7F;&#x7528;</li>
<li>&#x662F;&#x9ED8;&#x8BA4;&#x6570;&#x636E;&#x5B58;&#x50A8;&#xFF0C;&#x5F53;&#x6CA1;&#x6709;&#x5176;&#x4ED6;&#x6570;&#x636E;&#x5B58;&#x50A8;&#x914D;&#x7F6E;&#x4E14;&#x78C1;&#x76D8;&#x4E0A;&#x4E0D;&#x5B58;&#x5728;&#x5D4C;&#x5165;&#x5F0F; etcd &#x6570;&#x636E;&#x5E93;&#x6587;&#x4EF6;&#x65F6;&#xFF0C;&#x5C06;&#x4F7F;&#x7528; SQLite&#x3002;</li>
<li>&#x4F4D;&#x4E8E;: /var/lib/rancher/k3s/server/db/</li>
</ul>
</li>
<li><strong>&#x5D4C;&#x5165;&#x5F0F; etcd</strong><br>
&#x6709;&#x5173;&#x5728;&#x591A;&#x53F0;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x4F7F;&#x7528;&#x5D4C;&#x5165;&#x5F0F; etcd &#x7684;&#x66F4;&#x591A;&#x4FE1;&#x606F;&#xFF0C;&#x8BF7;&#x53C2;&#x9605;<a href="https://docs.k3s.io/datastore/ha-embedded?ref=7-0.cc">&#x9AD8;&#x53EF;&#x7528;&#x6027;&#x5D4C;&#x5165;&#x5F0F; etcd</a>&#x6587;&#x6863;&#x3002;&#x5982;&#x679C; K3s &#x914D;&#x7F6E;&#x4E3A;&#x521D;&#x59CB;&#x5316;&#x65B0;&#x7684; etcd &#x96C6;&#x7FA4;&#x3001;&#x52A0;&#x5165;&#x73B0;&#x6709; etcd &#x96C6;&#x7FA4;&#xFF0C;&#x6216;&#x8005;&#x5728;&#x542F;&#x52A8;&#x671F;&#x95F4;&#x78C1;&#x76D8;&#x4E0A;&#x5B58;&#x5728; etcd &#x6570;&#x636E;&#x5E93;&#x6587;&#x4EF6;&#xFF0C;&#x5219;&#x4F1A;&#x81EA;&#x52A8;&#x9009;&#x62E9;&#x5D4C;&#x5165;&#x5F0F; etcd&#x3002;</li>
</ul>
<h4 id="%E5%A4%87%E4%BB%BD%E6%81%A2%E5%A4%8D">&#x5907;&#x4EFD;&#x6062;&#x590D;</h4>
<p>&#x9664;&#x4E86;&#x5907;&#x4EFD;&#x6570;&#x636E;&#x5B58;&#x50A8;&#x672C;&#x8EAB;&#x4E4B;&#x5916;&#xFF0C;&#x60A8;&#x8FD8;&#x5FC5;&#x987B;&#x5907;&#x4EFD;&#x670D;&#x52A1;&#x5668;&#x4EE4;&#x724C;&#x6587;&#x4EF6;/var/lib/rancher/k3s/server/token&#x3002;&#x5982;&#x679C;&#x5728;&#x6062;&#x590D;&#x65F6;&#x672A;&#x4F7F;&#x7528;&#x76F8;&#x540C;&#x7684;&#x4EE4;&#x724C;&#x503C;&#xFF0C;&#x5219;&#x5FEB;&#x7167;&#x5C06;&#x65E0;&#x6CD5;&#x4F7F;&#x7528;&#xFF0C;&#x56E0;&#x4E3A;&#x8BE5;&#x4EE4;&#x724C;&#x7528;&#x4E8E;&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x5B58;&#x50A8;&#x4E2D;&#x7684;&#x673A;&#x5BC6;&#x6570;&#x636E;&#x3002;</p>
<h2 id="%E6%89%8B%E5%8A%A8%E5%AF%BC%E5%85%A5%E9%95%9C%E5%83%8F">&#x624B;&#x52A8;&#x5BFC;&#x5165;&#x955C;&#x50CF;</h2>
<p>&#x955C;&#x50CF;&#x53EF;&#x4EE5;&#x88AB;&#x624B;&#x52A8;&#x5BFC;&#x5165;, &#x901A;&#x8FC7;&#x8FD0;&#x884C; <code>ctr -n k8s.io image pull</code> &#x547D;&#x4EE4;&#x6765;&#x62C9;&#x53D6;&#x955C;&#x50CF;(<a href="https://docs.k3s.io/zh/installation/registry-mirror?ref=7-0.cc">&#x5D4C;&#x5165;&#x7684;&#x6CE8;&#x518C;&#x8868;</a>)&#xFF0C;&#x6216;&#x8005;&#x901A;&#x8FC7;&#x4F7F;&#x7528; <code>ctr -n k8s.io import</code> &#x6216; <code>ctr -n k8s.io load</code> &#x547D;&#x4EE4;&#x52A0;&#x8F7D;&#x955C;&#x50CF;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x3002;&#x6CE8;&#x610F;&#xFF0C;<code>k8s.io</code>&#x547D;&#x540D;&#x7A7A;&#x95F4;&#x5FC5;&#x987B;&#x6307;&#x5B9A;&#xFF0C;&#x4EE5;&#x4FBF;&#x5728;<code>ctr</code>&#x4E2D;&#x7BA1;&#x7406;&#x955C;&#x50CF;&#x65F6;&#xFF0C;kubelet&#x53EF;&#x4EE5;&#x8BC6;&#x522B;&#x8FD9;&#x4E9B;&#x955C;&#x50CF;&#x3002;</p>
<h2 id="%E9%9B%86%E7%BE%A4%E6%9E%B6%E6%9E%84">&#x96C6;&#x7FA4;&#x67B6;&#x6784;</h2>
<ul>
<li><a href="https://docs.k3s.io/architecture?ref=7-0.cc">K3s Architecture</a></li>
</ul>
<p>K3s &#x96C6;&#x7FA4;&#x67B6;&#x6784;&#x5927;&#x6982;&#x5206;&#x4E3A;&#x4E24;&#x79CD;:</p>
<ul>
<li>&#x5355;&#x670D;&#x52A1;&#x5668;&#x67B6;&#x6784;&#xFF0C;&#x5185;&#x7F6E;&#x6570;&#x636E;&#x5E93;</li>
<li>&#x9AD8;&#x53EF;&#x7528;&#x6027;, &#x591A;&#x670D;&#x52A1;&#x5668;&#x67B6;&#x6784;, &#x5D4C;&#x5165;&#x5F0F; etcd &#x6570;&#x636E;&#x5B58;&#x50A8;, &#x8282;&#x70B9;&#x901A;&#x5E38;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;&#x5947;&#x6570;&#x4E2A;&#xFF08;&#x5982;3&#x4E2A;&#x3001;5&#x4E2A;&#xFF09;&#xFF0C;&#x8FD9;&#x662F;&#x7531;&#x5E95;&#x5C42;etcd&#x7684;Raft&#x5171;&#x8BC6;&#x7B97;&#x6CD5;&#x51B3;&#x5B9A;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x6709;&#x6548;&#x907F;&#x514D;&#x201C;&#x8111;&#x88C2;&#x201D;&#x95EE;&#x9898;&#x3002;</li>
</ul>
<h2 id="%E5%8F%82%E8%80%83">&#x53C2;&#x8003;</h2>
<h3 id="%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%B3%A8%E5%86%8C%E8%A1%A8%E9%95%9C%E5%83%8F"><strong>&#x5D4C;&#x5165;&#x5F0F;&#x6CE8;&#x518C;&#x8868;&#x955C;&#x50CF;</strong></h3>
<p>K3s &#x5185;&#x7F6E;&#x4E86;Spegel&#xFF0C;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x65E0;&#x72B6;&#x6001;&#x7684;&#x5206;&#x5E03;&#x5F0F; OCI &#x955C;&#x50CF;&#x4ED3;&#x5E93;&#xFF0C;&#x5141;&#x8BB8; Kubernetes &#x96C6;&#x7FA4;&#x4E2D;&#x7684;&#x8282;&#x70B9;&#x4E4B;&#x95F4;&#x8FDB;&#x884C;&#x5BB9;&#x5668;&#x955C;&#x50CF;&#x7684;&#x5BF9;&#x7B49;&#x5171;&#x4EAB;&#x3002;&#x8BE5;&#x5206;&#x5E03;&#x5F0F;&#x955C;&#x50CF;&#x4ED3;&#x5E93;&#x9ED8;&#x8BA4;&#x5904;&#x4E8E;&#x7981;&#x7528;&#x72B6;&#x6001;&#x3002;</p>
<p>&#x542F;&#x52A8;&#x65F6;&#xFF0C;K3s &#x4F1A;&#x68C0;&#x67E5;&#x8BE5;&#x6587;&#x4EF6;&#x662F;&#x5426;<code>/etc/rancher/k3s/registries.yaml</code>&#x5B58;&#x5728;&#x3002;&#x5982;&#x679C;&#x5B58;&#x5728;&#xFF0C;&#x5219;&#x4F1A;&#x5728;&#x751F;&#x6210; containerd &#x914D;&#x7F6E;&#x65F6;&#x4F7F;&#x7528;&#x6B64;&#x6587;&#x4EF6;&#x4E2D;&#x7684;&#x6CE8;&#x518C;&#x8868;&#x914D;&#x7F6E;&#x3002;</p>
<ul>
<li>&#x5982;&#x679C;&#x60A8;&#x60F3;&#x4F7F;&#x7528;&#x79C1;&#x6709;&#x6CE8;&#x518C;&#x8868;&#x4F5C;&#x4E3A;&#x516C;&#x5171;&#x6CE8;&#x518C;&#x8868;&#xFF08;&#x4F8B;&#x5982; docker.io&#xFF09;&#x7684;&#x955C;&#x50CF;&#xFF0C;&#x5219;&#x9700;&#x8981;registries.yaml&#x5728;&#x6BCF;&#x4E2A;&#x8981;&#x4F7F;&#x7528;&#x8BE5;&#x955C;&#x50CF;&#x7684;&#x8282;&#x70B9;&#x4E0A;&#x8FDB;&#x884C;&#x914D;&#x7F6E;&#x3002;</li>
<li>&#x5982;&#x679C;&#x60A8;&#x7684;&#x79C1;&#x6709;&#x955C;&#x50CF;&#x4ED3;&#x5E93;&#x9700;&#x8981;&#x8EAB;&#x4EFD;&#x9A8C;&#x8BC1;&#x3001;&#x4F7F;&#x7528;&#x81EA;&#x5B9A;&#x4E49; TLS &#x8BC1;&#x4E66;&#x6216;&#x4E0D;&#x4F7F;&#x7528; TLS&#xFF0C;&#x5219;&#x9700;&#x8981; registries.yaml &#x5728;&#x6BCF;&#x4E2A;&#x62C9;&#x53D6;&#x955C;&#x50CF;&#x7684;&#x8282;&#x70B9;&#x4E0A;&#x8FDB;&#x884C;&#x914D;&#x7F6E;&#x3002;</li>
</ul>
<p>registries.yaml &#x6587;&#x4EF6;&#x7684;&#x683C;&#x5F0F;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-yaml">mirrors:
  &lt;REGISTRY&gt;:
    endpoint:
      - https://&lt;REGISTRY&gt;/v2
configs:
  &lt;REGISTRY&gt;:
    auth:
      username: &lt;BASIC AUTH USERNAME&gt;
      password: &lt;BASIC AUTH PASSWORD&gt;
      token: &lt;BEARER TOKEN&gt;
    tls:
      ca_file: &lt;PATH TO SERVER CA&gt;
      cert_file: &lt;PATH TO CLIENT CERT&gt;
      key_file: &lt;PATH TO CLIENT KEY&gt;
      insecure_skip_verify: &lt;SKIP TLS CERT VERIFICATION BOOLEAN&gt;
</code></pre>
<p>&#x793A;&#x4F8B;(&#x56FD;&#x5185;&#x955C;&#x50CF;)&#xFF1A;</p>
<pre><code class="language-yaml">mirrors:
  docker.io:
    endpoint:
      - &quot;https://docker.1ms.run/&quot;
      - &quot;https://docker.xuanyuan.me/&quot;

mirrors:
  &quot;docker.io&quot;:
    endpoint:
      - &quot;https://registry-1.docker.io&quot;
</code></pre>
<p>&#x91CD;&#x542F;&#x540E;&#x5E94;&#x7528;, &#x7136;&#x540E;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x65E5;&#x5FD7;&#x68C0;&#x67E5;&#x662F;&#x5426;&#x6210;&#x529F;&#x5E94;&#x7528;</p>
<pre><code class="language-bash">sudo systemctl restart k3s
sudo systemctl restart k3s-agent
sudo systemctl status k3s-agent
</code></pre>
<h4 id="%E4%B8%8E-containerd-%E9%85%8D%E7%BD%AE">&#x4E0E; containerd &#x914D;&#x7F6E;</h4>
<p>k3s &#x9ED8;&#x8BA4;&#x4F7F;&#x7528;containerd&#xFF0C;&#x9700;&#x8981;&#x4FEE;&#x6539;containerd&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x624D;&#x80FD;&#x8BA9;Pod&#x7684;&#x955C;&#x50CF;&#x4F7F;&#x7528;&#x955C;&#x50CF;&#x52A0;&#x901F;&#x5668;&#x3002;</p>
<p>K3s&#x4F1A;&#x81EA;&#x52A8;&#x751F;&#x6210;containerd&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;/var/lib/rancher/k3s/agent/etc/containerd/config.toml,&#x4E0D;&#x8981;&#x76F4;&#x63A5;&#x4FEE;&#x6539;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;k3s&#x91CD;&#x542F;&#x540E;&#x4FEE;&#x6539;&#x4F1A;&#x4E22;&#x5931;&#x3002;</p>
<pre><code class="language-bash">$ sudo cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml
# File generated by k3s. DO NOT EDIT. Use config.toml.tmpl instead.
version = 3
root = &quot;/var/lib/rancher/k3s/agent/containerd&quot;
state = &quot;/run/k3s/containerd&quot;
# ...
[plugins.&apos;io.containerd.cri.v1.images&apos;.registry]
  config_path = &quot;/var/lib/rancher/k3s/agent/etc/containerd/certs.d&quot;

$ sudo cat /var/lib/rancher/k3s/agent/etc/containerd/certs.d/docker.io/hosts.toml
# File generated by k3s. DO NOT EDIT.
server = &quot;https://registry-1.docker.io/v2&quot;
capabilities = [&quot;pull&quot;, &quot;resolve&quot;, &quot;push&quot;]

[host]

[host.&quot;https://docker.1ms.run/v2&quot;]
  capabilities = [&quot;pull&quot;, &quot;resolve&quot;]

[host.&quot;https://docker.xuanyuan.me/v2&quot;]
  capabilities = [&quot;pull&quot;, &quot;resolve&quot;]
</code></pre>
<h3 id="oci-%E9%95%9C%E5%83%8F%E4%BB%93%E5%BA%93"><strong>OCI &#x955C;&#x50CF;&#x4ED3;&#x5E93;</strong></h3>
<p>OCI &#x955C;&#x50CF;&#x4ED3;&#x5E93;&#x662F;&#x4E00;&#x4E2A;&#x7528;&#x4E8E;&#x5B58;&#x50A8;&#x548C;&#x5206;&#x53D1;&#x7B26;&#x5408; OCI&#xFF08;&#x5F00;&#x653E;&#x5BB9;&#x5668;&#x5021;&#x8BAE;&#xFF09;&#x89C4;&#x8303;&#x7684;&#x5BB9;&#x5668;&#x955C;&#x50CF;&#x53CA;&#x5176;&#x4ED6;&#x5236;&#x54C1;&#x7684;&#x7CFB;&#x7EDF;&#x3002;&#x5176;&#x6838;&#x5FC3;&#x76EE;&#x6807;&#x662F;&#x5B9E;&#x73B0;&#x6807;&#x51C6;&#x5316;&#xFF0C;&#x786E;&#x4FDD;&#x955C;&#x50CF;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x65F6;&#xFF08;&#x5982; Docker&#x3001;Podman&#x3001;containerd&#x3001;CRI-O&#xFF09;&#x548C;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;&#x5982; Helm&#x3001;Nerdctl&#x3001;oras&#xFF09;&#x4E4B;&#x95F4;&#x80FD;&#x591F;&#x81EA;&#x7531;&#x5206;&#x53D1;&#x548C;&#x8FD0;&#x884C;&#xFF0C;&#x907F;&#x514D;&#x517C;&#x5BB9;&#x6027;&#x95EE;&#x9898;&#x3002;</p>
<h3 id="etcd"><strong>etcd</strong></h3>
<p><strong>etcd</strong>&#x662F;&#x4E00;&#x4E2A;&#x5F3A;&#x4E00;&#x81F4;&#x6027;&#x7684;&#x5206;&#x5E03;&#x5F0F;&#x952E;&#x503C;&#x5B58;&#x50A8;&#x7CFB;&#x7EDF;&#xFF0C;&#x5B83;&#x4E3A;&#x5206;&#x5E03;&#x5F0F;&#x7CFB;&#x7EDF;&#x6216;&#x96C6;&#x7FA4;&#x4E2D;&#x9700;&#x8981;&#x8BBF;&#x95EE;&#x7684;&#x6570;&#x636E;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x79CD;&#x53EF;&#x9760;&#x7684;&#x5B58;&#x50A8;&#x65B9;&#x5F0F;&#x3002;&#x5B83;&#x80FD;&#x591F;&#x4F18;&#x96C5;&#x5730;&#x5904;&#x7406;&#x7F51;&#x7EDC;&#x5206;&#x533A;&#x671F;&#x95F4;&#x7684;&#x9886;&#x5BFC;&#x8005;&#x9009;&#x4E3E;&#xFF0C;&#x5E76;&#x4E14;&#x5373;&#x4F7F;&#x5728;&#x9886;&#x5BFC;&#x8005;&#x8282;&#x70B9;&#x4E0A;&#x53D1;&#x751F;&#x6545;&#x969C;&#xFF0C;&#x4E5F;&#x80FD;&#x5BB9;&#x5FCD;&#x673A;&#x5668;&#x6545;&#x969C;&#x3002;</p>
<h3 id="%E8%84%91%E8%A3%82%E9%97%AE%E9%A2%98">&#x8111;&#x88C2;&#x95EE;&#x9898;</h3>
<p>&#x5728;&#x5206;&#x5E03;&#x5F0F;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF0C;&#x8111;&#x88C2;&#x6307;&#x7684;&#x662F;&#xFF1A;&#x539F;&#x672C;&#x5E94;&#x8BE5;&#x534F;&#x540C;&#x5DE5;&#x4F5C;&#x7684;&#x4E00;&#x4E2A;&#x96C6;&#x7FA4;&#xFF0C;&#x7531;&#x4E8E;&#x7F51;&#x7EDC;&#x6545;&#x969C;&#x88AB;&#x5206;&#x5272;&#x6210;&#x4E24;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x65E0;&#x6CD5;&#x901A;&#x4FE1;&#x7684;&#x5B50;&#x96C6;&#x7FA4;&#xFF0C;&#x6BCF;&#x4E2A;&#x5B50;&#x96C6;&#x7FA4;&#x90FD;&#x8BA4;&#x4E3A;&#x81EA;&#x5DF1;&#x662F;&#x201C;&#x552F;&#x4E00;&#x5B58;&#x6D3B;&#x201D;&#x7684;&#x90E8;&#x5206;&#xFF0C;&#x5E76;&#x7EE7;&#x7EED;&#x5BF9;&#x5916;&#x63D0;&#x4F9B;&#x670D;&#x52A1;&#xFF0C;&#x4ECE;&#x800C;&#x5BFC;&#x81F4;&#x6570;&#x636E;&#x4E0D;&#x4E00;&#x81F4;&#x548C;&#x7CFB;&#x7EDF;&#x6DF7;&#x4E71;&#x3002;</p>
<h3 id="crictl">crictl</h3>
<p><code>crictl</code> &#x662F; Kubernetes &#x8282;&#x70B9;&#x4E0A;&#x7684;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x65F6;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF0C;&#x4E3B;&#x8981;&#x7528;&#x4E8E;&#x4E0E; CRI&#xFF08;Container Runtime Interface&#xFF09;&#x517C;&#x5BB9;&#x7684;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x65F6;&#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#x3002;</p>
<p>&#x547D;&#x4EE4;&#x884C;&#x8BED;&#x6CD5;&#x4E0E;docker &#x547D;&#x4EE4;&#x884C;&#x8BED;&#x6CD5;&#x76F8;&#x4F3C;&#xFF0C;&#x4F46;&#x6709;&#x4E9B;&#x547D;&#x4EE4;&#x53EF;&#x80FD;&#x4E0D;&#x540C;&#x3002;</p>
<pre><code class="language-bash"># &#x67E5;&#x770B; Pod &#x5217;&#x8868;
sudo crictl pods

# &#x67E5;&#x770B;&#x5BB9;&#x5668;&#x5217;&#x8868;
sudo crictl ps

# &#x67E5;&#x770B;&#x955C;&#x50CF;&#x5217;&#x8868;
sudo crictl images

# &#x67E5;&#x770B;&#x5BB9;&#x5668;&#x72B6;&#x6001;
sudo crictl inspect &lt;container-id&gt;

# &#x67E5;&#x770B; Pod &#x72B6;&#x6001;
sudo crictl inspectp &lt;pod-id&gt;
</code></pre>
<h3 id="ctr">ctr</h3>
<p><code>ctr</code> &#x662F; containerd &#x7684;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF0C;&#x7528;&#x4E8E;&#x4E0E; containerd &#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#x3002;</p>
<pre><code class="language-bash"># &#x67E5;&#x770B;&#x955C;&#x50CF;&#x5217;&#x8868;
sudo ctr images list

# &#x62C9;&#x53D6;&#x955C;&#x50CF;
sudo ctr images pull docker.io/library/nginx:latest

# &#x5220;&#x9664;&#x955C;&#x50CF;
sudo ctr images rm docker.io/library/nginx:latest

# &#x67E5;&#x770B;&#x5BB9;&#x5668;&#x5217;&#x8868;
sudo ctr containers list

# &#x67E5;&#x770B;&#x4EFB;&#x52A1;&#x5217;&#x8868;&#xFF08;&#x8FD0;&#x884C;&#x7684;&#x5BB9;&#x5668;&#xFF09;
sudo ctr tasks list

# &#x5728;&#x5BB9;&#x5668;&#x4E2D;&#x6267;&#x884C;&#x547D;&#x4EE4;
sudo ctr tasks exec --exec-id $RANDOM -t &lt;container-id&gt; /bin/sh

# &#x67E5;&#x770B;&#x547D;&#x540D;&#x7A7A;&#x95F4;
sudo ctr namespaces list
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Kubernetes 简述]]></title><description><![CDATA[K3s、K8s 相关概念小记]]></description><link>https://www.7-0.cc/kubernetes-introduction/</link><guid isPermaLink="false">69b40ca3b1f19d0001c3e12b</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Mon, 03 Nov 2025 16:28:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: Kubernetes;k8s<br>
@@ Date: 2025-11-04 1428<br>
@@ Note:</p>
<ul>
<li><a href="https://kubernetes.io/zh-cn/docs/home/?ref=7-0.cc">Kubernetes &#x6587;&#x6863;</a></li>
<li><a href="https://chengweihu.com/kubernetes-tutorial-1-pod-node/?ref=7-0.cc">Kubernetes &#x57FA;&#x7840;&#x6559;&#x5B66;</a></li>
</ul>
<p>Kubernetes&#xFF08;&#x5E38;&#x7B80;&#x79F0;&#x4E3A; K8s&#xFF09;&#x662F;&#x4E00;&#x4E2A;&#x5F00;&#x6E90;&#x7684;&#x5BB9;&#x5668;&#x7F16;&#x6392;&#x5E73;&#x53F0;&#xFF0C;&#x7528;&#x4E8E;&#x81EA;&#x52A8;&#x5316;&#x90E8;&#x7F72;&#x3001;&#x6269;&#x5C55;&#x548C;&#x7BA1;&#x7406;&#x5BB9;&#x5668;&#x5316;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x3002;</p>
<h2 id="%E6%A6%82%E5%BF%B5">&#x6982;&#x5FF5;</h2>
<h3 id="kubernetes-%E8%A6%81%E8%A7%A3%E5%86%B3%E7%9A%84%E9%97%AE%E9%A2%98">Kubernetes &#x8981;&#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;</h3>
<p>&#x5728;&#x5BB9;&#x5668;&#x6280;&#x672F;&#xFF08;&#x5982; Docker&#xFF09;&#x666E;&#x53CA;&#x4E4B;&#x524D;&#xFF0C;&#x5E94;&#x7528;&#x7684;&#x90E8;&#x7F72;&#x548C;&#x8FD0;&#x7EF4;&#x9762;&#x4E34;&#x8BF8;&#x591A;&#x6311;&#x6218;&#xFF1A;</p>
<ol>
<li><strong>&#x73AF;&#x5883;&#x4E0D;&#x4E00;&#x81F4;</strong>&#xFF1A;&#x5F00;&#x53D1;&#x3001;&#x6D4B;&#x8BD5;&#x3001;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x5DEE;&#x5F02;&#x5BFC;&#x81F4;&#x201C;&#x5728;&#x6211;&#x8FD9;&#x513F;&#x662F;&#x597D;&#x7684;&#x201D;&#x95EE;&#x9898;&#x3002;</li>
<li><strong>&#x90E8;&#x7F72;&#x7E41;&#x7410;</strong>&#xFF1A;&#x624B;&#x52A8;&#x90E8;&#x7F72;&#x5E94;&#x7528;&#xFF0C;&#x6D41;&#x7A0B;&#x590D;&#x6742;&#x4E14;&#x5BB9;&#x6613;&#x51FA;&#x9519;&#x3002;</li>
<li><strong>&#x8D44;&#x6E90;&#x5229;&#x7528;&#x7387;&#x4F4E;</strong>&#xFF1A;&#x6BCF;&#x4E2A;&#x7269;&#x7406;&#x673A;&#x6216;&#x865A;&#x62DF;&#x673A;&#x901A;&#x5E38;&#x53EA;&#x8FD0;&#x884C;&#x4E00;&#x4E2A;&#x5E94;&#x7528;&#xFF0C;&#x8D44;&#x6E90;&#x6D6A;&#x8D39;&#x4E25;&#x91CD;&#x3002;</li>
<li><strong>&#x6269;&#x7F29;&#x5BB9;&#x56F0;&#x96BE;</strong>&#xFF1A;&#x6D41;&#x91CF;&#x9AD8;&#x5CF0;&#x65F6;&#xFF0C;&#x624B;&#x52A8;&#x589E;&#x52A0;&#x670D;&#x52A1;&#x5668;&#x5B9E;&#x4F8B;&#x901F;&#x5EA6;&#x6162;&#xFF0C;&#x6210;&#x672C;&#x9AD8;&#x3002;</li>
<li><strong>&#x6545;&#x969C;&#x6062;&#x590D;&#x6162;</strong>&#xFF1A;&#x5E94;&#x7528;&#x6216;&#x673A;&#x5668;&#x5B95;&#x673A;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x4EBA;&#x5DE5;&#x4ECB;&#x5165;&#x6062;&#x590D;&#xFF0C;&#x505C;&#x673A;&#x65F6;&#x95F4;&#x957F;&#x3002;</li>
</ol>
<p><strong>&#x5BB9;&#x5668;&#x6280;&#x672F;</strong>&#xFF08;&#x5982; Docker&#xFF09;&#x89E3;&#x51B3;&#x4E86;&#x7B2C;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x5B83;&#x901A;&#x8FC7;&#x955C;&#x50CF;&#x4FDD;&#x8BC1;&#x4E86;&#x73AF;&#x5883;&#x7684;&#x4E00;&#x81F4;&#x6027;&#x3002;&#x4F46;&#x540E;&#x56DB;&#x4E2A;&#x95EE;&#x9898;&#x4F9D;&#x7136;&#x5B58;&#x5728;&#xFF1A;</p>
<ul>
<li>&#x4F60;&#x6709;&#x6210;&#x767E;&#x4E0A;&#x5343;&#x4E2A;&#x5BB9;&#x5668;&#xFF0C;&#x5982;&#x4F55;&#x8C03;&#x5EA6;&#x5B83;&#x4EEC;&#x5230;&#x5408;&#x9002;&#x7684;&#x673A;&#x5668;&#x4E0A;&#xFF1F;</li>
<li>&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x5BB9;&#x5668;&#x6570;&#x91CF;&#x59CB;&#x7EC8;&#x6EE1;&#x8DB3;&#x7528;&#x6237;&#x9700;&#x6C42;&#xFF1F;</li>
<li>&#x5BB9;&#x5668;&#x4E4B;&#x95F4;&#x5982;&#x4F55;&#x53D1;&#x73B0;&#x548C;&#x901A;&#x4FE1;&#xFF1F;</li>
<li>&#x5982;&#x4F55;&#x5E73;&#x6ED1;&#x5730;&#x66F4;&#x65B0;&#x5E94;&#x7528;&#x800C;&#x4E0D;&#x4E2D;&#x65AD;&#x670D;&#x52A1;&#xFF1F;</li>
</ul>
<p><strong>Kubernetes &#x5C31;&#x662F;&#x4E3A;&#x4E86;&#x89E3;&#x51B3;&#x8FD9;&#x4E9B;&#x5BB9;&#x5668;&#x7F16;&#x6392;&#x548C;&#x7BA1;&#x7406;&#x95EE;&#x9898;&#x800C;&#x751F;&#x7684;&#x3002;</strong></p>
<h3 id="kubernetes-%E7%9A%84%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84">Kubernetes &#x7684;&#x6838;&#x5FC3;&#x67B6;&#x6784;</h3>
<p>Kubernetes &#x91C7;&#x7528;&#x7ECF;&#x5178;&#x7684;<strong>&#x4E3B;&#x4ECE;&#x67B6;&#x6784;</strong>&#xFF0C;&#x5206;&#x4E3A;<strong>&#x63A7;&#x5236;&#x5E73;&#x9762;</strong> &#x548C;<strong>&#x5DE5;&#x4F5C;&#x8282;&#x70B9;</strong>&#x3002;</p>
<h4 id="1-%E6%8E%A7%E5%88%B6%E5%B9%B3%E9%9D%A2">1. &#x63A7;&#x5236;&#x5E73;&#x9762;</h4>
<p>&#x63A7;&#x5236;&#x5E73;&#x9762;&#x662F; Kubernetes &#x7684;&#x201C;&#x5927;&#x8111;&#x201D;&#xFF0C;&#x8D1F;&#x8D23;&#x7BA1;&#x7406;&#x6574;&#x4E2A;&#x96C6;&#x7FA4;&#x7684;&#x6240;&#x6709;&#x51B3;&#x7B56;&#x3002;&#x5B83;&#x5305;&#x542B;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x6838;&#x5FC3;&#x7EC4;&#x4EF6;&#xFF1A;</p>
<ul>
<li>
<p><strong>API Server</strong></p>
<ul>
<li>&#x6574;&#x4E2A;&#x7CFB;&#x7EDF;&#x7684;<strong>&#x552F;&#x4E00;&#x5165;&#x53E3;</strong>&#x3002;&#x6240;&#x6709;&#x7528;&#x6237;&#x3001;&#x5BA2;&#x6237;&#x7AEF;&#x548C;&#x5176;&#x4ED6;&#x7EC4;&#x4EF6;&#x7684;&#x8BF7;&#x6C42;&#x90FD;&#x5FC5;&#x987B;&#x901A;&#x8FC7; API Server&#x3002;</li>
<li>&#x5B83;&#x63D0;&#x4F9B;&#x4E86; <code>RESTful API</code>&#xFF0C;&#x662F;&#x524D;&#x7AEF;&#x754C;&#x9762;&#xFF08;&#x5982; <code>kubectl</code>&#xFF09;&#x4E0E;&#x96C6;&#x7FA4;&#x4EA4;&#x4E92;&#x7684;&#x6865;&#x6881;&#x3002;</li>
</ul>
</li>
<li>
<p><strong>etcd</strong></p>
<ul>
<li>&#x4E00;&#x4E2A;&#x9AD8;&#x53EF;&#x7528;&#x7684;<strong>&#x952E;&#x503C;&#x5BF9;&#x6570;&#x636E;&#x5E93;</strong>&#x3002;</li>
<li>Kubernetes &#x6240;&#x6709;&#x96C6;&#x7FA4;&#x6570;&#x636E;&#xFF08;&#x5982;&#x8282;&#x70B9;&#x4FE1;&#x606F;&#x3001;Pod &#x72B6;&#x6001;&#x3001;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#x7B49;&#xFF09;&#x90FD;&#x6301;&#x4E45;&#x5316;&#x5B58;&#x50A8;&#x5728; etcd &#x4E2D;&#x3002;</li>
<li>&#x5B83;&#x662F; Kubernetes &#x7684;&#x201C;&#x552F;&#x4E00;&#x4FE1;&#x6E90;&#x201D;&#x3002;</li>
</ul>
</li>
<li>
<p><strong>Scheduler</strong><br>
<strong>&#x8C03;&#x5EA6;&#x5668;</strong>&#x3002;&#x5B83;&#x8D1F;&#x8D23;&#x76D1;&#x89C6;&#x65B0;&#x521B;&#x5EFA;&#x7684;&#x3001;&#x8FD8;&#x672A;&#x88AB;&#x8C03;&#x5EA6;&#x5230;&#x8282;&#x70B9;&#x4E0A;&#x7684; Pod&#xFF0C;&#x5E76;&#x6839;&#x636E;&#x8D44;&#x6E90;&#x9700;&#x6C42;&#x3001;&#x7B56;&#x7565;&#x7B49;&#x56E0;&#x7D20;&#xFF0C;&#x9009;&#x62E9;&#x4E00;&#x4E2A;&#x6700;&#x5408;&#x9002;&#x7684; Node &#x6765;&#x8FD0;&#x884C;&#x5B83;&#x3002;</p>
</li>
<li>
<p><strong>Controller Manager</strong><br>
<strong>&#x63A7;&#x5236;&#x5668;&#x7BA1;&#x7406;&#x5668;</strong>&#x3002;&#x5B83;&#x8FD0;&#x884C;&#x7740;&#x5404;&#x79CD;&#x63A7;&#x5236;&#x5668;&#xFF0C;&#x8FD9;&#x4E9B;&#x63A7;&#x5236;&#x5668;&#x5C31;&#x50CF;&#x662F;&#x96C6;&#x7FA4;&#x7684;&#x201C;&#x81EA;&#x52A8;&#x4FEE;&#x590D;&#x7CFB;&#x7EDF;&#x201D;&#xFF0C;&#x4E0D;&#x65AD;&#x5730;&#x89C2;&#x5BDF;&#x96C6;&#x7FA4;&#x7684;&#x72B6;&#x6001;&#xFF0C;&#x786E;&#x4FDD;&#x5176;&#x4E0E;&#x671F;&#x671B;&#x7684;&#x72B6;&#x6001;&#x4E00;&#x81F4;&#x3002;&#x4F8B;&#x5982;</p>
<ul>
<li><strong>&#x8282;&#x70B9;&#x63A7;&#x5236;&#x5668;</strong>&#xFF1A;&#x8D1F;&#x8D23;&#x76D1;&#x6D4B;&#x8282;&#x70B9;&#x6545;&#x969C;&#x3002;</li>
<li><strong>&#x526F;&#x672C;&#x63A7;&#x5236;&#x5668;</strong>&#xFF1A;&#x786E;&#x4FDD; Pod &#x7684;&#x526F;&#x672C;&#x6570;&#x91CF;&#x59CB;&#x7EC8;&#x7B26;&#x5408;&#x7528;&#x6237;&#x5B9A;&#x4E49;&#x7684;&#x6570;&#x91CF;&#x3002;</li>
</ul>
</li>
</ul>
<h4 id="2-%E5%B7%A5%E4%BD%9C%E8%8A%82%E7%82%B9">2. &#x5DE5;&#x4F5C;&#x8282;&#x70B9;</h4>
<p>&#x5DE5;&#x4F5C;&#x8282;&#x70B9;&#x662F;&#x771F;&#x6B63;&#x8FD0;&#x884C;&#x5BB9;&#x5668;&#x5316;&#x5E94;&#x7528;&#x7684;&#x5730;&#x65B9;&#x3002;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x4E0A;&#x8FD0;&#x884C;&#x7740;&#xFF1A;</p>
<ul>
<li>
<p><strong>Kubelet</strong><br>
&#x8282;&#x70B9;&#x4E0A;&#x7684;&#x201C;&#x4EE3;&#x7406;&#x201D;&#xFF0C;&#x5B83;&#x8D1F;&#x8D23;&#x4E0E;&#x63A7;&#x5236;&#x5E73;&#x9762;&#x901A;&#x4FE1;&#xFF0C;&#x7BA1;&#x7406;&#x672C;&#x8282;&#x70B9;&#x4E0A; Pod &#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#xFF0C;&#x4F8B;&#x5982;&#x521B;&#x5EFA;&#x3001;&#x542F;&#x52A8;&#x3001;&#x505C;&#x6B62;&#x5BB9;&#x5668;&#xFF0C;&#x5E76;&#x5B9A;&#x671F;&#x5411; <strong>API Server</strong> &#x62A5;&#x544A;&#x8282;&#x70B9;&#x548C; Pod &#x7684;&#x72B6;&#x6001;&#x3002;</p>
</li>
<li>
<p><strong>Kube Proxy</strong><br>
&#x7F51;&#x7EDC;&#x4EE3;&#x7406;&#xFF0C;&#x5B83;&#x901A;&#x8FC7;&#x5728;&#x8282;&#x70B9;&#x4E0A;&#x7EF4;&#x62A4;&#x7F51;&#x7EDC;&#x89C4;&#x5219;&#xFF0C;&#x5B9E;&#x73B0;&#x4E86; Kubernetes <strong>Service</strong> &#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x8D1F;&#x8D23;&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x548C;&#x5C06;&#x6D41;&#x91CF;&#x8F6C;&#x53D1;&#x5230;&#x6B63;&#x786E;&#x7684; Pod&#x3002;</p>
</li>
<li>
<p><strong>&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x65F6;</strong><br>
&#x8D1F;&#x8D23;&#x8FD0;&#x884C;&#x5BB9;&#x5668;&#x7684;&#x8F6F;&#x4EF6;&#xFF0C;&#x6BD4;&#x5982; Docker&#x3001;containerd &#x6216; CRI-O&#x3002;Kubelet &#x901A;&#x8FC7;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x65F6;&#x63A5;&#x53E3;&#x4E0E;&#x5B83;&#x4EEC;&#x4EA4;&#x4E92;&#x6765;&#x542F;&#x52A8;&#x548C;&#x505C;&#x6B62;&#x5BB9;&#x5668;&#x3002;</p>
</li>
</ul>
<h3 id="%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5%E4%B8%8E%E5%AF%B9%E8%B1%A1">&#x6838;&#x5FC3;&#x6982;&#x5FF5;&#x4E0E;&#x5BF9;&#x8C61;</h3>
<p>&#x8981;&#x7406;&#x89E3; Kubernetes &#x5982;&#x4F55;&#x5DE5;&#x4F5C;&#xFF0C;&#x5FC5;&#x987B;&#x5148;&#x638C;&#x63E1;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x6838;&#x5FC3;&#x5BF9;&#x8C61;&#xFF08;&#x5728; K8s &#x4E2D;&#xFF0C;&#x4F60;&#x901A;&#x8FC7;&#x521B;&#x5EFA;&#x8FD9;&#x4E9B;&#x5BF9;&#x8C61;&#x6765;&#x5B9A;&#x4E49;&#x4F60;&#x7684;&#x5E94;&#x7528;&#xFF09;&#xFF1A;</p>
<ol>
<li>
<p><strong>Pod</strong>:</p>
<ul>
<li><strong>Kubernetes &#x4E2D;&#x6700;&#x5C0F;&#x7684;&#x53EF;&#x90E8;&#x7F72;&#x548C;&#x7BA1;&#x7406;&#x5355;&#x5143;</strong>&#x3002;</li>
<li>&#x4E00;&#x4E2A; Pod &#x5305;&#x542B;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x5BB9;&#x5668;&#xFF08;&#x901A;&#x5E38;&#x662F;&#x7D27;&#x5BC6;&#x76F8;&#x5173;&#x7684;&#x5BB9;&#x5668;&#xFF0C;&#x4F8B;&#x5982;&#x5E94;&#x7528;&#x5BB9;&#x5668;&#x548C;&#x65E5;&#x5FD7;&#x6536;&#x96C6; sidecar &#x5BB9;&#x5668;&#xFF09;&#x3002;</li>
<li>&#x8FD9;&#x4E9B;&#x5BB9;&#x5668;&#x5171;&#x4EAB;&#x7F51;&#x7EDC;&#x547D;&#x540D;&#x7A7A;&#x95F4;&#x3001;&#x5B58;&#x50A8;&#x5377;&#x548C;&#x5176;&#x4ED6;&#x8D44;&#x6E90;&#x3002;</li>
<li><strong>Pod &#x662F;&#x77ED;&#x6682;&#x7684;</strong>&#xFF0C;&#x4F1A;&#x88AB;&#x9891;&#x7E41;&#x5730;&#x521B;&#x5EFA;&#x548C;&#x9500;&#x6BC1;&#x3002;</li>
</ul>
</li>
<li>
<p><strong>Deployment</strong>&#xFF1A;</p>
<ul>
<li>&#x7528;&#x4E8E;<strong>&#x5B9A;&#x4E49; Pod &#x7684;&#x671F;&#x671B;&#x72B6;&#x6001;</strong>&#xFF08;&#x4F8B;&#x5982;&#xFF0C;&#x9700;&#x8981;&#x8FD0;&#x884C; 3 &#x4E2A;&#x526F;&#x672C;&#x7684; Nginx Pod&#xFF09;&#x3002;</li>
<li>&#x5B83;&#x63D0;&#x4F9B;&#x4E86;<strong>&#x58F0;&#x660E;&#x5F0F;&#x7684;&#x66F4;&#x65B0;</strong>&#x673A;&#x5236;&#x3002;&#x5F53;&#x4F60;&#x66F4;&#x65B0; Pod &#x6A21;&#x677F;&#x65F6;&#xFF08;&#x4F8B;&#x5982;&#xFF0C;&#x4F7F;&#x7528;&#x65B0;&#x7684;&#x955C;&#x50CF;&#x7248;&#x672C;&#xFF09;&#xFF0C;Deployment &#x4F1A;&#x4EE5;&#x53EF;&#x63A7;&#x7684;&#x65B9;&#x5F0F;&#xFF08;&#x6EDA;&#x52A8;&#x66F4;&#x65B0;&#xFF09;&#x521B;&#x5EFA;&#x65B0;&#x7684; Pod&#xFF0C;&#x5E76;&#x9010;&#x6B65;&#x66FF;&#x6362;&#x65E7;&#x7684; Pod&#xFF0C;&#x5B9E;&#x73B0;&#x96F6;&#x505C;&#x673A;&#x90E8;&#x7F72;&#x3002;</li>
<li>&#x5B83;&#x662F;&#x7BA1;&#x7406;&#x65E0;&#x72B6;&#x6001;&#x5E94;&#x7528;&#x7684;&#x9996;&#x9009;&#x5BF9;&#x8C61;&#x3002;</li>
</ul>
</li>
<li>
<p><strong>Service</strong>&#xFF1A;</p>
<ul>
<li>&#x56E0;&#x4E3A; Pod &#x662F;&#x77ED;&#x6682;&#x7684;&#xFF0C;&#x5B83;&#x4EEC;&#x7684; IP &#x5730;&#x5740;&#x4F1A;&#x53D8;&#x5316;&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x4F9D;&#x8D56; Pod IP &#x6765;&#x8BBF;&#x95EE;&#x670D;&#x52A1;&#x3002;</li>
<li><strong>Service &#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x7A33;&#x5B9A;&#x7684;&#x7F51;&#x7EDC;&#x7AEF;&#x70B9;&#xFF08;&#x4E00;&#x4E2A;&#x56FA;&#x5B9A;&#x7684; IP &#x5730;&#x5740;&#x548C; DNS &#x540D;&#x79F0;&#xFF09;</strong>&#xFF0C;&#x4E3A;&#x4E00;&#x7EC4;&#x529F;&#x80FD;&#x76F8;&#x540C;&#x7684; Pod&#xFF08;&#x901A;&#x5E38;&#x7531; Deployment &#x7BA1;&#x7406;&#xFF09;&#x63D0;&#x4F9B;&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x3002;</li>
<li>&#x65E0;&#x8BBA;&#x540E;&#x7AEF;&#x7684; Pod &#x5982;&#x4F55;&#x521B;&#x5EFA;&#x3001;&#x9500;&#x6BC1;&#x6216;&#x8FC1;&#x79FB;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x90FD;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; Service &#x7684;&#x56FA;&#x5B9A;&#x5730;&#x5740;&#x8BBF;&#x95EE;&#x5230;&#x5B83;&#x4EEC;&#x3002;</li>
</ul>
</li>
<li>
<p><strong>Namespace</strong>&#xFF1A;</p>
<ul>
<li>&#x5728;&#x7269;&#x7406;&#x96C6;&#x7FA4;&#x5185;&#x90E8;&#x521B;&#x5EFA;&#x7684;<strong>&#x865A;&#x62DF;&#x96C6;&#x7FA4;</strong>&#xFF0C;&#x7528;&#x4E8E;&#x5B9E;&#x73B0;&#x8D44;&#x6E90;&#x9694;&#x79BB;&#x548C;&#x591A;&#x79DF;&#x6237;&#x7BA1;&#x7406;&#x3002;</li>
<li>&#x53EF;&#x4EE5;&#x5C06;&#x8D44;&#x6E90;&#xFF08;&#x5982; Pod&#x3001;Service&#xFF09;&#x5212;&#x5206;&#x5230;&#x4E0D;&#x540C;&#x7684;&#x547D;&#x540D;&#x7A7A;&#x95F4;&#x4E2D;&#xFF0C;&#x65B9;&#x4FBF;&#x7BA1;&#x7406;&#x548C;&#x6743;&#x9650;&#x63A7;&#x5236;&#x3002;<code>default</code>&#x3001;<code>kube-system</code> &#x662F;&#x5185;&#x7F6E;&#x7684;&#x547D;&#x540D;&#x7A7A;&#x95F4;&#x3002;</li>
</ul>
</li>
<li>
<p><strong>Volume</strong>&#xFF1A;</p>
<ul>
<li>Pod &#x4E2D;&#x7684;&#x5BB9;&#x5668;&#x662F;&#x77ED;&#x6682;&#x7684;&#xFF0C;&#x5176;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x4E5F;&#x662F;&#x4E34;&#x65F6;&#x7684;&#x3002;&#x5F53;&#x5BB9;&#x5668;&#x91CD;&#x542F;&#x65F6;&#xFF0C;&#x6570;&#x636E;&#x4F1A;&#x4E22;&#x5931;&#x3002;</li>
<li><strong>Volume &#x63D0;&#x4F9B;&#x4E86;&#x6301;&#x4E45;&#x5316;&#x5B58;&#x50A8;&#x7684;&#x80FD;&#x529B;</strong>&#xFF0C;&#x5141;&#x8BB8;&#x5BB9;&#x5668;&#x4E2D;&#x7684;&#x6570;&#x636E;&#x5728;&#x91CD;&#x542F;&#x540E;&#x4F9D;&#x7136;&#x5B58;&#x5728;&#x3002;Kubernetes &#x652F;&#x6301;&#x591A;&#x79CD;&#x5B58;&#x50A8;&#x7CFB;&#x7EDF;&#xFF08;&#x5982; NFS&#x3001;&#x4E91;&#x63D0;&#x4F9B;&#x5546;&#x76D8;&#x7B49;&#xFF09;&#x3002;</li>
</ul>
</li>
<li>
<p><strong>ConfigMap &amp; Secret</strong>&#xFF1A;</p>
<ul>
<li><strong>ConfigMap</strong> &#x7528;&#x4E8E;&#x5C06;<strong>&#x975E;&#x673A;&#x5BC6;&#x7684;&#x914D;&#x7F6E;&#x6570;&#x636E;</strong>&#xFF08;&#x5982;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x3001;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#xFF09;&#x4E0E;&#x5BB9;&#x5668;&#x955C;&#x50CF;&#x89E3;&#x8026;&#x3002;</li>
<li><strong>Secret</strong> &#x7528;&#x4E8E;&#x5B58;&#x50A8;<strong>&#x654F;&#x611F;&#x4FE1;&#x606F;</strong>&#xFF08;&#x5982;&#x5BC6;&#x7801;&#x3001;OAuth &#x4EE4;&#x724C;&#x3001;ssh &#x5BC6;&#x94A5;&#xFF09;&#xFF0C;&#x5E76;&#x4EE5;&#x66F4;&#x5B89;&#x5168;&#x7684;&#x65B9;&#x5F0F;&#x4F20;&#x9012;&#x7ED9; Pod&#x3002;</li>
</ul>
</li>
</ol>
<h4 id="%E4%BD%BF%E7%94%A8-yaml-%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%96%87%E4%BB%B6%E8%A1%A8%E7%A4%BA-kubernetes-%E5%AF%B9%E8%B1%A1">&#x4F7F;&#x7528; .yaml &#x683C;&#x5F0F;&#x7684;&#x6587;&#x4EF6;&#x8868;&#x793A; Kubernetes &#x5BF9;&#x8C61;</h4>
<ul>
<li><a href="https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/?ref=7-0.cc">Kubernetes &#x5BF9;&#x8C61;</a></li>
</ul>
<p><strong>Kubernetes &#x5BF9;&#x8C61;</strong>&#x662F;&#x6301;&#x4E45;&#x5316;&#x7684;&#x5B9E;&#x4F53;&#x3002; Kubernetes &#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x5B9E;&#x4F53;&#x53BB;&#x8868;&#x793A;&#x6574;&#x4E2A;&#x96C6;&#x7FA4;&#x7684;&#x72B6;&#x6001;&#x3002; &#x5177;&#x4F53;&#x800C;&#x8A00;&#xFF0C;&#x5B83;&#x4EEC;&#x63CF;&#x8FF0;&#x4E86;&#x5982;&#x4E0B;&#x4FE1;&#x606F;&#xFF1A;</p>
<ul>
<li>&#x54EA;&#x4E9B;&#x5BB9;&#x5668;&#x5316;&#x5E94;&#x7528;&#x6B63;&#x5728;&#x8FD0;&#x884C;&#xFF08;&#x4EE5;&#x53CA;&#x5728;&#x54EA;&#x4E9B;&#x8282;&#x70B9;&#x4E0A;&#x8FD0;&#x884C;&#xFF09;</li>
<li>&#x53EF;&#x4EE5;&#x88AB;&#x5E94;&#x7528;&#x4F7F;&#x7528;&#x7684;&#x8D44;&#x6E90;</li>
<li>&#x5173;&#x4E8E;&#x5E94;&#x7528;&#x8FD0;&#x884C;&#x65F6;&#x884C;&#x4E3A;&#x7684;&#x7B56;&#x7565;&#xFF0C;&#x6BD4;&#x5982;&#x91CD;&#x542F;&#x7B56;&#x7565;&#x3001;&#x5347;&#x7EA7;&#x7B56;&#x7565;&#x4EE5;&#x53CA;&#x5BB9;&#x9519;&#x7B56;&#x7565;</li>
</ul>
<p>&#x51E0;&#x4E4E;&#x6BCF;&#x4E2A; Kubernetes &#x5BF9;&#x8C61;&#x5305;&#x542B;&#x4E24;&#x4E2A;&#x5D4C;&#x5957;&#x7684;&#x5BF9;&#x8C61;&#x5B57;&#x6BB5;&#xFF0C;&#x5B83;&#x4EEC;&#x8D1F;&#x8D23;&#x7BA1;&#x7406;&#x5BF9;&#x8C61;&#x7684;&#x914D;&#x7F6E;&#xFF1A;</p>
<ul>
<li>&#x5BF9;&#x8C61; <strong><code>spec</code>&#xFF08;&#x89C4;&#x7EA6;&#xFF09;</strong>
<ul>
<li>&#x5728;&#x521B;&#x5EFA;&#x5BF9;&#x8C61;&#x65F6;&#x8BBE;&#x7F6E;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x63CF;&#x8FF0;&#x4F60;&#x5E0C;&#x671B;&#x5BF9;&#x8C61;&#x6240;&#x5177;&#x6709;&#x7684;&#x7279;&#x5F81;&#xFF1A; &#x671F;&#x671B;&#x72B6;&#x6001;&#xFF08;Desired State&#xFF09;&#x3002;</li>
</ul>
</li>
<li>&#x5BF9;&#x8C61; <strong><code>status</code>&#xFF08;&#x72B6;&#x6001;&#xFF09;</strong>
<ul>
<li>&#x63CF;&#x8FF0;&#x4E86;&#x5BF9;&#x8C61;&#x7684;&#x5F53;&#x524D;&#x72B6;&#x6001;&#xFF08;Current State&#xFF09;&#xFF0C;&#x5B83;&#x662F;&#x7531; Kubernetes &#x7CFB;&#x7EDF;&#x548C;&#x7EC4;&#x4EF6;&#x8BBE;&#x7F6E;&#x5E76;&#x66F4;&#x65B0;&#x7684;&#x3002;</li>
</ul>
</li>
</ul>
<h5 id="%E6%8F%8F%E8%BF%B0-kubernetes-%E5%AF%B9%E8%B1%A1">&#x63CF;&#x8FF0; Kubernetes &#x5BF9;&#x8C61;</h5>
<p>&#x901A;&#x5E38;&#x4F1A;&#x901A;&#x8FC7; &#x6E05;&#x5355;&#xFF08;Manifest&#xFF09; &#x6587;&#x4EF6;&#x6765;&#x63CF;&#x8FF0; Kubernetes &#x5BF9;&#x8C61;, &#x6BD4;&#x5982;&#x5BF9;&#x8C61;&#x7684;&#x57FA;&#x672C;&#x4FE1;&#x606F;&#x3001;spec&#x3002;&#x7136;&#x540E;&#x4F7F;&#x7528; kubectl &#x521B;&#x5EFA;&#x5BF9;&#x8C61;&#x3002;</p>
<p>&#x8BE5;&#x6E05;&#x5355;&#x6587;&#x4EF6;&#xFF0C;&#x6709;&#x4E00;&#x4E9B;&#x5FC5;&#x987B;&#x7684;&#x5B57;&#x6BB5;&#xFF1A;</p>
<ul>
<li><code>apiVersion</code> - &#x521B;&#x5EFA;&#x8BE5;&#x5BF9;&#x8C61;&#x6240;&#x4F7F;&#x7528;&#x7684; Kubernetes API &#x7684;&#x7248;&#x672C;</li>
<li><code>kind</code> - &#x60F3;&#x8981;&#x521B;&#x5EFA;&#x7684;&#x5BF9;&#x8C61;&#x7684;&#x7C7B;&#x522B;</li>
<li><code>metadata</code> - &#x5E2E;&#x52A9;&#x552F;&#x4E00;&#x6807;&#x8BC6;&#x5BF9;&#x8C61;&#x7684;&#x4E00;&#x4E9B;&#x6570;&#x636E;&#xFF0C;&#x5305;&#x62EC;&#x4E00;&#x4E2A; <code>name</code> &#x5B57;&#x7B26;&#x4E32;&#x3001;<code>UID</code> &#x548C;&#x53EF;&#x9009;&#x7684; <code>namespace</code></li>
<li><code>spec</code> - &#x4F60;&#x6240;&#x671F;&#x671B;&#x7684;&#x8BE5;&#x5BF9;&#x8C61;&#x7684;&#x72B6;&#x6001;</li>
</ul>
<p>&#x4F8B;&#x5982; &#x521B;&#x5EFA;&#x4E00;&#x4E2A; Pod &#x7684;&#x6E05;&#x5355;&#x6587;&#x4EF6;&#xFF1A;</p>
<pre><code class="language-yaml"># pods/simple-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
</code></pre>
<p>&#x53EF;&#x4EE5;&#x8FD0;&#x884C;&#x8FD9;&#x4E2A;&#x547D;&#x4EE4;&#x521B;&#x5EFA;: <code>kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml</code></p>
<p>&#x518D;&#x6BD4;&#x5982;&#x4E0B;&#x9762;&#x7684;&#x6E05;&#x5355;&#x6587;&#x4EF6;(&#x4E00;&#x4E2A;&#x5305;&#x542B; Redis &#x548C;&#x591A;&#x4E2A; ComfyUI Worker &#x7684;&#x793A;&#x4F8B;&#x5E94;&#x7528;):</p>
<pre><code class="language-yaml"># comfyui-with-redis.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: comfyui-worker
  labels:
    app: comfyui-worker
spec:
  replicas: 3  # &#x542F;&#x52A8;3&#x4E2A;Worker&#x526F;&#x672C;
  selector:
    matchLabels:
      app: comfyui-worker
  template:    # &#x5B9A;&#x4E49;Pod&#x6A21;&#x677F;
    metadata:
      labels:
        app: comfyui-worker
    spec:
      containers:
      - name: worker
        image: your-comfyui-image:latest  # &#x8BF7;&#x66FF;&#x6362;&#x4E3A;&#x4F60;&#x7684;&#x955C;&#x50CF;
        env:
        - name: REDIS_URL
          value: &quot;redis://redis-service:6379&quot;
        - name: QUEUE_NAME
          value: &quot;comfyui_tasks&quot;
---
apiVersion: v1
kind: Service
metadata:
  name: comfyui-service
spec:
  selector:
    app: comfyui-worker
  ports:
  - port: 8188
    targetPort: 8188
---
# &#x90E8;&#x7F72;Redis
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:7-alpine
        resources:
          requests:
            memory: &quot;128Mi&quot;
            cpu: &quot;100m&quot;
          limits:
            memory: &quot;256Mi&quot;
            cpu: &quot;200m&quot;
---
apiVersion: v1
kind: Service
metadata:
  name: redis-service
spec:
  selector:
    app: redis
  ports:
  - port: 6379
    targetPort: 6379
</code></pre>
<p>&#x914D;&#x7F6E;&#x6E05;&#x5355;&#x7684;&#x5B57;&#x6BB5;&#x53C2;&#x8003;:</p>
<ul>
<li><a href="https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/pod-v1/?ref=7-0.cc">Pod</a></li>
<li><a href="https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/deployment-v1/?ref=7-0.cc">Deployment</a></li>
<li><a href="https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/service-resources/service-v1/?ref=7-0.cc">Service</a></li>
<li><a href="https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/config-and-storage-resources/config-map-v1/?ref=7-0.cc">ConfigMap</a></li>
</ul>
<h5 id="api-%E5%AF%B9%E8%B1%A1">API &#x5BF9;&#x8C61;</h5>
<p><strong>&quot;Kubernetes &#x5BF9;&#x8C61;&quot; &#x548C; &quot;API &#x5BF9;&#x8C61;&quot; &#x57FA;&#x672C;&#x4E0A;&#x6307;&#x7684;&#x662F;&#x540C;&#x4E00;&#x7EC4;&#x4E1C;&#x897F;</strong>&#xFF0C;&#x4F46;&#x5B83;&#x4EEC;&#x7684;&#x4FA7;&#x91CD;&#x70B9;&#x7565;&#x6709;&#x4E0D;&#x540C;&#x3002;</p>
<p><code>Kubernetes &#x5BF9;&#x8C61; = API &#x5BF9;&#x8C61;</code></p>
<p>&#x5B83;&#x4EEC;&#x662F;&#x4ECE;&#x4E0D;&#x540C;&#x89D2;&#x5EA6;&#x5BF9;&#x540C;&#x4E00;&#x5B9E;&#x4F53;&#x7684;&#x79F0;&#x547C;&#xFF1A;</p>
<ul>
<li><strong>&quot;Kubernetes &#x5BF9;&#x8C61;&quot;</strong>&#xFF1A;&#x5F3A;&#x8C03;&#x8FD9;&#x4E9B;&#x5BF9;&#x8C61;&#x5728; <strong>Kubernetes &#x7CFB;&#x7EDF;&#x4E2D;&#x7684;&#x4F5C;&#x7528;&#x548C;&#x529F;&#x80FD;</strong></li>
<li><strong>&quot;API &#x5BF9;&#x8C61;&quot;</strong>&#xFF1A;&#x5F3A;&#x8C03;&#x8FD9;&#x4E9B;&#x5BF9;&#x8C61;&#x901A;&#x8FC7; <strong>Kubernetes API &#x8FDB;&#x884C;&#x521B;&#x5EFA;&#x3001;&#x8BFB;&#x53D6;&#x3001;&#x66F4;&#x65B0;&#x548C;&#x5220;&#x9664;</strong> &#x7684;&#x8BBF;&#x95EE;&#x65B9;&#x5F0F;</li>
</ul>
<h5 id="yaml-api-api-%E5%AF%B9%E8%B1%A1">YAML &gt;&gt; API &gt;&gt; API &#x5BF9;&#x8C61;</h5>
<pre><code class="language-mermaid">flowchart TD
    A[&#x7528;&#x6237;&#x7F16;&#x5199; YAML &#x6587;&#x4EF6;] --&gt; B[YAML &#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x4E86;&#x201C;&#x671F;&#x671B;&#x72B6;&#x6001;&#x201D;]
    B --&gt; C{kubectl apply &#x89E6;&#x53D1; API &#x8C03;&#x7528;}
    
    C -- &#x7528;&#x6237;&#x52A8;&#x4F5C; --&gt; D[POST/PUT &#x8BF7;&#x6C42;&lt;br&gt;&#x9001;&#x8FBE; API Server]
    
    subgraph K [Kubernetes &#x5185;&#x90E8;]
        D --&gt; E[API Server&lt;br&gt;&#x5904;&#x7406;&#x8BF7;&#x6C42;]
        E --&gt; F[Persistent Storage&lt;br&gt;&#x4FDD;&#x5B58;&#x4E3A; API &#x5BF9;&#x8C61;]
        F --&gt; G[&#x63A7;&#x5236;&#x5668;&lt;br&gt;&#x76D1;&#x542C;&#x5E76;&#x534F;&#x8C03;&#x73B0;&#x5B9E;&#x72B6;&#x6001;]
    end
    
    G --&gt; H[&#x96C6;&#x7FA4;&#x72B6;&#x6001;&lt;br&gt;&#x4E0E; YAML &#x63CF;&#x8FF0;&#x4E00;&#x81F4;]
</code></pre>
<ul>
<li>YAML &#x63CF;&#x8FF0;&#x4E86;&#x7528;&#x6237;&#x671F;&#x671B;&#x7684;&#x72B6;&#x6001;, &#x5B83;&#x5185;&#x90E8;&#x7684;&#x5B57;&#x6BB5;&#x4E0E; k8s &#x7684; HTTP RESTful API &#x63A5;&#x53E3;&#x7684;&#x53C2;&#x6570;&#x53EF;&#x4EE5;&#x770B;&#x505A;&#x662F;&#x4E00;&#x4E00;&#x5BF9;&#x5E94;&#x7684;(&#x5728;apply &#x65F6;&#x88AB;&#x8F6C;&#x5316;&#x4E3A;JSON HTTP &#x8BF7;&#x6C42;&#x4F53;&#x4EA4;&#x7ED9; API Server)&#x3002;</li>
<li>API Server &#x63A5;&#x6536;&#x5230;&#x7528;&#x6237;&#x8BF7;&#x6C42;&#x540E;&#xFF0C;&#x5F62;&#x6210;&#x4E00;&#x4E2A; API &#x5BF9;&#x8C61;(&#x521B;&#x5EFA;&#x6216;&#x66F4;&#x65B0;)&#xFF0C;&#x5E76;&#x4FDD;&#x5B58;&#x5230;&#x6301;&#x4E45;&#x5B58;&#x50A8;&#x4E2D;(etcd)&#x3002;&#x8FD9;&#x4E2A;API &#x5BF9;&#x8C61;&#x662F;&#x8D44;&#x6E90;&#x5728; k8s &#x7CFB;&#x7EDF;&#x5185;&#x90E8;&#x6301;&#x4E45;&#x5316;&#x540E;&#x7684;&#x5B9E;&#x4F8B;&#x548C;&#x8868;&#x73B0;&#x5F62;&#x5F0F;&#xFF0C;&#x5B83;&#x662F;&#x96C6;&#x7FA4;&#x201C;&#x671F;&#x671B;&#x72B6;&#x6001;&#x201D;&#x7684;&#x771F;&#x5B9E;&#x6765;&#x6E90;&#x3002;</li>
</ul>
<h2 id="%E7%9B%B8%E5%85%B3%E7%BB%84%E4%BB%B6">&#x76F8;&#x5173;&#x7EC4;&#x4EF6;</h2>
<h3 id="ingress">Ingress</h3>
<p>&#x662F;&#x4E00;&#x4E2A; <strong>API &#x8D44;&#x6E90;&#x5BF9;&#x8C61;</strong>&#x3002;&#x5B83;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x5957;&#x89C4;&#x5219;&#xFF0C;&#x7528;&#x6765;&#x544A;&#x8BC9;&#x96C6;&#x7FA4;&#x5982;&#x4F55;&#x5C06;&#x5916;&#x90E8;&#x7684; HTTP/HTTPS &#x6D41;&#x91CF;&#x8DEF;&#x7531;&#x5230;&#x5185;&#x90E8;&#x7684;&#x670D;&#x52A1;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x628A;&#x5B83;&#x60F3;&#x8C61;&#x6210; <strong>Nginx &#x7684; <code>nginx.conf</code> &#x6216;&#x8005; Apache &#x7684;&#x865A;&#x62DF;&#x4E3B;&#x673A;&#x914D;&#x7F6E;</strong>&#xFF0C;&#x4F46;&#x5B83;&#x662F;&#x4EE5; k8s &#x7684;&#x58F0;&#x660E;&#x5F0F;&#x65B9;&#x5F0F;&#x5199;&#x7684;&#x3002;</p>
<p><img src="https://kubernetes.io/zh-cn/docs/images/ingress.svg" alt="ingress.svg" loading="lazy"></p>
<p>Ingress &#x4E0D;&#x4F1A;&#x968F;&#x610F;&#x516C;&#x5F00;&#x7AEF;&#x53E3;&#x6216;&#x534F;&#x8BAE;&#x3002; &#x5C06; HTTP &#x548C; HTTPS &#x4EE5;&#x5916;&#x7684;&#x670D;&#x52A1;&#x5F00;&#x653E;&#x5230; Internet &#x65F6;&#xFF0C;&#x901A;&#x5E38;&#x4F7F;&#x7528; <a href="https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/?ref=7-0.cc#type-nodeport">Service.Type=NodePort</a> &#x6216; <a href="https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/?ref=7-0.cc#loadbalancer">Service.Type=LoadBalancer</a> &#x7C7B;&#x578B;&#x7684; Service</p>
<p>&#x793A;&#x4F8B;: &#x6240;&#x6709;&#x8BBF;&#x95EE; <code>myapp.example.com</code> &#x7684;&#x6D41;&#x91CF;&#xFF0C;&#x90FD;&#x4F1A;&#x88AB;&#x8F6C;&#x53D1;&#x5230;&#x540D;&#x4E3A; <code>my-app-service</code> &#x7684;&#x96C6;&#x7FA4;&#x5185;&#x90E8;&#x670D;&#x52A1;&#x7684; 80 &#x7AEF;&#x53E3;&#x3002;</p>
<pre><code class="language-yaml">apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80
</code></pre>
<h4 id="ingress-controller">Ingress Controller</h4>
<p>&#x662F; <strong>&#x771F;&#x6B63;&#x5B9E;&#x73B0; Ingress &#x89C4;&#x5219;&#x7684;&#x8F6F;&#x4EF6;</strong>&#x3002;&#x5B83;&#x662F;&#x4E00;&#x4E2A; Pod&#xFF0C;&#x8D1F;&#x8D23;&#x76D1;&#x542C; Kubernetes API &#x4E0A; Ingress &#x8D44;&#x6E90;&#x7684;&#x53D8;&#x5316;&#xFF0C;&#x7136;&#x540E;&#x52A8;&#x6001;&#x5730;&#x914D;&#x7F6E;&#x548C;&#x91CD;&#x8F7D;&#x4E00;&#x4E2A;&#x5B9E;&#x9645;&#x7684;<strong>&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x5668;/&#x53CD;&#x5411;&#x4EE3;&#x7406;</strong>&#xFF08;&#x5982; Nginx, Traefik, Envoy &#x7B49;&#xFF09;&#x6765;&#x6EE1;&#x8DB3;&#x8FD9;&#x4E9B;&#x89C4;&#x5219;&#x3002;</p>
<h4 id="traefik">Traefik</h4>
<ul>
<li><a href="https://doc.traefik.io/traefik/?ref=7-0.cc">Traefik Doc</a></li>
</ul>
<p>Traefik &#x662F;&#x4E00;&#x4E2A;&#x5F00;&#x6E90;&#x7684; Ingress Controller&#xFF0C;&#x5B83;&#x4F7F;&#x7528;&#x53CD;&#x5411;&#x4EE3;&#x7406;&#x548C;&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x6765;&#x6EE1;&#x8DB3; Ingress &#x89C4;&#x5219;&#x3002;</p>
<p>Traefik&#x901A;&#x8FC7;&#x4E0E;Kubernetes API&#x670D;&#x52A1;&#x5668;&#x4EA4;&#x4E92;&#xFF0C;&#x5B9E;&#x65F6;&#x611F;&#x77E5;Service&#x3001;Pod&#x6216;Ingress&#x7B49;&#x8D44;&#x6E90;&#x7684;&#x53D8;&#x5316;&#xFF0C;&#x5E76;&#x81EA;&#x52A8;&#x66F4;&#x65B0;&#x5176;&#x5185;&#x90E8;&#x914D;&#x7F6E;&#xFF0C;&#x5B9E;&#x73B0;&#x670D;&#x52A1;&#x7684;&#x52A8;&#x6001;&#x8DEF;&#x7531;&#x3002;&#x8FD9;&#x533A;&#x522B;&#x4E8E;&#x9700;&#x8981;&#x624B;&#x52A8;&#x914D;&#x7F6E;&#x548C;&#x91CD;&#x8F7D;&#x7684;&#x4F20;&#x7EDF;&#x53CD;&#x5411;&#x4EE3;&#x7406;&#xFF08;&#x5982;Nginx&#xFF09;&#x3002;</p>
<h5 id="traefik-https-%E4%B8%8E-kubernetes-dashbord-%E9%97%AE%E9%A2%98">Traefik https &#x4E0E; kubernetes-dashbord &#x95EE;&#x9898;</h5>
<p>&#x5F53;Traefik &#x5C1D;&#x8BD5;&#x4F7F;&#x7528; HTTPS &#x8FDE;&#x63A5;&#x5230;&#x540E;&#x7AEF;&#x670D;&#x52A1; kubernetes-dashboard:443 &#x65F6;&#xFF0C;&#x4F1A;&#x8FD4;&#x56DE;&#x9519;&#x8BEF;&#xFF1A;</p>
<pre><code class="language-bash">$ curl -vk https://dashboard.gitlab.local
...
*  issuer: CN=TRAEFIK DEFAULT CERT
*  SSL certificate verify result: self signed certificate (18), continuing anyway.
...
* Using Stream ID: 1 (easy handle 0x237a5562140)
&gt; GET / HTTP/2
&gt; Host: dashboard.gitlab.local
&gt; user-agent: curl/7.88.1
&gt; accept: */*
&gt;
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
&lt; HTTP/2 500 
&lt; content-length: 21
&lt; date: Fri, 28 Nov 2025 03:30:04 GMT
&lt;
Internal Server Error* Connection #0 to host dashboard.gitlab.local left intact
</code></pre>
<p>Traefik &#x5BB9;&#x5668;&#x65E5;&#x5FD7;&#x663E;&#x793A;&#xFF1A;</p>
<pre><code class="language-bash">$ kubectl.exe logs -n kube-system traefik-66655fcf4c-84ccw -f
2025-11-28T03:27:28Z INF Starting provider *acme.ChallengeTLSALPN
2025-11-28T03:30:04Z ERR 500 Internal Server Error error=&quot;tls: failed to verify certificate: x509: cannot validate certificate for 10.42.0.131 because it doesn&apos;t contain any IP SANs&quot;
</code></pre>
<p>&#x8FD9;&#x4E2A;&#x9519;&#x8BEF;&#x662F;&#x56E0;&#x4E3A;&#x540E;&#x7AEF;&#x670D;&#x52A1; (<code>kubernetes-dashboard:443</code>) &#x7684; TLS &#x8BC1;&#x4E66;&#x4E0D;&#x5305;&#x542B; <code>IP SAN&#xFF08;Subject Alternative Name&#xFF09;</code>&#xFF0C;&#x65E0;&#x6CD5;&#x9A8C;&#x8BC1;&#x8BC1;&#x4E66;&#x7684;&#x6709;&#x6548;&#x6027;&#x3002;</p>
<blockquote>
<p><strong>SAN (Subject Alternative Name)</strong> &#x662F; TLS &#x8BC1;&#x4E66;&#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x6269;&#x5C55;&#x5B57;&#x6BB5;&#xFF0C;&#x7528;&#x4E8E;&#x6307;&#x5B9A;&#x8BC1;&#x4E66;&#x6709;&#x6548;&#x7684;&#x57DF;&#x540D;&#x6216;IP&#x5730;&#x5740;&#x3002;</p>
<p>&#x5F53;&#x8BC1;&#x4E66;&#x7528;&#x4E8E; IP &#x5730;&#x5740;&#x800C;&#x4E0D;&#x662F;&#x57DF;&#x540D;&#x65F6;&#xFF0C;&#x5FC5;&#x987B;&#x5728; SAN &#x5B57;&#x6BB5;&#x4E2D;&#x5305;&#x542B;&#x8BE5; IP &#x5730;&#x5740;, &#x4F46; kubernetes-dashboard &#x670D;&#x52A1;&#x7684; TLS &#x8BC1;&#x4E66;&#x662F;&#x81EA;&#x7B7E;&#x540D;&#x8BC1;&#x4E66;, &#x6CA1;&#x6709;&#x5305;&#x542B; IP &#x5730;&#x5740;&#x5728; SAN &#x5B57;&#x6BB5;&#x4E2D;&#x3002;</p>
</blockquote>
<p>&#x89E3;&#x51B3;&#x65B9;&#x6848;: <a href="https://community.traefik.io/t/forwarding-to-https-backend-fails-with-ingress/15887/2?ref=7-0.cc">https://community.traefik.io/t/forwarding-to-https-backend-fails-with-ingress/15887/2</a></p>
<h3 id="k8s-%E4%BD%BF%E7%94%A8%E5%BB%BA%E8%AE%AE">K8s &#x4F7F;&#x7528;&#x5EFA;&#x8BAE;</h3>
<p>&#x6807;&#x51C6;&#x7684; Kubernetes&#x867D;&#x7136;&#x529F;&#x80FD;&#x5F3A;&#x5927;&#xFF0C;&#x4F46;&#x5728;&#x67D0;&#x4E9B;&#x573A;&#x666F;&#x4E0B;&#x663E;&#x5F97;&#x8FC7;&#x4E8E;&#x201C;&#x7B28;&#x91CD;&#x201D;&#xFF1A;</p>
<ul>
<li><strong>&#x8D44;&#x6E90;&#x6D88;&#x8017;&#x9AD8;</strong><br>
&#x63A7;&#x5236;&#x5E73;&#x9762;&#x81F3;&#x5C11;&#x9700;&#x8981; 1-2GB &#x5185;&#x5B58;&#xFF0C;&#x5BF9;&#x4E8E;&#x8FB9;&#x7F18;&#x8BBE;&#x5907;&#x3001;IoT &#x6216;&#x5C0F;&#x578B;&#x865A;&#x62DF;&#x673A;&#x6765;&#x8BF4;&#x96BE;&#x4EE5;&#x627F;&#x53D7;&#x3002;</li>
<li><strong>&#x90E8;&#x7F72;&#x590D;&#x6742;</strong><br>
&#x642D;&#x5EFA;&#x4E00;&#x4E2A; K8s &#x96C6;&#x7FA4;&#x9700;&#x8981;&#x914D;&#x7F6E;&#x591A;&#x4E2A;&#x7EC4;&#x4EF6;&#xFF0C;&#x6B65;&#x9AA4;&#x7E41;&#x7410;&#xFF0C;&#x5BB9;&#x6613;&#x51FA;&#x9519;&#x3002;</li>
<li><strong>&#x5916;&#x90E8;&#x4F9D;&#x8D56;</strong><br>
K8s &#x9ED8;&#x8BA4;&#x7684;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x65F6;&#xFF08;&#x5982; Docker&#xFF09;&#x548C;&#x6570;&#x636E;&#x5B58;&#x50A8;&#xFF08;etcd&#xFF09;&#x90FD;&#x9700;&#x8981;&#x5355;&#x72EC;&#x90E8;&#x7F72;&#x548C;&#x7EF4;&#x62A4;&#x3002;</li>
</ul>
<p>&#x56E0;&#x6B64;&#x5728;&#x8D44;&#x6E90;&#x7D27;&#x51D1;&#x7684;&#x73AF;&#x5883;&#x4E0B;&#xFF0C;&#x63A8;&#x8350;&#x4F7F;&#x7528;<strong>K3s</strong>&#xFF0C;&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x5B8C;&#x5168;&#x517C;&#x5BB9; Kubernetes &#x7684;&#x8F7B;&#x91CF;&#x7EA7;&#x53D1;&#x884C;&#x7248;&#xFF0C;&#x6613;&#x4E8E;&#x5B89;&#x88C5;&#xFF0C;&#x4EC5;&#x9700;&#x8981; Kubernetes &#x5185;&#x5B58;&#x7684;&#x4E00;&#x534A;&#xFF0C;&#x6240;&#x6709;&#x7EC4;&#x4EF6;&#x90FD;&#x5728;&#x4E00;&#x4E2A;&#x5C0F;&#x4E8E; 100 MB &#x7684;&#x4E8C;&#x8FDB;&#x5236;&#x6587;&#x4EF6;&#x4E2D;&#x3002;</p>
<h2 id="%E5%8F%82%E8%80%83">&#x53C2;&#x8003;</h2>
<h3 id="minikube">Minikube</h3>
<ul>
<li><a href="https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/?ref=7-0.cc">Minikube</a></li>
</ul>
<p>minikube &#x662F;&#x672C;&#x5730; Kubernetes&#xFF0C;&#x4E13;&#x6CE8;&#x4E8E;&#x8BA9; Kubernetes &#x7684;&#x5B66;&#x4E60;&#x548C;&#x5F00;&#x53D1;&#x53D8;&#x5F97;&#x5BB9;&#x6613;&#x3002;</p>
<h3 id="kubectl-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7">kubectl &#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;</h3>
<ul>
<li><a href="https://kubernetes.io/zh-cn/docs/reference/kubectl/?ref=7-0.cc">kubectl &#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;</a></li>
</ul>
<p>kubectl (&#x201C;Kubernetes Control&#x201D;) &#x662F;&#x4F7F;&#x7528; Kubernetes API &#x4E0E; Kubernetes &#x96C6;&#x7FA4;&#x7684;<strong>&#x63A7;&#x5236;&#x5E73;&#x9762;</strong>&#x8FDB;&#x884C;&#x901A;&#x4FE1;&#x7684;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#x3002;</p>
<h4 id="kubectl-%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86">kubectl &#x5DE5;&#x4F5C;&#x539F;&#x7406;</h4>
<p><code>kubectl</code> &#x672C;&#x8EAB;&#x5E76;&#x4E0D;&#x76F4;&#x63A5;&#x7BA1;&#x7406;&#x5BB9;&#x5668;&#xFF0C;&#x5B83;&#x53EA;&#x662F;&#x4E00;&#x4E2A;&#x5BA2;&#x6237;&#x7AEF;&#x5DE5;&#x5177;&#x3002;&#x5B83;&#x7684;&#x5DE5;&#x4F5C;&#x6D41;&#x7A0B;&#x662F;&#xFF1A;</p>
<ol>
<li>&#x8BFB;&#x53D6;&#x4F60;&#x7684; <code>kubeconfig</code> &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF08;&#x901A;&#x5E38;&#x5728; <code>~/.kube/config</code>&#xFF09;&#xFF0C;&#x83B7;&#x53D6;&#x8981;&#x8BBF;&#x95EE;&#x7684;&#x96C6;&#x7FA4;&#x5730;&#x5740;&#x548C;&#x8BA4;&#x8BC1;&#x4FE1;&#x606F;&#x3002;</li>
<li>&#x5C06;&#x4F60;&#x7684;&#x547D;&#x4EE4;&#x8F6C;&#x6362;&#x4E3A;&#x4E00;&#x4E2A; API &#x8BF7;&#x6C42;&#x3002;</li>
<li>&#x5C06;&#x8FD9;&#x4E2A;&#x8BF7;&#x6C42;&#x53D1;&#x9001;&#x7ED9; Kubernetes API Server&#x3002;</li>
<li>API Server &#x63A5;&#x6536;&#x5230;&#x8BF7;&#x6C42;&#x540E;&#xFF0C;&#x4F1A;&#x6839;&#x636E;&#x8BF7;&#x6C42;&#x7684;&#x7C7B;&#x578B;&#x4E0E;&#x96C6;&#x7FA4;&#x7684;&#x5F53;&#x524D;&#x72B6;&#x6001;&#x8FDB;&#x884C;&#x5904;&#x7406;&#xFF0C;&#x5E76;&#x66F4;&#x65B0; <code>etcd</code> &#x6570;&#x636E;&#x5E93;&#x3002;</li>
<li>&#x5176;&#x4ED6;&#x7684; Kubernetes &#x63A7;&#x5236;&#x5E73;&#x9762;&#x7EC4;&#x4EF6;&#xFF08;&#x5982; Scheduler, Controller Manager&#xFF09;&#x4F1A;&#x76D1;&#x89C6;&#x8FD9;&#x4E9B;&#x53D8;&#x5316;&#xFF0C;&#x5E76;&#x91C7;&#x53D6;&#x884C;&#x52A8;&#x6765;&#x4F7F;&#x96C6;&#x7FA4;&#x7684;&#x5B9E;&#x9645;&#x72B6;&#x6001;&#x4E0E;&#x671F;&#x671B;&#x72B6;&#x6001;&#x4E00;&#x81F4;&#xFF08;&#x4F8B;&#x5982;&#xFF0C;&#x5728;&#x8282;&#x70B9;&#x4E0A;&#x521B;&#x5EFA; Pod&#xFF09;&#x3002;</li>
</ol>
<h3 id="%E5%8D%95%E4%BD%8D">&#x5355;&#x4F4D;</h3>
<pre><code class="language-bash">$ kubectl.exe top pod
NAME                        CPU(cores)   MEMORY(bytes)
echo-app-74f6cd4946-6qn8m   1m           19Mi
echo-app-74f6cd4946-h7ndx   1m           19Mi
echo-app-74f6cd4946-hwljm   1m           19Mi
echo-app-74f6cd4946-s5hxr   1m           19Mi
</code></pre>
<p>1m = 1 millicore&#xFF08;&#x6BEB;&#x6838;&#xFF09;&#x4E5F;&#x5C31;&#x662F; 0.001 CPU &#x6838;&#x5FC3;&#x3002;</p>
<p>Kubernetes &#x5F53;&#x4E2D;&#xFF1A;</p>
<ul>
<li><strong>1000m = 1 CPU &#x6838;</strong>&#xFF08;&#x4E5F;&#x5C31;&#x662F;&#x5BBF;&#x4E3B;&#x673A;&#x7684;&#x4E00;&#x4E2A;&#x903B;&#x8F91;&#x6838;&#x5FC3;&#xFF09;</li>
<li><strong>500m = 0.5 &#x6838;&#x5FC3;</strong></li>
<li><strong>1m = 0.001 &#x6838;&#x5FC3;</strong></li>
</ul>
<p>19Mi = 19 Mebibytes&#xFF08;MiB&#xFF09;= 19 &#xD7; 1024 &#xD7; 1024 bytes</p>
<p>&#x5728;&#x8BA1;&#x7B97;&#x673A;&#x9886;&#x57DF;&#xFF0C;&#x201C;MB&#x201D; &#x5176;&#x5B9E;<strong>&#x65E2;&#x53EF;&#x80FD;&#x662F; 1000&#xD7;1000&#xFF0C;&#x4E5F;&#x53EF;&#x80FD;&#x662F; 1024&#xD7;1024</strong>&#xFF0C;&#x4F46;<strong>&#x4E25;&#x683C;&#x5B9A;&#x4E49;&#x4E0A;&#x5B83;&#x5E94;&#x8BE5;&#x662F;&#x5341;&#x8FDB;&#x5236;&#xFF08;1000&#xFF09;</strong>&#xFF0C;&#x800C;&#x4E8C;&#x8FDB;&#x5236;&#x7684;&#x201C;1024&#x201D;&#x5E94;&#x8BE5;&#x5199;&#x6210; <strong>MiB</strong>&#x3002;</p>
<p>1998 &#x5E74;&#x4E4B;&#x540E;&#xFF0C;&#x56FD;&#x9645;&#x6807;&#x51C6;&#x7EC4;&#x7EC7;&#xFF08;IEC&#xFF09;&#x6B63;&#x5F0F;&#x89C4;&#x5B9A;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>&#x540D;&#x79F0;</th>
<th>&#x7F29;&#x5199;</th>
<th>&#x8FDB;&#x5236;</th>
<th>&#x5B57;&#x8282;</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>KB</strong></td>
<td>Kilobyte</td>
<td>10 &#x8FDB;&#x5236;</td>
<td>1 KB = 1,000 bytes</td>
</tr>
<tr>
<td><strong>MB</strong></td>
<td>Megabyte</td>
<td>10 &#x8FDB;&#x5236;</td>
<td>1 MB = 1,000,000 bytes</td>
</tr>
<tr>
<td><strong>KiB</strong></td>
<td>Kibibyte</td>
<td>2 &#x8FDB;&#x5236;</td>
<td>1 KiB = 1,024 bytes</td>
</tr>
<tr>
<td><strong>MiB</strong></td>
<td>Mebibyte</td>
<td>2 &#x8FDB;&#x5236;</td>
<td>1 MiB = 1,024&#xD7;1,024 = 1,048,576 bytes</td>
</tr>
</tbody>
</table>
]]></content:encoded></item><item><title><![CDATA[人工神经网络]]></title><description><![CDATA[人工神经网络小记，从前向传播的数学表达与数据结构，到反向传播的权重更新推导。]]></description><link>https://www.7-0.cc/neural-network/</link><guid isPermaLink="false">67ffc88a179718c73e398d64</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Mon, 14 Apr 2025 16:00:00 GMT</pubDate><content:encoded><![CDATA[<p>&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#xFF08;Neural Network&#xFF09;&#x662F;&#x673A;&#x5668;&#x5B66;&#x4E60;&#x7684;&#x4E00;&#x4E2A;&#x5206;&#x652F;&#xFF0C;&#x662F;&#x4E00;&#x79CD;&#x6A21;&#x4EFF;&#x751F;&#x7269;&#x795E;&#x7ECF;&#x5143;&#x7ED3;&#x6784;&#x7684;<strong>&#x8BA1;&#x7B97;&#x6A21;&#x578B;</strong>&#xFF0C;&#x4E5F;&#x79F0;&#x4E3A;<strong>&#x4EBA;&#x5DE5;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</strong> (ANN)&#x3002;</p>
<p>&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x65E8;&#x5728;&#x4ECE;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x4E2D;&#x5B66;&#x4E60;&#x6A21;&#x5F0F;&#x548C;&#x5173;&#x7CFB;&#xFF0C;&#x4E0D;&#x65AD;&#x8C03;&#x6574;&#x548C;&#x6539;&#x8FDB;&#xFF0C;&#x5E76;&#x8FD0;&#x7528;&#x6240;&#x5B66;&#x505A;&#x51FA;&#x9884;&#x6D4B;&#x6216;&#x51B3;&#x7B56;&#x3002;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x80FD;&#x591F;&#x4ECE;&#x590D;&#x6742;&#x6570;&#x636E;&#x4E2D;&#x63D0;&#x53D6;&#x6709;&#x610F;&#x4E49;&#x7684;&#x4FE1;&#x606F;&#x6765;&#x89E3;&#x51B3;&#x95EE;&#x9898;&#xFF0C;&#x4E0E;&#x4F20;&#x7EDF;&#x7B97;&#x6CD5;&#x6709;&#x7740;&#x660E;&#x663E;&#x7684;&#x4E0D;&#x540C;&#x3002;</p>
<h2 id="%E5%9F%BA%E6%9C%AC%E7%BB%93%E6%9E%84">&#x57FA;&#x672C;&#x7ED3;&#x6784;</h2>
<ul>
<li><strong>&#x795E;&#x7ECF;&#x5143;</strong>: &#x662F;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x57FA;&#x672C;&#x5355;&#x5143;&#xFF0C;&#x7531;&#x8F93;&#x5165;&#x3001;&#x6FC0;&#x6D3B;&#x51FD;&#x6570;&#x548C;&#x8F93;&#x51FA;&#x7EC4;&#x6210;&#x3002;</li>
<li><strong>&#x8F93;&#x5165;&#x5C42;</strong>&#xFF1A;&#x63A5;&#x6536;&#x539F;&#x59CB;&#x6570;&#x636E;&#xFF08;&#x5982;&#x56FE;&#x50CF;&#x50CF;&#x7D20;&#x3001;&#x6587;&#x672C;&#x5411;&#x91CF;&#x7B49;&#xFF09;&#x3002;</li>
<li><strong>&#x9690;&#x85CF;&#x5C42;</strong>&#xFF1A;&#x8FDB;&#x884C;&#x7279;&#x5F81;&#x63D0;&#x53D6;&#x548C;&#x8F6C;&#x6362;&#xFF08;&#x53EF;&#x80FD;&#x6709;&#x591A;&#x5C42;&#xFF0C;&#x6DF1;&#x5EA6;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x5373;&#x7531;&#x6B64;&#x5F97;&#x540D;&#xFF09;&#x3002;</li>
<li><strong>&#x8F93;&#x51FA;&#x5C42;</strong>&#xFF1A;&#x751F;&#x6210;&#x9884;&#x6D4B;&#x7ED3;&#x679C;&#xFF08;&#x5982;&#x5206;&#x7C7B;&#x6982;&#x7387;&#x3001;&#x56DE;&#x5F52;&#x503C;&#x7B49;&#xFF09;&#x3002;</li>
</ul>
<p>&#x9690;&#x85CF;&#x5C42;&#x4E0E;&#x8F93;&#x51FA;&#x5C42;&#x7531;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x795E;&#x7ECF;&#x5143;&#x7EC4;&#x6210;&#xFF0C;&#x8FD9;&#x4E9B;&#x795E;&#x7ECF;&#x5143;&#x4E5F;&#x88AB;&#x79F0;&#x4E3A;&#x5C42;&#x7684;<strong>&#x8282;&#x70B9;</strong>&#x3002;</p>
<h3 id="%E7%A5%9E%E7%BB%8F%E5%85%83">&#x795E;&#x7ECF;&#x5143;</h3>
<p><img src="https://image.7-0.cc/images/2025/04/11/image11237f8b36549b3f.png" alt="&#x795E;&#x7ECF;&#x5143;&#x793A;&#x610F;&#x56FE;" loading="lazy"></p>
<p>&#x5176;&#x4E2D;&#x7684;&#x7B26;&#x53F7;&#x542B;&#x4E49;&#x4E3A;&#xFF1A;</p>
<ul>
<li>$a1$ ~ $an$ &#x4E3A;&#x795E;&#x7ECF;&#x5143;&#x7684;&#x8F93;&#x5165;&#xFF0C;&#x4E00;&#x822C;&#x662F;&#x4E00;&#x4E2A;&#x5411;&#x91CF;&#x7684;&#x5404;&#x4E2A;&#x5206;&#x91CF;</li>
<li>$w1$ ~ $wn$ &#x4E3A;&#x795E;&#x7ECF;&#x5143;&#x5404;&#x4E2A;&#x7A81;&#x89E6;&#x7684;&#x6743;&#x91CD;&#x503C;(weight)</li>
<li>$b$ &#x4E3A;&#x795E;&#x7ECF;&#x5143;&#x7684;&#x504F;&#x7F6E;(bias)</li>
<li>$f$ &#x4E3A;&#x6FC0;&#x6D3B;&#x51FD;&#x6570;&#xFF0C;&#x4E5F;&#x79F0;&#x4E3A;&#x4F20;&#x9012;&#x51FD;&#x6570;&#xFF0C;&#x901A;&#x5E38;&#x4E3A;&#x975E;&#x7EBF;&#x6027;&#x51FD;&#x6570;&#xFF0C;&#x672C;&#x6587;&#x4E2D;&#x91C7;&#x7528; $sigmoid$&#x3002;</li>
<li>$t$ &#x4E3A;&#x795E;&#x7ECF;&#x5143;&#x8F93;&#x51FA;</li>
</ul>
<p>&#x53EF;&#x89C1;&#xFF0C;&#x4E00;&#x4E2A;&#x795E;&#x7ECF;&#x5143;&#x7684;&#x529F;&#x80FD;&#x662F;&#x6C42;&#x5F97;&#x8F93;&#x5165;&#x5411;&#x91CF;&#x4E0E;&#x6743;&#x5411;&#x91CF;&#x7684;&#x5185;&#x79EF;&#x540E;&#xFF0C;&#x7ECF;&#x4E00;&#x4E2A;&#x975E;&#x7EBF;&#x6027;&#x4F20;&#x9012;&#x51FD;&#x6570;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x6807;&#x91CF;&#x7ED3;&#x679C;&#x3002;</p>
<h2 id="%E5%89%8D%E5%90%91%E4%BC%A0%E6%92%AD">&#x524D;&#x5411;&#x4F20;&#x64AD;</h2>
<p>&#x524D;&#x5411;&#x4F20;&#x64AD;&#x662F;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x6838;&#x5FC3;&#x8BA1;&#x7B97;&#x8FC7;&#x7A0B;&#xFF0C;&#x5176;&#x76EE;&#x7684;&#x662F;&#x901A;&#x8FC7;&#x7F51;&#x7EDC;&#x7684;&#x6743;&#x91CD;&#x548C;&#x6FC0;&#x6D3B;&#x51FD;&#x6570;&#xFF0C;&#x5C06;&#x8F93;&#x5165;&#x4FE1;&#x53F7;&#x4F20;&#x9012;&#x5230;&#x8F93;&#x51FA;&#x5C42;&#xFF0C;&#x5F97;&#x5230;&#x9884;&#x6D4B;&#x7ED3;&#x679C;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x6700;&#x7B80;&#x5355;&#x7684;<strong>&#x524D;&#x9988;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</strong>(Feedforward Network)&#xFF0C;&#x6765;&#x5C55;&#x793A;&#x524D;&#x5411;&#x4F20;&#x64AD;&#x7684;&#x8FC7;&#x7A0B;&#x3002;</p>
<p>&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x793A;&#x610F;&#x56FE;&#x5982;&#x4E0B;:</p>
<p><img src="https://image.7-0.cc/images/2025/04/11/Feedforward-Network.png" alt="Feedforward-Network.png" loading="lazy"></p>
<p><em>&#x56FE; 1-1: Feedforward Network</em></p>
<p>&#x5176;&#x4E2D;&#x7684;&#x7B26;&#x53F7;&#x542B;&#x4E49;&#x4E3A;&#xFF1A;</p>
<ul>
<li>$x_i$&#xFF1A;&#x8F93;&#x5165;&#x5C42;&#x7B2C;i&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x8F93;&#x5165;&#x4FE1;&#x53F7;, &#x5373;&#x6837;&#x672C;&#x7684;&#x7B2C;i&#x4E2A;&#x7279;&#x5F81;&#x503C;&#x3002;</li>
<li>$w_j$&#xFF1A;&#x5404;&#x5C42;&#x7684;&#x8282;&#x70B9;&#x7A81;&#x89E6;&#x7684;&#x6743;&#x91CD;&#x503C;&#x3002;</li>
<li>$b_k$&#xFF1A;&#x5404;&#x5C42;&#x7684;&#x8282;&#x70B9;&#x7684;&#x504F;&#x7F6E;&#x3002;</li>
<li>$h_i$&#xFF1A;&#x9690;&#x85CF;&#x5C42;&#x7B2C;i&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x8F93;&#x51FA;&#x4FE1;&#x53F7;&#x3002;</li>
<li>$y$&#xFF1A;  &#x8F93;&#x51FA;&#x5C42;&#x7684;&#x8F93;&#x51FA;&#x4FE1;&#x53F7;&#x3002;</li>
</ul>
<h3 id="%E5%B1%82%E7%9A%84%E7%89%B9%E5%BE%81">&#x5C42;&#x7684;&#x7279;&#x5F81;</h3>
<ul>
<li><strong>&#x8F93;&#x5165;&#x5C42;&#x7684;&#x8282;&#x70B9;&#x6570;</strong>&#x53D6;&#x51B3;&#x4E8E;&#x8F93;&#x5165;&#x6570;&#x636E;&#x7684;&#x7EF4;&#x5EA6;(<strong>&#x5373;&#x7279;&#x5F81;</strong>)&#x7684;&#x6570;&#x91CF;&#x3002;</li>
<li>&#x8F93;&#x5165;&#x5C42;&#x6570;&#x636E;&#x7684;&#x5F62;&#x72B6;&#x662F;(&#x6837;&#x672C;&#x6570;, &#x7279;&#x5F81;&#x6570;)&#xFF0C;<strong>&#x53EF;&#x4EE5;&#x8F93;&#x5165;&#x4E00;&#x6279;&#x6837;&#x672C;</strong>&#xFF0C;&#x5982;&#x679C;&#x8F93;&#x5165;&#x5355;&#x4E2A;&#x6837;&#x672C;&#x5219;&#x4E3A;(1, &#x7279;&#x5F81;&#x6570;)&#x3002;</li>
<li>&#x6BCF;&#x4E00;&#x5C42;&#x6743;&#x91CD;&#x7684;&#x5F62;&#x72B6;&#x662F;(&#x4E0A;&#x4E00;&#x5C42;&#x8282;&#x70B9;&#x6570;, &#x8BE5;&#x5C42;&#x8282;&#x70B9;&#x6570;)&#x3002;</li>
<li>&#x6BCF;&#x4E00;&#x5C42;&#x504F;&#x7F6E;&#x7684;&#x5F62;&#x72B6;&#x662F;(1, &#x8BE5;&#x5C42;&#x8282;&#x70B9;&#x6570;)&#x3002;</li>
<li>&#x6BCF;&#x4E00;&#x5C42;&#x8F93;&#x51FA;&#x7684;&#x5F62;&#x72B6;&#x662F;(&#x8BE5;&#x5C42;&#x8F93;&#x5165;&#x6570;&#x636E;&#x7684;&#x884C;&#x6570;&#x3010;&#x5373;&#x6837;&#x672C;&#x6570;&#x3011;, &#x8BE5;&#x5C42;&#x8282;&#x70B9;&#x6570;)&#x3002;</li>
</ul>
<h4 id="%E6%95%B0%E5%AD%A6%E8%A1%A8%E8%BE%BE">&#x6570;&#x5B66;&#x8868;&#x8FBE;</h4>
<p>&#x6BCF;&#x4E2A;&#x7F51;&#x7EDC;&#x5C42;&#xFF08;&#x9690;&#x85CF;&#x5C42;&#x548C;&#x8F93;&#x51FA;&#x5C42;&#xFF09;&#xFF0C;&#x90FD;&#x53EF;&#x4EE5;&#x89C6;&#x4E3A;&#x4E00;&#x4E2A;&#x62DF;&#x5408;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x90A3;&#x4E48;<strong>&#x5BF9;&#x4E8E;&#x591A;&#x5C42;&#xFF08;&#x6DF1;&#x5EA6;&#xFF09;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x800C;&#x8A00;&#xFF0C;&#x5B83;&#x7684;&#x6570;&#x5B66;&#x672C;&#x8D28;&#xFF0C;&#x5C31;&#x7B49;&#x540C;&#x4E8E;&#x4E00;&#x4E2A;&#x591A;&#x5C42;&#x7684;&#x590D;&#x5408;&#x51FD;&#x6570;</strong>&#xFF1A; &#x5B83;&#x5B9E;&#x73B0;&#x4E86;&#x4ECE;&#x5411;&#x91CF; $x$ &#x5230;&#x5411;&#x91CF; $y$ &#x7684;&#x6620;&#x5C04;&#xFF08;&#x5982;&#x516C;&#x5F0F;&#x6240;&#x793A;&#xFF09;</p>
<p>$$<br>
y = h_3(h_2(h_1(x)))<br>
$$</p>
<p><em>&#x56FE; 1-1</em> &#x4E2D;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x8F93;&#x5165;&#x4E3A; $x_1, x_2$ &#x8F93;&#x51FA;&#x7684;&#x9884;&#x6D4B;&#x503C;&#x4E3A; $y$, &#x4E0E;&#x5B9E;&#x9645;&#x503C; $Y$ &#x7684;&#x8BEF;&#x5DEE;&#x8BBE;&#x4E3A; $E$&#xFF08;&#x4E5F;&#x5C31;&#x662F; <strong>&#x635F;&#x5931;&#x51FD;&#x6570;</strong>&#xFF09;, &#x5219;&#x6240;&#x6709;&#x516C;&#x5F0F;&#x8868;&#x793A;&#x5982;&#x4E0B;:</p>
<p>$$<br>
\begin{aligned}<br>
h_1 &amp;= sigmoid(x_1 &#xB7; w_1 + x_2 &#xB7; w_2 + b_1) \\<br>
h_2 &amp;= sigmoid(x_1 &#xB7; w_3 + x_2 &#xB7; w_4 + b_2) \\<br>
y   &amp;= sigmoid(h_1 &#xB7; w_5 + h_2 &#xB7; w_6 + b_3) \\<br>
E   &amp;= \frac{1}{2}(y-Y)^2<br>
\end{aligned}<br>
$$</p>
<blockquote>
<p><strong>&#x6CE8;&#x610F;</strong>&#xFF1A;</p>
<p>&#x635F;&#x5931;&#x51FD;&#x6570;&#x8FD9;&#x91CC;&#x91C7;&#x7528;&#x7684;&#x662F;&#x5747;&#x65B9;&#x8BEF;&#x5DEE;&#xFF0C;&#x800C;&#x8FD9;&#x91CC;&#x7684; $\frac{1}{2}$ &#x662F;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x8BA1;&#x7B97;&#x68AF;&#x5EA6;&#x800C;&#x7B80;&#x5316;&#x7684;&#xFF0C;&#x56E0;&#x4E3A;&#x540E;&#x9762;&#x8981;&#x4E58;&#x4EE5; $2$&#x3002;</p>
</blockquote>
<h3 id="%E6%95%B0%E6%8D%AE%E4%B8%8E%E8%AE%A1%E7%AE%97%E8%BF%87%E7%A8%8B">&#x6570;&#x636E;&#x4E0E;&#x8BA1;&#x7B97;&#x8FC7;&#x7A0B;</h3>
<p>&#x5728;&#x5B9E;&#x9645;&#x7684;&#x8BA1;&#x7B97;&#x4E2D;&#xFF0C;&#x6570;&#x636E;&#x4E00;&#x822C;&#x4EE5;&#x77E9;&#x9635;&#x7684;&#x5F62;&#x5F0F;&#x51FA;&#x73B0;&#xFF0C;&#x8FD9;&#x91CC;&#x6F14;&#x793A;&#x524D;&#x5411;&#x4F20;&#x64AD;&#x65F6;, &#x6570;&#x636E;&#x7684;&#x8FD0;&#x7B97;&#x8FC7;&#x7A0B;&#x4EE5;&#x53CA;<strong>&#x4E2D;&#x95F4;&#x7ED3;&#x679C;&#x7684;&#x7ED3;&#x6784;</strong>&#x3002;</p>
<pre><code class="language-py"># &#x8F93;&#x5165;&#x5C42;&#x6570;&#x636E;, &#x5F62;&#x72B6; (3 &#x6837;&#x672C;&#x6570;, 2 &#x7279;&#x5F81;&#x6570;)
X=[[x1, x2],  # &#x6837;&#x672C;1 &#x7279;&#x5F81;&#x5411;&#x91CF;
   [x1, x2],  # &#x6837;&#x672C;2 ...
   [x1, x2]]  # &#x6837;&#x672C;3

# &#x9690;&#x85CF;&#x5C42;&#x6743;&#x91CD;, &#x5F62;&#x72B6; (2 &#x4E0A;&#x4E00;&#x5C42;&#x8282;&#x70B9;&#x6570;, 2 &#x9690;&#x85CF;&#x5C42;&#x8282;&#x70B9;&#x6570;)
#   h1, h2
Hw=[[w1, w3],
    [w2, w4]]

# &#x8BA1;&#x7B97;&#x9690;&#x85CF;&#x5C42;&#x7684;&#x8F93;&#x5165;&#x6570;&#x636E;(&#x8F93;&#x5165;&#x5411;&#x91CF;&#x4E0E;&#x9690;&#x85CF;&#x5C42;&#x6743;&#x91CD;&#x7684;&#x70B9;&#x79EF;)
# Hi=np.dot(X, Hw)
Hi=[[x1&#xB7;w1 + x2&#xB7;w2, x1&#xB7;w3 + x2&#xB7;w4], # &#x6837;&#x672C;1
    [x1&#xB7;w1 + x2&#xB7;w2, x1&#xB7;w3 + x2&#xB7;w4], # ...
    [x1&#xB7;w1 + x2&#xB7;w2, x1&#xB7;w3 + x2&#xB7;w4]]

# &#x9690;&#x85CF;&#x5C42;&#x504F;&#x7F6E;, &#x5F62;&#x72B6; (1, 2 &#x9690;&#x85CF;&#x5C42;&#x8282;&#x70B9;&#x6570;)
Hb=[[b1, b2]]

# &#x8BA1;&#x7B97;&#x9690;&#x85CF;&#x5C42;&#x7684;&#x8F93;&#x51FA;&#x6570;&#x636E;(&#x9690;&#x85CF;&#x5C42;&#x8F93;&#x5165;&#x6570;&#x636E;&#x4E0E;&#x9690;&#x85CF;&#x5C42;&#x504F;&#x7F6E;&#x7684;&#x52A0;&#x548C;&#x540E;&#x518D;&#x901A;&#x8FC7;&#x6FC0;&#x6D3B;&#x51FD;&#x6570;&#x5904;&#x7406;)
# Ho=sigmoid(Hi+Hb)
Ho=[[h1=sigmoid(x1&#xB7;w1 + x2&#xB7;w2 + b1), h2=sigmoid(x1&#xB7;w3 + x2&#xB7;w4 + b2)], # &#x6837;&#x672C;1
    [h1=sigmoid(x1&#xB7;w1 + x2&#xB7;w2 + b1), h2=sigmoid(x1&#xB7;w3 + x2&#xB7;w4 + b2)], # ...
    [h1=sigmoid(x1&#xB7;w1 + x2&#xB7;w2 + b1), h2=sigmoid(x1&#xB7;w3 + x2&#xB7;w4 + b2)]]

# &#x5316;&#x7B80;&#x540E;&#x4EE5; h1, h2 &#x4EE3;&#x66FF;
Ho=[[h1, h2],
    [h1, h2],
    [h1, h2]]

# &#x8F93;&#x51FA;&#x5C42;&#x6743;&#x91CD;, &#x5F62;&#x72B6; (2 &#x4E0A;&#x4E00;&#x5C42;&#x8282;&#x70B9;&#x6570;, 1 &#x8F93;&#x51FA;&#x5C42;&#x8282;&#x70B9;&#x6570;)
Ow=[[w5],
    [w6]]

# &#x8F93;&#x51FA;&#x5C42;&#x504F;&#x7F6E;, &#x5F62;&#x72B6; (1, 1 &#x8F93;&#x51FA;&#x5C42;&#x8282;&#x70B9;&#x6570;)
Ob=[[b3]]

# &#x8BA1;&#x7B97;&#x8F93;&#x51FA;&#x5C42;&#x8F93;&#x51FA;&#x503C;, &#x4E5F;&#x5C31;&#x662F;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x9884;&#x6D4B;&#x503C;
# Oo=np.dot(Ho, Ow) + Ob
Oo=[[sigmoid(h1&#xB7;w5 + h2&#xB7;w6 + b3)], # &#x6837;&#x672C;1
    [sigmoid(h1&#xB7;w5 + h2&#xB7;w6 + b3)], # &#x6837;&#x672C;2
    [sigmoid(h1&#xB7;w5 + h2&#xB7;w6 + b3)]] # &#x6837;&#x672C;3
y=Oo
</code></pre>
<p>&#x89C2;&#x5BDF;&#x4EE5;&#x4E0A;&#x6570;&#x636E;&#x53EF;&#x4EE5;&#x5F97;&#x51FA;:</p>
<ul>
<li>&#x8F93;&#x5165;&#x6570;&#x636E;&#x4E0E;&#x4E2D;&#x95F4;&#x6570;&#x636E;&#x4E2D;&#xFF0C;<strong>&#x6BCF;&#x4E00;&#x884C;&#x90FD;&#x8868;&#x793A;&#x4E00;&#x4E2A;&#x6837;&#x672C;</strong>&#xFF0C;&#x800C;&#x5217;&#x5219;&#x8868;&#x793A;&#x8BE5;&#x6837;&#x672C;&#x7684;&#x67D0;&#x4E00;&#x4E2A;&#x7279;&#x5F81;&#x7684;&#x4FE1;&#x606F;&#x3002;</li>
<li>&#x7F51;&#x7EDC;&#x5404;&#x4E2A;&#x5C42;&#x7684;&#x6743;&#x91CD;&#x4E0E;&#x504F;&#x7F6E;&#x6570;&#x636E;&#x4E2D;&#xFF0C;<strong>&#x6BCF;&#x4E00;&#x5217;&#x8868;&#x793A;&#x7684;&#x662F;&#x8BE5;&#x5C42;&#x8282;&#x70B9;&#x7684;&#x6570;&#x636E;</strong>, &#x800C;&#x884C;&#x5219;&#x4E0E;&#x4E0A;&#x4E00;&#x5C42;&#x7684;&#x8282;&#x70B9;&#x4E00;&#x4E00;&#x5BF9;&#x5E94;(&#x8FD9;&#x7279;&#x6027;&#x662F;&#x7531;&#x4E8E;&#x77E9;&#x9635;&#x4E58;&#x6CD5;&#x7684;&#x6027;&#x8D28;&#x51B3;&#x5B9A;)&#x3002;</li>
</ul>
<h3 id="%E5%8F%8D%E5%90%91%E4%BC%A0%E6%92%AD">&#x53CD;&#x5411;&#x4F20;&#x64AD;</h3>
<p>&#x4E3A;&#x4E86;&#x8BAD;&#x7EC3;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;, &#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#xFF08;Backpropagation&#xFF09;&#x7B97;&#x6CD5;, &#x4ECE;&#x8F93;&#x51FA;&#x5230;&#x8F93;&#x5165;&#x53CD;&#x5411;&#x8BA1;&#x7B97;&#x5E76;&#x66F4;&#x65B0;&#x6BCF;&#x4E00;&#x5C42;&#x7684;&#x6743;&#x91CD;&#x548C;&#x504F;&#x7F6E;, &#x4ECE;&#x800C;&#x8BA9;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x8F93;&#x51FA;&#x503C;&#x4E0E;&#x5B9E;&#x9645;&#x503C;&#x7684;&#x8BEF;&#x5DEE;&#x6700;&#x5C0F;&#x5316;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x9996;&#x5148;&#x9700;&#x8981;&#x8BA1;&#x7B97; <strong>&#x8BEF;&#x5DEE;</strong> $E$ &#x5173;&#x4E8E;&#x6BCF;&#x4E00;&#x4E2A;<strong>&#x6743;&#x91CD;</strong>&#x4E0E;<strong>&#x504F;&#x7F6E;</strong>&#x7684;&#x68AF;&#x5EA6;&#xFF08;&#x504F;&#x5BFC;&#x6570;&#xFF09;&#xFF0C;&#x5373;&#x8BE5;&#x6743;&#x91CD;&#x6216;&#x504F;&#x7F6E;&#x5BF9;&#x8BEF;&#x5DEE;&#x7684;<strong>&#x8D21;&#x732E;&#x5EA6;</strong>&#x3002;</p>
<p>&#x7136;&#x540E;&#x518D;&#x6839;&#x636E; &#x68AF;&#x5EA6;&#x4E0B;&#x964D;&#x6CD5;&#xFF08;Batch Gradient Descent&#xFF09;&#x6765;&#x66F4;&#x65B0;&#x3002;</p>
<h4 id="1-%E8%AE%A1%E7%AE%97%E4%B8%8E%E6%9B%B4%E6%96%B0%E6%9D%83%E9%87%8D-w5">1. &#x8BA1;&#x7B97;&#x4E0E;&#x66F4;&#x65B0;&#x6743;&#x91CD; $w_5$</h4>
<p>1.1 $w_5$ &#x5BF9; $E$ &#x7684;&#x8D21;&#x732E;, &#x8868;&#x793A;&#x4E3A; $\frac{\partial E}{\partial w_5}$&#x3002;</p>
<p>1.2 &#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x540E;&#x9762;&#x7684;&#x8BA1;&#x7B97;, &#x6211;&#x4EEC;&#x5C06;&#x516C;&#x5F0F;&#x4E2D;&#x7684; $sigmoid$ &#x51FD;&#x6570;&#x7684;&#x8F93;&#x5165;&#x63D0;&#x53D6;&#x51FA;&#x6765;:</p>
<p>$$<br>
\begin{aligned}<br>
c &amp;= h_1 &#xB7; w_5 + h_2 &#xB7; w_6 + b_3 \\<br>
y &amp;= sigmoid(c) \\<br>
E &amp;= \frac{1}{2}(y-Y)^2<br>
\end{aligned}<br>
$$</p>
<p>1.3 &#x6839;&#x636E;&#x5BFC;&#x6570;&#x7684;&#x94FE;&#x5F0F;&#x6CD5;&#x5219;, &#x53EF;&#x4EE5;&#x5F97;&#x5230;:</p>
<p>$$<br>
\frac{\partial E}{\partial w_5} = \frac{\partial E}{\partial y} \cdot \frac{\partial y}{\partial c} \cdot \frac{\partial c}{\partial w_5}<br>
$$</p>
<p>1.4 &#x5206;&#x522B;&#x8BA1;&#x7B97;&#x5404;&#x9879;&#xFF1A;</p>
<p>$$<br>
\begin{aligned}<br>
\frac{\partial E}{\partial y} &amp;= y-Y \\<br>
\frac{\partial y}{\partial c} &amp;= \text{sigmoid_derivative}(c) \\<br>
\frac{\partial c}{\partial w_5} &amp;= h_1 \\<br>
\end{aligned}<br>
$$</p>
<p>1.5 &#x5F97;&#x5230;:</p>
<p>$$<br>
\frac{\partial E}{\partial w_5} = (y-Y) \cdot \text{sigmoid_derivative}(c) \cdot h_1<br>
$$</p>
<ul>
<li>&#x7531;&#x4E8E; $h_1$&#x3001;$c$&#x3001;$y$ &#x90FD;&#x5728;&#x524D;&#x5411;&#x4F20;&#x64AD;&#x8BA1;&#x7B97;&#x8FC7;&#x7A0B;&#x4E2D;&#x8BA1;&#x7B97;&#x8FC7;, &#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x4ECE;&#x800C;&#x8BA1;&#x7B97;&#x51FA;&#x7ED3;&#x679C;&#x3002;</li>
</ul>
<p>1.6 &#x66F4;&#x65B0;&#x6743;&#x91CD;:</p>
<p>$$<br>
w_5 = w_5 - &#x3B7; \cdot \frac{\partial E}{\partial w_5}<br>
$$</p>
<ul>
<li>&#x5176;&#x4E2D; $&#x3B7;$ &#x8868;&#x793A;&#x5B66;&#x4E60;&#x7387;&#xFF0C;&#x4E5F;&#x79F0;&#x4E3A;&#x6B65;&#x957F;&#x6216;&#x5B66;&#x4E60;&#x901F;&#x7387;&#xFF0C;&#x8FD9;&#x91CC;&#x53D6; $0.1$&#x3002;</li>
</ul>
<h4 id="2-%E8%AE%A1%E7%AE%97%E4%B8%8E%E6%9B%B4%E6%96%B0%E6%9D%83%E9%87%8D-w1">2. &#x8BA1;&#x7B97;&#x4E0E;&#x66F4;&#x65B0;&#x6743;&#x91CD; $w_1$</h4>
<p>2.1 &#x540C;&#x7406;, &#x8BEF;&#x5DEE;&#x8D21;&#x732E;&#x8868;&#x793A;&#x4E3A;: $\frac{\partial E}{\partial w_1}$</p>
<p>2.2 &#x63D0;&#x53D6;:</p>
<p>$$<br>
\begin{aligned}<br>
a   &amp;= x_1 &#xB7; w_1 + x_2 &#xB7; w_2 + b_1 \\<br>
h_1 &amp;= sigmoid(a) \\<br>
c   &amp;= h_1 &#xB7; w_5 + h_2 &#xB7; w_6 + b_3 \\<br>
y   &amp;= sigmoid(c) \\<br>
E   &amp;= \frac{1}{2}(y-Y)^2<br>
\end{aligned}<br>
$$</p>
<p>2.3 &#x94FE;&#x5F0F;&#x6CD5;&#x5219;&#x4EE3;&#x5165;:</p>
<p>$$<br>
\frac{\partial E}{\partial w_1} = \frac{\partial E}{\partial y} \cdot \frac{\partial y}{\partial c} \cdot \frac{\partial c}{\partial h_1} \cdot \frac{\partial h_1}{\partial a} \cdot \frac{\partial a}{\partial w_1}<br>
$$</p>
<p>2.4 &#x5206;&#x522B;&#x8BA1;&#x7B97;:</p>
<p>$$<br>
\begin{aligned}<br>
\frac{\partial E}{\partial y}   &amp;= y-Y \\<br>
\frac{\partial y}{\partial c}   &amp;= \text{sigmoid_derivative}(c) \\<br>
\frac{\partial c}{\partial h_1} &amp;= w_5 \\<br>
\frac{\partial h_1}{\partial a} &amp;= \text{sigmoid_derivative}(a) \\<br>
\frac{\partial a}{\partial w_1} &amp;= x_1 \\<br>
\end{aligned}<br>
$$</p>
<p>2.5 &#x5F97;&#x5230;:</p>
<p>$$<br>
\frac{\partial E}{\partial w_1} = (y-Y) \cdot \text{sigmoid_derivative}(c) \cdot w_5 \cdot \text{sigmoid_derivative}(a) \cdot x_1<br>
$$</p>
<p>2.6 &#x66F4;&#x65B0;&#x6743;&#x91CD;:</p>
<p>$$<br>
w_1 = w_1 - &#x3B7; \cdot \frac{\partial E}{\partial w_1}<br>
$$</p>
<h4 id="3-%E8%AE%A1%E7%AE%97%E4%B8%8E%E6%9B%B4%E6%96%B0%E5%81%8F%E7%BD%AE-b1">3. &#x8BA1;&#x7B97;&#x4E0E;&#x66F4;&#x65B0;&#x504F;&#x7F6E; $b_1$</h4>
<p>3.1 &#x540C;&#x7406;, &#x8BEF;&#x5DEE;&#x8D21;&#x732E;&#x8868;&#x793A;&#x4E3A;: $\frac{\partial E}{\partial b_1}$</p>
<p>3.2 &#x63D0;&#x53D6;:</p>
<p>$$<br>
\begin{aligned}<br>
a   &amp;= x_1 &#xB7; w_1 + x_2 &#xB7; w_2 + b_1 \\<br>
h_1 &amp;= sigmoid(a) \\<br>
c   &amp;= h_1 &#xB7; w_5 + h_2 &#xB7; w_6 + b_3 \\<br>
y   &amp;= sigmoid(c) \\<br>
E   &amp;= \frac{1}{2}(y-Y)^2<br>
\end{aligned}<br>
$$</p>
<p>3.3 &#x94FE;&#x5F0F;&#x6CD5;&#x5219;&#x4EE3;&#x5165;:</p>
<p>$$<br>
\frac{\partial E}{\partial b_1} = \frac{\partial E}{\partial y} \cdot \frac{\partial y}{\partial c} \cdot \frac{\partial c}{\partial h_1} \cdot \frac{\partial h_1}{\partial a} \cdot \frac{\partial a}{\partial b_1}<br>
$$</p>
<p>3.4 &#x5206;&#x522B;&#x8BA1;&#x7B97;:</p>
<p>$$<br>
\begin{aligned}<br>
\frac{\partial E}{\partial y}   &amp;= y-Y \\<br>
\frac{\partial y}{\partial c}   &amp;= \text{sigmoid_derivative}(c) \\<br>
\frac{\partial c}{\partial h_1} &amp;= w_5 \\<br>
\frac{\partial h_1}{\partial a} &amp;= \text{sigmoid_derivative}(a) \\<br>
\frac{\partial a}{\partial b_1} &amp;= 1 \\<br>
\end{aligned}<br>
$$</p>
<p>3.5 &#x5F97;&#x5230;:</p>
<p>$$<br>
\frac{\partial E}{\partial b_1} = (y-Y) \cdot \text{sigmoid_derivative}(c) \cdot w_5 \cdot \text{sigmoid_derivative}(a)<br>
$$</p>
<p>3.6 &#x66F4;&#x65B0;&#x6743;&#x91CD;:</p>
<p>$$<br>
b_1 = b_1 - &#x3B7; \cdot \frac{\partial E}{\partial b_1}<br>
$$</p>
<h2 id="python-%E5%AE%9E%E7%8E%B0">Python &#x5B9E;&#x73B0;</h2>
<p>&#x4E3A;&#x4E86;&#x7B80;&#x5316;&#x77E9;&#x9635;&#x7684;&#x8BA1;&#x7B97;, &#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x4E86;numpy &#x6A21;&#x5757;, numpy &#x662F;&#x4E00;&#x4E2A;&#x5F00;&#x6E90;&#x7684;Python&#x5E93;, &#x5E7F;&#x6CDB;&#x7528;&#x4E8E;&#x79D1;&#x5B66;&#x8BA1;&#x7B97;&#x3002;</p>
<p>&#x9996;&#x5148;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7C7B;, &#x4E3B;&#x8981;&#x5305;&#x542B;&#x4E24;&#x4E2A;&#x51FD;&#x6570;, &#x4E00;&#x4E2A;&#x662F;&#x524D;&#x5411;&#x4F20;&#x64AD;&#x51FD;&#x6570;, &#x4E00;&#x4E2A;&#x662F;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#x51FD;&#x6570;&#x3002;</p>
<pre><code class="language-python">import numpy as np

# &#x5B9A;&#x4E49;&#x6FC0;&#x6D3B;&#x51FD;&#x6570;&#x53CA;&#x5176;&#x5BFC;&#x6570;
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def sigmoid_derivative(x):
    return x * (1 - x)

# &#x5B9A;&#x4E49;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7C7B;
class FeedNeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size):
        # &#x521D;&#x59CB;&#x5316;&#x6743;&#x91CD;&#x548C;&#x504F;&#x7F6E;
        self.weights1 = np.random.randn(input_size, hidden_size)   # &#x8F93;&#x5165;&#x5C42;&#x5230;&#x9690;&#x85CF;&#x5C42;&#x7684;&#x6743;&#x91CD;
        self.bias1 = np.zeros((1, hidden_size))                    # &#x9690;&#x85CF;&#x5C42;&#x7684;&#x504F;&#x7F6E;
        self.weights2 = np.random.randn(hidden_size, output_size)  # &#x9690;&#x85CF;&#x5C42;&#x5230;&#x8F93;&#x51FA;&#x5C42;&#x7684;&#x6743;&#x91CD;
        self.bias2 = np.zeros((1, output_size))                    # &#x8F93;&#x51FA;&#x5C42;&#x7684;&#x504F;&#x7F6E;

    def forward(self, X):
        # &#x524D;&#x5411;&#x4F20;&#x64AD;
        self.hidden_input = np.dot(X, self.weights1) + self.bias1  # &#x9690;&#x85CF;&#x5C42;&#x8F93;&#x5165;
        self.hidden_output = sigmoid(self.hidden_input)            # &#x9690;&#x85CF;&#x5C42;&#x8F93;&#x51FA;
        self.final_input = np.dot(self.hidden_output, self.weights2) + self.bias2  # &#x8F93;&#x51FA;&#x5C42;&#x8F93;&#x5165;
        self.final_output = sigmoid(self.final_input)              # &#x8F93;&#x51FA;&#x5C42;&#x8F93;&#x51FA;
        return self.final_output

    def backward(self, X, Y, learning_rate):
        # &#x53CD;&#x5411;&#x4F20;&#x64AD;
        m = X.shape[0]  # &#x6837;&#x672C;&#x6570;&#x91CF;

        # &#x8F93;&#x51FA;&#x5C42;&#x8BEF;&#x5DEE;
        output_error = self.final_output - Y  # &#x8BEF;&#x5DEE;&#x51FD;&#x6570;: &#x6C42;&#x7684;&#x662F;&#x6BCF;&#x4E2A;&#x6837;&#x672C;&#x7684;&#x8BEF;&#x5DEE; #(&#x2202;E/&#x2202;y)
        output_delta = output_error * sigmoid_derivative(self.final_output) #(&#x2202;E/&#x2202;y * &#x2202;y/&#x2202;c)

        # &#x9690;&#x85CF;&#x5C42;&#x8BEF;&#x5DEE;
        hidden_error = np.dot(output_delta, self.weights2.T)                 #(&#x2202;E/&#x2202;y * &#x2202;y/&#x2202;c * &#x2202;c/&#x2202;h_1)
        hidden_delta = hidden_error * sigmoid_derivative(self.hidden_output) #(&#x2202;E/&#x2202;y * &#x2202;y/&#x2202;c * &#x2202;c/&#x2202;h_1 * &#x2202;h_1/&#x2202;a)

        # &#x66F4;&#x65B0;&#x6743;&#x91CD;&#x548C;&#x504F;&#x7F6E; 
        # self.hidden_output.T &#x8868;&#x793A;&#x9690;&#x85CF;&#x5C42;&#x8F93;&#x51FA;, &#x4E5F;&#x5C31;&#x662F;: h_1, h_2, &#x53C8;&#x5206;&#x522B;&#x7B49;&#x4E8E; &#x2202;c/&#x2202;w_5, &#x2202;c/&#x2202;w_6 (&#x89C1;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#x516C;&#x5F0F;)
        # &#x56E0;&#x6B64;&#x8FD9;&#x91CC;&#x76F8;&#x5F53;&#x4E8E;:
        #  - &#x2202;E/&#x2202;w_5 = &#x2202;E/&#x2202;y * &#x2202;y/&#x2202;c * &#x2202;c/&#x2202;w_5
        #  - &#x2202;E/&#x2202;w_6 = &#x2202;E/&#x2202;y * &#x2202;y/&#x2202;c * &#x2202;c/&#x2202;w_6
        # &#x5173;&#x4E8E;&#x8F6C;&#x7F6E;&#x7684;&#x539F;&#x56E0;:
        #  - hidden_output &#x7684;&#x5F62;&#x72B6;&#x4E3A; (&#x6837;&#x672C;&#x6570;, 2)
        #    - &#x7B2C;&#x4E00;&#x5217;&#x8868;&#x793A; h_1
        #    - &#x7B2C;&#x4E8C;&#x5217;&#x8868;&#x793A; h_2
        #  - output_delta  &#x7684;&#x5F62;&#x72B6;&#x4E3A; (&#x6837;&#x672C;&#x6570;, 1)
        #  - &#x8F6C;&#x7F6E;&#x4E00;&#x65B9;&#x9762;, &#x53EF;&#x4EE5;&#x4F7F;&#x4E24;&#x4E2A;&#x77E9;&#x9635;&#x7B26;&#x5408;&#x77E9;&#x9635;&#x4E58;&#x6CD5;&#x7684;&#x8981;&#x6C42;, &#x53E6;&#x4E00;&#x65B9;&#x9762;&#x662F;, &#x53EF;&#x4EE5;&#x540C;&#x65F6;&#x66F4;&#x65B0; weights2 &#x4E2D;&#x7684;&#x6743;&#x91CD; (w_5, w_6)
        # &#x5173;&#x4E8E;&#x6700;&#x540E;&#x9664;&#x4EE5;&#x6837;&#x672C;&#x6570;(/m)&#x7684;&#x539F;&#x56E0;:
        #  - &#x6267;&#x884C;&#x77E9;&#x9635;&#x4E58;&#x6CD5;&#x540E;, &#x7ED3;&#x679C;&#x77E9;&#x9635;&#x7684;&#x5F62;&#x72B6;&#x4E3A; (2, 1), &#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x8FD9;&#x6279;&#x6837;&#x672C;&#x7684;&#x8BEF;&#x5DEE;&#x4E4B;&#x548C;, &#x56E0;&#x6B64;&#x9700;&#x8981;&#x9664;&#x4EE5;&#x6837;&#x672C;&#x6570;&#x624D;&#x80FD;&#x5F97;&#x5230;&#x6743;&#x91CD;&#x7684;&#x66F4;&#x65B0;&#x91CF;
        # 
        self.weights2 -= learning_rate * np.dot(self.hidden_output.T, output_delta) / m
        self.bias2 -= learning_rate * np.sum(output_delta, axis=0, keepdims=True) / m

        self.weights1 -= learning_rate * np.dot(X.T, hidden_delta) / m
        self.bias1 -= learning_rate * np.sum(hidden_delta, axis=0, keepdims=True) / m

    def train(self, X, Y, epochs, learning_rate, verbose=False):
        losses = []
        for epoch in range(epochs):
            output = self.forward(X)
            self.backward(X, Y, learning_rate)

            # &#x6253;&#x5370;&#x635F;&#x5931;
            if epoch % 100 == 0:
                loss = np.mean(np.square(Y - output))
                if verbose and epoch % 1000 == 0:
                    print(f&quot;Epoch {epoch}, Loss: {loss}&quot;)
                losses.append(loss)

        return losses
</code></pre>
<p>&#x968F;&#x673A;&#x751F;&#x6210;&#x4E00;&#x7EC4;&#x4E8C;&#x5206;&#x6807;&#x7B7E;&#xFF0C;&#x4F5C;&#x4E3A;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#xFF0C;&#x6765;&#x8BAD;&#x7EC3;&#x5E76;&#x6D4B;&#x8BD5;:</p>
<pre><code class="language-python"># &#x751F;&#x6210;&#x4E00;&#x4E9B;&#x7B80;&#x5355;&#x7684;&#x8BAD;&#x7EC3;&#x6570;&#x636E;, 100&#x4E2A;&#x6837;&#x672C;&#xFF0C;&#x6BCF;&#x4E2A;&#x6837;&#x672C;&#x6709;2&#x4E2A;&#x7279;&#x5F81;
X = np.random.randn(100, 2)
Y = (X[:, 0] + X[:, 1] &gt; 0).astype(int).reshape(-1, 1)
T = np.array([[0.5, 0.5], [-0.5, -0.5], [0.1, -0.3], [-0.2, 0.4]])

# &#x5B9A;&#x4E49;&#x5305;&#x542B;2&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x9690;&#x85CF;&#x5C42;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;
nn = FeedNeuralNetwork(input_size = 2, hidden_size = 2, output_size = 1)

# &#x8BAD;&#x7EC3;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;
nn.train(X, Y, epochs=10000, learning_rate=0.1, verbose=True)

# &#x6D4B;&#x8BD5;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;
predictions = nn.forward(T)
print(&quot;Predictions for test data:\n&quot;, predictions)
</code></pre>
<pre><code>Epoch 0, Loss: 0.2832618264020293
Epoch 1000, Loss: 0.19258215420098243
Epoch 2000, Loss: 0.0962378267167891
Epoch 3000, Loss: 0.061623524890982315
Epoch 4000, Loss: 0.04722564099421363
Epoch 5000, Loss: 0.03931114517521166
Epoch 6000, Loss: 0.034210231243449074
Epoch 7000, Loss: 0.03059331500272531
Epoch 8000, Loss: 0.027863796066633327
Epoch 9000, Loss: 0.025712263913194387
Predictions for test data:
 [[0.97895248]
 [0.03954089]
 [0.22193466]
 [0.76031685]]
</code></pre>
<p>&#x6D4B;&#x8BD5;&#x4E0D;&#x540C;&#x9690;&#x85CF;&#x5C42;&#x8282;&#x70B9;&#x6570;&#x91CF;&#x4E4B;&#x95F4;&#x7684;&#x5DEE;&#x5F02;&#xFF0C;&#x4E3B;&#x8981;&#x4ECE;<strong>&#x8BAD;&#x7EC3;&#x635F;&#x5931;&#x66F2;&#x7EBF;</strong>&#x548C;<strong>&#x9884;&#x6D4B;&#x7ED3;&#x679C;</strong>&#x4E24;&#x4E2A;&#x65B9;&#x9762;&#x8FDB;&#x884C;&#x6BD4;&#x8F83;&#x3002;</p>
<pre><code class="language-python">import matplotlib.pyplot as plt

# &#x751F;&#x6210;&#x4E00;&#x4E9B;&#x7B80;&#x5355;&#x7684;&#x8BAD;&#x7EC3;&#x6570;&#x636E;, 100&#x4E2A;&#x6837;&#x672C;&#xFF0C;&#x6BCF;&#x4E2A;&#x6837;&#x672C;&#x6709;2&#x4E2A;&#x7279;&#x5F81;
np.random.seed(42) 
X = np.random.randn(100, 2)
Y = (X[:, 0] + X[:, 1] &gt; 0).astype(int).reshape(-1, 1)
T = np.concatenate((np.array([[0.5, 0.5], [-0.5, -0.5]]), np.random.randn(28, 2)), axis=0)

# &#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x6392;&#x5E8F;, &#x907F;&#x514D;&#x753B;&#x56FE;&#x65F6;&#x753B;&#x9519;&#x5E8F;
T = T[np.argsort(T.sum(axis=1))]

# colors = [&quot;blue&quot;, &quot;green&quot;, &quot;orange&quot;, &quot;red&quot;, &quot;purple&quot;, &quot;brown&quot;, &quot;pink&quot;, &quot;gray&quot;]
colors = [&apos;#1f77b4&apos;, &apos;#ff7f0e&apos;, &apos;#2ca02c&apos;, &apos;#d62728&apos;, &apos;#9467bd&apos;, &apos;#8c564b&apos;, &apos;#e377c2&apos;, &apos;#7f7f7f&apos;, &apos;#bcbd22&apos;, &apos;#17becf&apos;]
epochs = 10000
sequence = [2, 4, 8, 16, 32]

plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1) 

predictions = []
for i, size in enumerate(sequence):
    nn = FeedNeuralNetwork(2, size, 1)
    losses = nn.train(X, Y, epochs, learning_rate=0.1)
    x_axis = np.arange(0, epochs, 100)
    plt.plot(x_axis, losses, label=f&apos;Hidden size = {size}&apos;, color=colors[i])
    predictions.append(nn.forward(T).flatten())


# &#x5DE6;&#x4FA7;&#xFF1A;&#x8BAD;&#x7EC3;&#x635F;&#x5931;&#x66F2;&#x7EBF;
plt.title(&apos;Different Hidden Layer Sizes&apos;)
plt.xlabel(&apos;Epoch&apos;)
plt.ylabel(&apos;Loss (MSE)&apos;)
plt.legend()
plt.grid(True)

# # &#x53F3;&#x4FA7;&#xFF1A;&#x9884;&#x6D4B;&#x7ED3;&#x679C;&#x5BF9;&#x6BD4;
plt.subplot(1, 2, 2)

x_values = T.sum(axis=1)
for i, t in enumerate(predictions):
    plt.scatter(x_values, t, c=colors[i], marker=&apos;o&apos;, label=f&apos;Hidden size = {sequence[i]}&apos;)
    plt.plot(x_values, t, colors[i])

plt.title(&apos;Different Hidden Layer Test&apos;)
plt.xlabel(&apos;Sample-feature (X[i,0] + X[i,1])&apos;)
plt.ylabel(&apos;Predicted Values&apos;)
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
</code></pre>
<p><img src="https://www.7-0.cc/content/images/2025/04/ANN-DifferentHiddenLayerSize-1.png" alt="ANN-DifferentHiddenLayerSize.png" loading="lazy"></p>
<h2 id="%E5%8F%82%E8%80%83">&#x53C2;&#x8003;</h2>
<ul>
<li><a href="https://github.com/zhanggyb/nndl?ref=7-0.cc">&#x4E66;&#x7C4D; - Neural Networks and Deep Learning</a></li>
<li><a href="https://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C?ref=7-0.cc">&#x7EF4;&#x57FA; - &#x4EBA;&#x5DE5;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/44138371?ref=7-0.cc">&#x77E5;&#x4E4E; - BP&#x7B97;&#x6CD5;&#x8BE6;&#x89E3;&#x4E4B;&#x94FE;&#x5F0F;&#x6CD5;&#x5219;</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/40378224?ref=7-0.cc">&#x77E5;&#x4E4E; - Back Propagation&#xFF08;&#x68AF;&#x5EA6;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#xFF09;</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[导数]]></title><description><![CDATA[数学之导数笔记]]></description><link>https://www.7-0.cc/math-derivative/</link><guid isPermaLink="false">69b41b89b1f19d0001c3e1c3</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Tue, 25 Feb 2025 13:59:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: &#x6570;&#x5B66;;&#x5BFC;&#x6570;<br>
@@ Date: 2025-02-25</p>
<p><strong>&#x5BFC;&#x6570;</strong>&#xFF08;Derivative&#xFF09;&#x662F;&#x5FAE;&#x79EF;&#x5206;&#x5B66;&#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x6982;&#x5FF5;&#xFF0C;&#x51FD;&#x6570;&#x5728;&#x67D0;&#x4E00;&#x70B9;&#x7684;&#x5BFC;&#x6570;&#x662F;&#x6307;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x5728;&#x8FD9;&#x4E00;&#x70B9;&#x9644;&#x8FD1;&#x7684;&#x53D8;&#x5316;&#x7387;&#xFF08;&#x5373;&#x51FD;&#x6570;&#x5728;&#x8FD9;&#x4E00;&#x70B9;&#x7684;&#x5207;&#x7EBF;&#x659C;&#x7387;&#xFF09;&#xFF0C;&#x5BFC;&#x6570;&#x7684;&#x672C;&#x8D28;&#x662F;&#x901A;&#x8FC7;&#x6781;&#x9650;&#x7684;&#x6982;&#x5FF5;&#x5BF9;&#x51FD;&#x6570;&#x8FDB;&#x884C;&#x5C40;&#x90E8;&#x7684;&#x7EBF;&#x6027;&#x903C;&#x8FD1;&#x3002;</p>
<p>&#x51FD;&#x6570; $f$ &#x5BF9;&#x53D8;&#x91CF; $x$ &#x7684;&#x5BFC;&#x6570;&#x8868;&#x793A; $f$ &#x968F; $x$ &#x7684;&#x53D8;&#x5316;&#x7387;&#x3002;&#x6362;&#x53E5;&#x8BDD;&#x8BF4;&#xFF0C;&#x5BFC;&#x6570;&#x63CF;&#x8FF0;&#x4E86;&#x51FD;&#x6570; $f$ &#x5728;&#x70B9; $x$ &#x5904;&#x7684;&#x77AC;&#x65F6;&#x53D8;&#x5316;&#x7387;&#x3002;&#x5F62;&#x5F0F;&#x4E0A;&#xFF0C;&#x5BFC;&#x6570;&#x8BB0;&#x4F5C; $\frac{df}{dx}$&#xFF0C;&#x8868;&#x793A;&#x5F53; $x$ &#x53D8;&#x5316;&#x4E00;&#x4E2A;&#x5FAE;&#x5C0F;&#x91CF;&#x65F6;&#xFF0C; $f$ &#x53D8;&#x5316;&#x7684;&#x91CF;&#x3002;</p>
<h2 id="%E5%AE%9A%E4%B9%89">&#x5B9A;&#x4E49;</h2>
<p>&#x5F53;&#x51FD;&#x6570; $f(x)$ &#x7684;&#x81EA;&#x53D8;&#x91CF; $x$ &#x5728;&#x70B9; $x_0$ &#x4E0A;&#x4EA7;&#x751F;&#x4E00;&#x4E2A;&#x589E;&#x91CF; $h$ &#x65F6;&#xFF0C;<strong>&#x51FD;&#x6570;&#x8F93;&#x51FA;&#x503C;&#x7684;&#x589E;&#x91CF;&#x4E0E;&#x81EA;&#x53D8;&#x91CF;&#x589E;&#x91CF; $h$ &#x7684;&#x6BD4;&#x503C;</strong>&#x5728; $h$ &#x8D8B;&#x4E8E; $0$ &#x65F6;&#x7684;&#x6781;&#x9650;&#x5982;&#x679C;&#x5B58;&#x5728;&#xFF0C;&#x5373;&#x4E3A; $f(x)$ &#x5728; $x_0$ &#x5904;&#x7684;&#x5BFC;&#x6570;&#xFF0C;&#x8BB0;&#x4F5C; $f&apos;(x_0)$&#x3002;</p>
<p>&#x8BBE;&#x51FD;&#x6570; $f(x)$ &#x5728;&#x70B9; $x_0$ &#x7684;&#x67D0;&#x90BB;&#x57DF;&#x6709;&#x5B9A;&#x4E49;&#xFF0C;&#x82E5;&#x6781;&#x9650;</p>
<p>$$<br>
f&apos;(x_0) = \lim_{h \to 0} \frac{f(x_0 + h) - f(x_0)}{h}<br>
$$</p>
<p>&#x5B58;&#x5728;&#xFF0C;&#x5219;&#x79F0; $f(x)$ &#x5728; $x_0$ &#x5904;<strong>&#x53EF;&#x5BFC;</strong>&#xFF0C;$f&apos;(x_0)$ &#x5373;&#x4E3A; $f(x)$ &#x5728; $x_0$ &#x70B9;&#x7684;&#x5BFC;&#x6570;&#x3002;</p>
<p>&#x5BFC;&#x6570; $f&apos;(x_0)$ &#x8868;&#x793A;&#x51FD;&#x6570; $f(x)$ &#x5728; $x_0$ &#x5904;&#x7684;<strong>&#x5207;&#x7EBF;&#x659C;&#x7387;</strong>&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x5BFC;&#x6570;&#x7684;&#x51E0;&#x4F55;&#x610F;&#x4E49;&#x3002;</p>
<blockquote>
<p>&#x7B14;&#x8BB0;</p>
<ul>
<li>&#x5728; $x_0$ &#x5904; &#x53EF;&#x7406;&#x89E3;&#x4E3A; &#x5F53; $x=x_0$ &#x7684;&#x65F6;&#x5019;&#x3002;</li>
<li><strong>&#x90BB;&#x57DF;</strong> &#x662F;&#x96C6;&#x5408;&#x4E2D;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x8868;&#x793A;&#x70B9; $x_0$ &#x9644;&#x8FD1;&#x7684;&#x4E00;&#x6BB5;&#x533A;&#x57DF;&#xFF08;&#x4E0D;&#x5305;&#x542B;&#x70B9; $x_0$&#xFF09;&#x3002;</li>
</ul>
</blockquote>
<hr>
<p><img src="https://upload.wikimedia.org/wikipedia/commons/7/7a/Graph_of_sliding_derivative_line.gif" alt="Graph_of_sliding_derivative_line" loading="lazy"></p>
<p>$x$ &#x53D8;&#x5316;&#x65F6;&#x51FD;&#x6570; $1+&#x1D465;sin(&#x1D465;^2)$&#xFF08;&#x84DD;&#x8272;&#x66F2;&#x7EBF;&#xFF09;&#x7684;&#x5207;&#x7EBF;&#x53D8;&#x5316;&#x3002;&#x51FD;&#x6570;&#x7684;&#x5BFC;&#x6570;&#x503C;&#x5C31;&#x662F;&#x5207;&#x7EBF;&#x7684;&#x659C;&#x7387;&#xFF0C;&#x7EFF;&#x8272;&#x4EE3;&#x8868;&#x5176;&#x503C;&#x4E3A;&#x6B63;&#xFF0C;&#x7EA2;&#x8272;&#x4EE3;&#x8868;&#x5176;&#x503C;&#x4E3A;&#x8D1F;&#xFF0C;&#x9ED1;&#x8272;&#x4EE3;&#x8868;&#x503C;&#x4E3A;&#x96F6;&#x3002;</p>
<h2 id="%E8%AE%B0%E6%B3%95-%E5%85%AC%E5%BC%8F">&#x8BB0;&#x6CD5; &amp; &#x516C;&#x5F0F;</h2>
<p>&#x5BFC;&#x6570;&#x7684;&#x8BB0;&#x6CD5;&#x6709;&#x591A;&#x79CD;&#x5F62;&#x5F0F;&#xFF0C;&#x5177;&#x4F53;&#x53D6;&#x51B3;&#x4E8E;&#x4E0A;&#x4E0B;&#x6587;&#x548C;&#x4F7F;&#x7528;&#x4E60;&#x60EF;&#x3002;</p>
<h3 id="1-%E8%8E%B1%E5%B8%83%E5%B0%BC%E8%8C%A8%E8%AE%B0%E6%B3%95%EF%BC%88leibniz-notation%EF%BC%89">1. <strong>&#x83B1;&#x5E03;&#x5C3C;&#x8328;&#x8BB0;&#x6CD5;&#xFF08;Leibniz Notation&#xFF09;</strong></h3>
<p>&#x8FD9;&#x662F;&#x6700;&#x5E38;&#x89C1;&#x7684;&#x5BFC;&#x6570;&#x8BB0;&#x6CD5;&#xFF0C;&#x7528; $\frac{dy}{dx}$ &#x8868;&#x793A; $y$ &#x5BF9; $x$ &#x7684;&#x5BFC;&#x6570;&#x3002;</p>
<ul>
<li>
<p><strong>&#x516C;&#x5F0F;</strong>&#xFF1A;<br>
$$<br>
\frac{dy}{dx} = \lim_{\Delta x \to 0} \frac{\Delta y}{\Delta x}<br>
$$</p>
<p>&#x6216;</p>
<p>$$<br>
\frac{d}{dx} f(x)<br>
$$</p>
<p>&#x5176;&#x4E2D;&#xFF1A;</p>
<ul>
<li>$\Delta y = f(x + \Delta x) - f(x)$ &#x662F;&#x51FD;&#x6570;&#x503C;&#x7684;&#x53D8;&#x5316;&#x91CF;&#x3002;</li>
<li>$\Delta x$ &#x662F;&#x81EA;&#x53D8;&#x91CF;&#x7684;&#x53D8;&#x5316;&#x91CF;&#x3002;</li>
</ul>
</li>
<li>
<p><strong>&#x793A;&#x4F8B;</strong>&#xFF1A;<br>
&#x5982;&#x679C; $y = x^2$&#xFF0C;&#x5219;&#xFF1A;<br>
$$<br>
\frac{dy}{dx} = 2x<br>
$$</p>
</li>
</ul>
<h3 id="2-%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E8%AE%B0%E6%B3%95%EF%BC%88lagrange-notation%EF%BC%89">2. <strong>&#x62C9;&#x683C;&#x6717;&#x65E5;&#x8BB0;&#x6CD5;&#xFF08;Lagrange Notation&#xFF09;</strong></h3>
<p>&#x7528; $f&apos;(x)$ &#x8868;&#x793A;&#x51FD;&#x6570; $f(x)$ &#x7684;&#x5BFC;&#x6570;&#x3002;</p>
<ul>
<li>
<p><strong>&#x516C;&#x5F0F;</strong>&#xFF1A;<br>
$$<br>
f&apos;(x) = \lim_{h \to 0} \frac{f(x + h) - f(x)}{h}<br>
$$</p>
</li>
<li>
<p><strong>&#x793A;&#x4F8B;</strong>&#xFF1A;<br>
&#x5982;&#x679C; $f(x) = \sin(x)$&#xFF0C;&#x5219;&#xFF1A;<br>
$$<br>
f&apos;(x) = \cos(x)<br>
$$</p>
</li>
</ul>
<h3 id="3-%E7%89%9B%E9%A1%BF%E8%AE%B0%E6%B3%95%EF%BC%88newton-notation%EF%BC%89">3. <strong>&#x725B;&#x987F;&#x8BB0;&#x6CD5;&#xFF08;Newton Notation&#xFF09;</strong></h3>
<p>&#x7528; $\dot{y}$ &#x8868;&#x793A; $y$ &#x5BF9;&#x65F6;&#x95F4; $t$ &#x7684;&#x5BFC;&#x6570;&#xFF0C;&#x5E38;&#x89C1;&#x4E8E;&#x7269;&#x7406;&#x5B66;&#x4E2D;&#x3002;</p>
<ul>
<li>
<p><strong>&#x516C;&#x5F0F;</strong>&#xFF1A;<br>
$$<br>
\dot{y} = \frac{dy}{dt}<br>
$$</p>
</li>
<li>
<p><strong>&#x793A;&#x4F8B;</strong>&#xFF1A;<br>
&#x5982;&#x679C; $y = t^3$&#xFF0C;&#x5219;&#xFF1A;<br>
$$<br>
\dot{y} = 3t^2<br>
$$</p>
</li>
</ul>
<h2 id="%E5%AF%BC%E6%95%B0%E7%9A%84%E5%87%A0%E4%BD%95%E6%84%8F%E4%B9%89">&#x5BFC;&#x6570;&#x7684;&#x51E0;&#x4F55;&#x610F;&#x4E49;</h2>
<p>&#x5BFC;&#x6570;&#x7684;&#x51E0;&#x4F55;&#x610F;&#x4E49;&#x662F;&#x51FD;&#x6570;&#x56FE;&#x50CF;&#x5728;&#x67D0;&#x4E00;&#x70B9;&#x5904;&#x7684;<strong>&#x5207;&#x7EBF;&#x659C;&#x7387;</strong>&#x3002;</p>
<ul>
<li>&#x5982;&#x679C;&#x5BFC;&#x6570;&#x4E3A;&#x6B63;&#xFF0C;&#x51FD;&#x6570;&#x5728;&#x8BE5;&#x70B9;&#x5904;&#x662F;<strong>&#x9012;&#x589E;</strong>&#x7684;&#x3002;</li>
<li>&#x5982;&#x679C;&#x5BFC;&#x6570;&#x4E3A;&#x8D1F;&#xFF0C;&#x51FD;&#x6570;&#x5728;&#x8BE5;&#x70B9;&#x5904;&#x662F;<strong>&#x9012;&#x51CF;</strong>&#x7684;&#x3002;</li>
<li>&#x5982;&#x679C;&#x5BFC;&#x6570;&#x4E3A;&#x96F6;&#xFF0C;&#x51FD;&#x6570;&#x5728;&#x8BE5;&#x70B9;&#x5904;&#x53EF;&#x80FD;&#x662F;&#x6781;&#x503C;&#x70B9;&#xFF08;&#x6700;&#x5927;&#x503C;&#x6216;&#x6700;&#x5C0F;&#x503C;&#xFF09;&#x3002;</li>
</ul>
<h2 id="%E5%AF%BC%E6%95%B0%E7%9A%84%E7%89%A9%E7%90%86%E6%84%8F%E4%B9%89">&#x5BFC;&#x6570;&#x7684;&#x7269;&#x7406;&#x610F;&#x4E49;</h2>
<p>&#x5728;&#x7269;&#x7406;&#x5B66;&#x4E2D;&#xFF0C;&#x5BFC;&#x6570;&#x53EF;&#x4EE5;&#x8868;&#x793A;<strong>&#x901F;&#x5EA6;</strong>&#x3001;<strong>&#x52A0;&#x901F;&#x5EA6;</strong>&#x7B49;&#x53D8;&#x5316;&#x7387;&#x3002;</p>
<p>&#x4F8B;&#x5982;&#xFF0C;&#x4F4D;&#x79FB;&#x5BF9;&#x65F6;&#x95F4;&#x7684;&#x5BFC;&#x6570;&#x662F;&#x901F;&#x5EA6;&#xFF0C;&#x901F;&#x5EA6;&#x5BF9;&#x65F6;&#x95F4;&#x7684;&#x5BFC;&#x6570;&#x662F;&#x52A0;&#x901F;&#x5EA6;&#x3002;</p>
<h2 id="%E5%8D%95%E4%BE%A7%E5%AF%BC%E6%95%B0">&#x5355;&#x4FA7;&#x5BFC;&#x6570;</h2>
<ul>
<li>&#x5DE6;&#x5BFC;&#x6570; $f&apos;_-(x)$</li>
<li>&#x53F3;&#x5BFC;&#x6570; $f&apos;_+(x)$</li>
</ul>
<p>TODO &#x56FE;</p>
<p>$f(x)$ &#x5728; $x_0$ &#x5904;<strong>&#x53EF;&#x5BFC;</strong> $&lt;=&gt;$ &#x5DE6;&#x53F3;&#x5BFC;&#x6570;<strong>&#x90FD;&#x5B58;&#x5728;</strong>&#x4E14;<strong>&#x76F8;&#x7B49;</strong>&#x3002;</p>
<h2 id="%E6%B1%82%E5%AF%BC">&#x6C42;&#x5BFC;</h2>
<p>&#x6C42;&#x5BFC;&#x662F;&#x8BA1;&#x7B97;&#x51FD;&#x6570;&#x5BFC;&#x6570;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x5373;&#x627E;&#x51FA;&#x51FD;&#x6570;&#x5728;&#x5404;&#x70B9;&#x5904;&#x7684;&#x5207;&#x7EBF;&#x659C;&#x7387;&#x3002;</p>
<h3 id="%E6%B1%82%E5%AF%BC%E6%96%B9%E6%B3%95">&#x6C42;&#x5BFC;&#x65B9;&#x6CD5;</h3>
<ol>
<li>
<p><strong>&#x57FA;&#x672C;&#x6C42;&#x5BFC;&#x516C;&#x5F0F;</strong>&#xFF1A;</p>
<ul>
<li>$\frac{d}{dx} (c) = 0$ &#xFF08;$c$ &#x4E3A;&#x5E38;&#x6570;&#xFF09;</li>
<li>$\frac{d}{dx} (x) = 1$</li>
<li>$\frac{d}{dx} (x^n) = n x^{n-1}$ &#xFF08;$n$ &#x4E3A;&#x5B9E;&#x6570;&#xFF09;</li>
<li>$\frac{d}{dx} (e^x) = e^x$</li>
<li>$\frac{d}{dx} (e^{-x}) = -e^{-x}$</li>
<li>$\frac{d}{dx} (a^x) = a^x \times ln(a)$</li>
<li>$\frac{d}{dx} (\ln x) = \frac{1}{x}$</li>
</ul>
</li>
<li>
<p><strong>&#x6C42;&#x5BFC;&#x6CD5;&#x5219;</strong>&#xFF1A;</p>
<ul>
<li><strong>&#x52A0;&#x6CD5;&#x6CD5;&#x5219;</strong><br>
$$\frac{d}{dx} [f(x) + g(x)] = f&apos;(x) + g&apos;(x)$$</li>
<li><strong>&#x4E58;&#x6CD5;&#x6CD5;&#x5219;</strong><br>
$$\frac{d}{dx} [f(x) \cdot g(x)] = f&apos;(x) g(x) + f(x) g&apos;(x)$$</li>
<li><strong>&#x94FE;&#x5F0F;&#x6CD5;&#x5219;</strong><br>
$$\frac{d}{dx} [f(g(x))] = f&apos;(g(x)) \cdot g&apos;(x)$$</li>
</ul>
</li>
</ol>
<h3 id="%E4%BE%8B1-%E6%B1%82%E5%87%BD%E6%95%B0-fxx2-%E7%9A%84%E5%AF%BC%E6%95%B0">&#x4F8B;1: &#x6C42;&#x51FD;&#x6570; $f(x)=x^2$ &#x7684;&#x5BFC;&#x6570;</h3>
<h4 id="%E4%BD%BF%E7%94%A8%E5%B9%82%E5%87%BD%E6%95%B0%E7%9A%84%E5%AF%BC%E6%95%B0%E5%85%AC%E5%BC%8F">&#x4F7F;&#x7528;&#x5E42;&#x51FD;&#x6570;&#x7684;&#x5BFC;&#x6570;&#x516C;&#x5F0F;</h4>
<p>&#x5E42;&#x51FD;&#x6570;&#x7684;&#x5BFC;&#x6570;&#x516C;&#x5F0F;&#x4E3A;&#xFF1A;</p>
<p>$$<br>
\frac{d}{dx}(x^n) = n \cdot x^{n-1}<br>
$$</p>
<p>&#x5BF9;&#x4E8E; $f(x) = x^2$&#xFF0C;&#x5E42;&#x6307;&#x6570; $n = 2$&#xFF0C;&#x56E0;&#x6B64;&#xFF1A;</p>
<p>$$<br>
\frac{d}{dx}(x^2) = 2 \cdot x^{2-1} = 2x<br>
$$</p>
<h4 id="%E4%BD%BF%E7%94%A8%E5%85%AC%E5%BC%8F%E4%BB%A3%E5%85%A5%E6%8E%A8%E5%AF%BC">&#x4F7F;&#x7528;&#x516C;&#x5F0F;&#x4EE3;&#x5165;&#x63A8;&#x5BFC;</h4>
<ol>
<li>&#x5199;&#x51FA;&#x5BFC;&#x6570;&#x7684;&#x5B9A;&#x4E49;&#xFF1A;<br>
$$<br>
\frac{dy}{dx} = \lim_{h \to 0} \frac{f(x + h) - f(x)}{h}<br>
$$</li>
<li>&#x4EE3;&#x5165; $f(x) = x^2$&#xFF1A;<br>
$$<br>
\frac{dy}{dx} = \lim_{h \to 0} \frac{(x + h)^2 - x^2}{h}<br>
$$</li>
<li>&#x4EE3;&#x5165;&#x5229;&#x7528;&#x5B8C;&#x5168;&#x5E73;&#x65B9;&#x548C;&#x516C;&#x5F0F;&#x5C55;&#x5F00;&#xFF1A;<br>
$$<br>
\frac{dy}{dx} = \lim_{h \to 0} \frac{x^2 + 2xh + h^2 - x^2}{h}<br>
$$</li>
<li>&#x7B80;&#x5316;&#x5206;&#x5B50;&#xFF1A;<br>
$$<br>
\frac{dy}{dx} = \lim_{h \to 0} \frac{2xh + h^2}{h}<br>
$$</li>
<li>&#x7EA6;&#x5206; $h$&#xFF1A;<br>
$$<br>
\frac{dy}{dx} = \lim_{h \to 0} (2x + h)<br>
$$</li>
<li>&#x53D6;&#x6781;&#x9650; $h \to 0$&#xFF1A;<br>
$$<br>
\frac{dy}{dx} = 2x + 0 = 2x<br>
$$</li>
</ol>
<h3 id="%E4%BE%8B2-%E6%B1%82%E5%87%BD%E6%95%B0-fxfrac1x-%E7%9A%84%E5%AF%BC%E6%95%B0">&#x4F8B;2: &#x6C42;&#x51FD;&#x6570; $f(x)=\frac{1}{x}$ &#x7684;&#x5BFC;&#x6570;</h3>
<ol>
<li>
<p>&#x4EE3;&#x5165;&#x51FD;&#x6570;&#x8868;&#x8FBE;&#x5F0F;<br>
$$ f&apos;(x) = \lim_{h \to 0} \frac{\frac{1}{x + h} - \frac{1}{x}}{h} $$</p>
</li>
<li>
<p>&#x5C06;&#x5206;&#x5B50;&#x90E8;&#x5206;&#x901A;&#x5206;&#xFF1A;<br>
$$ \frac{1}{x + h} - \frac{1}{x} = \frac{x - (x + h)}{x(x + h)} = \frac{-h}{x(x + h)} $$</p>
</li>
<li>
<p>&#x5C06;&#x901A;&#x5206;&#x7ED3;&#x679C;&#x4EE3;&#x5165;&#x5BFC;&#x6570;&#x8868;&#x8FBE;&#x5F0F;&#xFF1A;<br>
$$ f&apos;(x) = \lim_{h \to 0} \frac{\frac{-h}{x(x + h)}}{h} = \lim_{h \to 0} \frac{-h}{x(x + h)h} $$</p>
</li>
<li>
<p>&#x7EA6;&#x7B80; $h$&#xFF1A;<br>
$$ f&apos;(x) = \lim_{h \to 0} \frac{-1}{x(x + h)} $$</p>
</li>
<li>
<p>&#x6C42;&#x6781;&#x9650;&#xFF0C;&#x5F53; $h \to 0$&#x65F6;&#xFF0C;$x + h \to x$&#xFF0C;&#x56E0;&#x6B64;&#xFF1A;<br>
$$ f&apos;(x) = \frac{-1}{x^2} = -x^{-2} $$</p>
</li>
</ol>
<h3 id="%E4%BE%8B3-%E6%B1%82%E5%87%BD%E6%95%B0-fxe-1-%E7%9A%84%E5%AF%BC%E6%95%B0">&#x4F8B;3: &#x6C42;&#x51FD;&#x6570; $f(x)=e^{-1}$ &#x7684;&#x5BFC;&#x6570;</h3>
<ol>
<li>&#x51FD;&#x6570; $f(x) = e^{-x}$ &#x662F;&#x4E00;&#x4E2A;&#x590D;&#x5408;&#x51FD;&#x6570;&#xFF0C;&#x5176;&#x4E2D;&#xFF1A;</li>
</ol>
<ul>
<li>&#x5916;&#x5C42;&#x51FD;&#x6570;&#x662F;&#x6307;&#x6570;&#x51FD;&#x6570;&#xFF1A;$g=e^{h}$&#x3002;</li>
<li>&#x5185;&#x5C42;&#x51FD;&#x6570;&#x662F;&#x7EBF;&#x6027;&#x51FD;&#x6570;&#xFF1A;$h=-x$&#x3002;</li>
</ul>
<ol>
<li>&#x4F7F;&#x7528;&#x94FE;&#x5F0F;&#x6CD5;&#x5219;&#x4EE3;&#x5165;&#xFF1A;</li>
</ol>
<p>$$<br>
\begin{aligned}<br>
\frac{d}{dx} \left( g(h(x)) \right) &amp;= g&apos;(h(x)) \cdot h&apos;(x) \\<br>
\frac{d}{dx} e^{-x}  &amp;= g&apos;(h(x)) \cdot h&apos;(x)\\<br>
\frac{d}{dx} e^{-x}  &amp;= e^{-x} \cdot -1 = -e^{-x} \\<br>
\end{aligned}<br>
$$</p>
<ul>
<li>&#x5916;&#x5C42;&#x6307;&#x6570;&#x51FD;&#x6570;&#x7684;&#x5BFC;&#x6570;&#xFF1A;$g&apos;(h) = \frac{d}{dh} e^h = e^h$</li>
<li>&#x5185;&#x5C42;&#x7EBF;&#x6027;&#x51FD;&#x6570;&#x7684;&#x5BFC;&#x6570;&#xFF1A;$h&apos;(x) = \frac{d}{dx} (-x) = -1$</li>
</ul>
<h3 id="%E4%BE%8B4-%E6%B1%82sigmoid%E5%87%BD%E6%95%B0-fx-frac11-e-x-%E7%9A%84%E5%AF%BC%E6%95%B0">&#x4F8B;4: &#x6C42;Sigmoid&#x51FD;&#x6570; $f(x) = \frac{1}{1 + e^{-x}}$ &#x7684;&#x5BFC;&#x6570;</h3>
<ol>
<li>&#x9996;&#x5148;&#xFF0C;&#x5C06; Sigmoid &#x51FD;&#x6570;&#x5199;&#x6210;&#x6307;&#x6570;&#x5F62;&#x5F0F;&#xFF1A;</li>
</ol>
<p>$$<br>
f(x) = (1 + e^{-x})^{-1}<br>
$$</p>
<ol start="2">
<li>&#x4F7F;&#x7528;&#x94FE;&#x5F0F;&#x6CD5;&#x5219;&#xFF1A;</li>
</ol>
<p>$$<br>
f&apos;(x) = \frac{d}{dx} \left( (1 + e^{-x})^{-1} \right)<br>
$$</p>
<p>&#x94FE;&#x5F0F;&#x6CD5;&#x5219;&#x7684;&#x516C;&#x5F0F;&#x4E3A;&#xFF1A;<br>
$$<br>
\frac{d}{dx} \left( g(h(x)) \right) = g&apos;(h(x)) \cdot h&apos;(x)<br>
$$</p>
<p>&#x5728;&#x8FD9;&#x91CC;&#xFF1A;</p>
<ul>
<li>$g(u) = u^{-1}$&#xFF0C;&#x5176;&#x5BFC;&#x6570;&#x4E3A; $g&apos;(u) = -u^{-2}$&#xFF1B;</li>
<li>$h(x) = 1 + e^{-x}$&#xFF0C;&#x5176;&#x5BFC;&#x6570;&#x4E3A; $h&apos;(x) = -e^{-x}$&#x3002;</li>
</ul>
<p>&#x56E0;&#x6B64;&#xFF1A;<br>
$$<br>
f&apos;(x) = g&apos;(h(x)) \cdot h&apos;(x) = -\left(1 + e^{-x}\right)^{-2} \cdot (-e^{-x})<br>
$$</p>
<ol start="3">
<li>&#x5C06;&#x5BFC;&#x6570;&#x8868;&#x8FBE;&#x5F0F;&#x5316;&#x7B80;&#xFF1A;</li>
</ol>
<p>$$<br>
f&apos;(x) = \frac{e^{-x}}{(1 + e^{-x})^2}<br>
$$</p>
<ol start="4">
<li>&#x7528; Sigmoid &#x51FD;&#x6570;&#x8868;&#x793A;, &#x6CE8;&#x610F;&#x5230; $f(x) = \frac{1}{1 + e^{-x}}$&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x5C06;&#x5BFC;&#x6570;&#x8868;&#x793A;&#x4E3A;&#xFF1A;</li>
</ol>
<p>$$<br>
f&apos;(x) = f(x) \cdot (1 - f(x))<br>
$$</p>
<p><strong>&#x63A8;&#x5BFC;&#x8FC7;&#x7A0B;&#xFF1A;</strong><br>
$$<br>
f&apos;(x) = \frac{e^{-x}}{(1 + e^{-x})^2} = \frac{1}{1 + e^{-x}} \cdot \frac{e^{-x}}{1 + e^{-x}} = f(x) \cdot \left(1 - \frac{1}{1 + e^{-x}}\right) = f(x) \cdot (1 - f(x))<br>
$$</p>
<h2 id="%E7%A6%BB%E6%95%A3%E6%95%B0%E6%8D%AE%E7%9A%84%E5%AF%BC%E6%95%B0%E8%AE%A1%E7%AE%97">&#x79BB;&#x6563;&#x6570;&#x636E;&#x7684;&#x5BFC;&#x6570;&#x8BA1;&#x7B97;</h2>
<p>&#x5047;&#x8BBE;&#x6469;&#x6258;&#x8F66;&#x5728;&#x884C;&#x9A76;&#x8FC7;&#x7A0B;&#x4E2D;&#x8BB0;&#x5F55;&#x4E0B;&#x7684;&#x65F6;&#x95F4;&#x4E0E;&#x901F;&#x5EA6;&#x7684;&#x5173;&#x7CFB;:</p>
<ul>
<li>&#x901F;&#x5EA6;&#xFF1A;y: [10, 12, 15, 80, 85, 90]</li>
<li>&#x65F6;&#x95F4;&#xFF1A;x: [1   2   3   4   5   6 ]</li>
<li>&#x51FD;&#x6570;&#x5173;&#x7CFB;&#xFF1A;$y = f(x)$</li>
</ul>
<p>&#x6839;&#x636E;&#x8FDE;&#x7EED;&#x5BFC;&#x6570;&#x5B9A;&#x4E49;&#x516C;&#x5F0F;:</p>
<p>$$<br>
f&apos;(x_0) = \lim_{h \to 0} \frac{f(x_0 + h) - f(x_0)}{h}<br>
$$</p>
<p>&#x5BF9;&#x4E8E;&#x79BB;&#x6563;&#x6570;&#x636E;&#x6765;&#x8BF4;&#xFF0C;&#x4E0D;&#x80FD;&#x53D6; $h \rightarrow 0$&#xFF0C;&#x53EA;&#x80FD;&#x53D6;&#x6709;&#x9650;&#x5C0F;&#x7684; $\Delta x$&#xFF08;&#x5E38;&#x53D6;&#x4E3A;&#x6570;&#x636E;&#x70B9;&#x4E4B;&#x95F4;&#x7684;&#x56FA;&#x5B9A;&#x95F4;&#x8DDD; $h$, &#x5728;&#x8FD9;&#x91CC;&#x4E5F;&#x5C31;&#x662F; $h=1$&#xFF09;&#x3002;</p>
<p>&#x4EE3;&#x5165;&#x53EF;&#x5F97;:</p>
<p>$$<br>
f&apos;(x_k) \approx \frac{f(x_k + h) - f(x_k)}{h}<br>
$$</p>
<h3 id="%E5%89%8D%E5%90%91%E5%B7%AE%E5%88%86%E5%85%AC%E5%BC%8F">&#x524D;&#x5411;&#x5DEE;&#x5206;&#x516C;&#x5F0F;</h3>
<p>&#x4E0A;&#x9762;&#x8FD9;&#x79CD;&#x516C;&#x5F0F;&#xFF0C;&#x4E5F;&#x53EB;&#x524D;&#x5411;&#x5DEE;&#x5206;&#x516C;&#x5F0F;</p>
<p>$$<br>
f&apos;(x_k) \approx \frac{f_{k+1} - f_k}{h}<br>
$$</p>
<p>&#x56E0;&#x4E3A; $h=1$, &#x5219;&#x7B80;&#x5316;&#x4E3A;:</p>
<p>$$<br>
f&apos;(x_k) \approx f_{k+1} - f_k<br>
$$</p>
<p>&#x5373;&#xFF1A;[2, 3, 65, 5, 5, N/A(&#x6CA1;&#x6709;&#x4E0B;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x70B9;)]</p>
<h3 id="%E5%90%8E%E5%90%91%E5%B7%AE%E5%88%86%E5%85%AC%E5%BC%8F">&#x540E;&#x5411;&#x5DEE;&#x5206;&#x516C;&#x5F0F;</h3>
<p>$$<br>
f&apos;(x_k) \approx \frac{f_k - f_{k-1}}{h}<br>
$$</p>
<p>&#x6216;&#x8005;</p>
<p>$$<br>
f&apos;(x_k) \approx f_k - f_{k-1}<br>
$$</p>
<p>&#x5373;&#xFF1A;[N/A(&#x6CA1;&#x6709;&#x4E0A;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x70B9;), 2, 3, 65, 5, 5]</p>
<h3 id="%E4%B8%AD%E5%BF%83%E5%B7%AE%E5%88%86%E5%85%AC%E5%BC%8F">&#x4E2D;&#x5FC3;&#x5DEE;&#x5206;&#x516C;&#x5F0F;</h3>
<p>&#x8FD8;&#x6709;&#x66F4;&#x9AD8;&#x7CBE;&#x5EA6;&#x7684;&#x4E2D;&#x95F4;&#x5DEE;&#x5206;&#x516C;&#x5F0F;(&#x53D6; $x$ &#x5DE6;&#x53F3;&#x4E24;&#x8FB9;&#x70B9;&#x7684;&#x659C;&#x7387;)&#xFF0C;&#x5177;&#x4F53;&#x7684;&#x63A8;&#x5BFC;&#x5F0F;&#x9700;&#x8981; &#x6CF0;&#x52D2;&#x7EA7;&#x6570; (Taylor Series)</p>
<p>$$<br>
f&apos;(x_k) \approx \frac{f_{k+1} - f_{k-1}}{2h}<br>
$$</p>
<p>&#x901A;&#x5E38;&#x7ED3;&#x5408;&#x5176;&#x4ED6;&#x5DEE;&#x5206;&#x6A21;&#x5F0F;&#x4E00;&#x8D77;&#x8BA1;&#x7B97;:</p>
<p>[2(&#x5DE6;&#x8FB9;&#x754C;&#xFF0C;&#x901A;&#x5E38;&#x7528;&#x524D;&#x5411;&#x5DEE;&#x5206;), 2.5, 34, 35, 5, 5(&#x53F3;&#x8FB9;&#x754C;&#xFF0C;&#x901A;&#x5E38;&#x7528;&#x540E;&#x5411;&#x5DEE;&#x5206;)]</p>
<h2 id="%E5%8F%82%E8%80%83">&#x53C2;&#x8003;</h2>
<ul>
<li><a href="https://zh.wikipedia.org/wiki/%E5%AF%BC%E6%95%B0?ref=7-0.cc">&#x7EF4;&#x57FA;&#x767E;&#x79D1;-&#x5BFC;&#x6570;</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/411780503?ref=7-0.cc">&#x77E5;&#x4E4E;-&#x6307;&#x6570;&#x51FD;&#x6570;&#x6C42;&#x5BFC;&#x8BC1;&#x660E;</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[文件名规范引发的 iTunes 备份还原错误及解决方案]]></title><description><![CDATA[iOS 混用 Unicode 规范 导致的备份恢复bug记录及修复方法。]]></description><link>https://www.7-0.cc/fixed-itunesbackup-restore-error-causedby-incorrect-unicode-normalization/</link><guid isPermaLink="false">6943bf8267ce628a4a402a99</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Mon, 24 Feb 2025 14:54:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: iTunes;&#x5907;&#x4EFD;;&#x8FD8;&#x539F;;&#x9519;&#x8BEF;&#x4FEE;&#x590D;<br>
@@ Date: 2025-02-24</p>
<p>&#x7528;&#x6237;&#x8FD8;&#x539F;&#x4E4B;&#x524D;&#x7684;iTunes&#x5907;&#x4EFD;&#x65F6;, &#x51FA;&#x73B0;&#x5982;&#x4E0B;&#x9519;&#x8BEF;:</p>
<pre><code class="language-xml">&lt;plist version=&quot;1.0&quot;&gt;
&lt;array&gt;
	&lt;string&gt;DLMessageProcessMessage&lt;/string&gt;
	&lt;dict&gt;
		&lt;key&gt;ErrorCode&lt;/key&gt;
		&lt;integer&gt;2&lt;/integer&gt;
		&lt;key&gt;ErrorDescription&lt;/key&gt;
		&lt;string&gt;_restoreRegularFiles:size: rename error: No such file or directory (2) at path &quot;/private/var/mobile/.backup.i/var/mobile/Containers/Data/Application/9B671B4F-ED81-43E1-BD67-258DA97116B9/Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogye&#x300;ampions of the Force/01 Champions Of The Force.mp3&quot; (MBErrorDomain/2)&lt;/string&gt;
		&lt;key&gt;MessageName&lt;/key&gt;
		&lt;string&gt;Response&lt;/string&gt;
	&lt;/dict&gt;
&lt;/array&gt;
&lt;/plist&gt;
</code></pre>
<p>&#x7528;&#x6237;&#x7684;&#x73AF;&#x5883;&#x5982;&#x4E0B;:</p>
<ul>
<li>&#x5907;&#x4EFD;: iPhone 13 Pro Max(iPhone14,3) - iOS 15.4</li>
<li>&#x76EE;&#x6807;: iPhone 13 Pro Max(iPhone14,3) - iOS 18.3 and 18.3.1</li>
<li>&#x7CFB;&#x7EDF;: Windows 11 Pro x64, 10.0.26100</li>
<li>iTunes &#x7248;&#x672C;: iTunesMobileDevice.dll(1190.100.1.2)</li>
</ul>
<h2 id="%E5%88%86%E6%9E%90%E9%94%99%E8%AF%AF%E5%8E%9F%E5%9B%A0">&#x5206;&#x6790;&#x9519;&#x8BEF;&#x539F;&#x56E0;</h2>
<p>&#x7ECF;&#x68C0;&#x67E5; Manifest.db &#x6587;&#x4EF6;&#xFF0C;&#x53D1;&#x73B0;&#x6E05;&#x5355;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x5E76;&#x672A;&#x5B58;&#x5728;&#x62A5;&#x9519;&#x9879;&#x76EE;&#x7684;&#x4E0A;&#x7EA7;&#x76EE;&#x5F55;:</p>
<ul>
<li>&#x9519;&#x8BEF;&#x9879;&#x76EE;&#x4FE1;&#x606F;:
<ul>
<li>domain: <code>AppDomain-org.videolan.vlc-ios</code></li>
<li>relativePath: <code>Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogye&#x300;ampions of the Force/01 Champions Of The Force.mp3</code></li>
<li>fileId: <code>ddab7b0a154cbc9b934b80331ced23dd820ffd0f</code></li>
</ul>
</li>
<li>&#x4E0D;&#x5B58;&#x5728;&#x7684;&#x4E0A;&#x7EA7;&#x9879;&#x76EE;:
<ul>
<li>domain: <code>AppDomain-org.videolan.vlc-ios</code></li>
<li>relativePath: <code>Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogye&#x300;ampions of the Force</code></li>
<li>fileId: <code>5da63f6ebaf0b256a7a1a654daaeadec91fdd920</code></li>
</ul>
</li>
<li>&#x4F46;&#x5B58;&#x5728;&#x7C7B;&#x4F3C;&#x7684;&#x4E0A;&#x7EA7;&#x9879;&#x76EE;:
<ul>
<li>fileId: <code>b8ae2d19ce590a182d23561dded5dc34f053e42e</code></li>
<li>domain: <code>AppDomain-org.videolan.vlc-ios</code></li>
<li>relativePath: <code>Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogy&#xE8;ampions of the Force</code></li>
</ul>
</li>
</ul>
<pre><code class="language-python">fid_ddab7b0a = &apos;Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogye&#x300;ampions of the Force/01 Champions Of The Force.mp3&apos;
fid_b8ae2d19 = &apos;Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogy&#xE8;ampions of the Force&apos;

left = fid_ddab7b0a[:len(fid_b8ae2d19) + 1]
right = fid_b8ae2d19
print(&apos;Left       : &apos;, left)
print(&apos;Right      : &apos;, right)
print(&apos;Compare    : &apos;, left == right)
print(&apos;LeftEncode : &apos;, left.encode(&apos;utf-8&apos;))
print(&apos;RightEncode: &apos;, right.encode(&apos;utf-8&apos;))

index = left.index(&apos;e&#x300;&apos;)
leftChar = left[index:index+2]
rightChar = right[index]
leftBytes = leftChar.encode(&apos;utf-16-be&apos;)
rightBytes= rightChar.encode(&apos;utf-16-be&apos;)
print(&apos;leftChar   :  {}={: &lt;16}, hex({})&apos;.format(leftChar, str(leftBytes), leftBytes.hex(&apos; &apos;)))
print(&apos;rightChar  :  {}={: &lt;16}, hex({})&apos;.format(rightChar, str(rightBytes), rightBytes.hex(&apos; &apos;)))
</code></pre>
<p>&#x8F93;&#x51FA;:</p>
<pre><code class="language-bash">Left       :  Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogye&#x300;ampions of the Force
Right      :  Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogy&#xE8;ampions of the Force
Compare    :  False
LeftEncode :  b&apos;Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogye\xcc\x80ampions of the Force&apos;
RightEncode:  b&apos;Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogy\xc3\xa8ampions of the Force&apos;
leftChar   :  e&#x300;=b&apos;\x00e\x03\x00&apos;, hex(00 65 03 00)
rightChar  :  &#xE8;=b&apos;\x00\xe8&apos;     , hex(00 e8)
</code></pre>
<p>&#x5173;&#x952E;&#x5728;&#x4E8E; <code>Trilogye\xcc\x80ampions</code> &#x4E0E; <code>Trilogy\xc3\xa8ampions</code>, &#x524D;&#x8005; <code>e\xcc\x80</code> &#x540E;&#x8005; <code>\xc3\xa8</code>(&#x5728;UTF-8 &#x7F16;&#x7801;&#x4E0B;)&#x3002;</p>
<p>&#x8FD9;&#x5176;&#x5B9E;&#x662F;&#x4E00;&#x4E2A;Unicode &#x4E2D;&#x7684;<strong>&#x5B57;&#x7D20;&#x5206;&#x89E3;</strong>&#x7684;&#x73B0;&#x8C61;&#xFF0C;&#x524D;&#x8005;&#x662F;&#x8BE5;&#x5B57;&#x7B26;&#x5728; Unicode Normalization &#x662F;&#x91C7;&#x7528; NFD &#x89C4;&#x8303;&#x4E0B;&#x4EA7;&#x751F;&#x7684;&#x7F16;&#x7801; <code>&amp;#x65;&amp;#x300;</code>&#xFF0C;&#x540E;&#x8005;&#x662F;&#x5728; NFC &#x89C4;&#x8303;&#x4E0B;&#x4EA7;&#x751F;&#x7684;&#x7F16;&#x7801; <code>&amp;#xe8</code>;</p>
<blockquote>
<ul>
<li><strong>NFC</strong>&#xFF08;Normalization Form Canonical Composition&#xFF09; &#x53C8;&#x79F0;&#x5B8C;&#x5168;&#x7EC4;&#x5408;
<ul>
<li>NFC &#x89C4;&#x8303;&#xFF0C;&#x5C06;&#x5B57;&#x7B26;&#x7EC4;&#x5408;&#x4E3A;&#x6807;&#x51C6;&#x7684;&#x7EC4;&#x5408;&#x5F62;&#x5F0F;&#x3002;</li>
<li>NFC &#x89C4;&#x8303;&#xFF0C;&#x4E5F;&#x662F; &#x5927;&#x591A;&#x6570;&#x5E73;&#x53F0;&#x7684;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x91C7;&#x7528;&#x7684;&#x5F52;&#x4E00;&#x5316;&#x89C4;&#x8303;&#xFF0C;&#x5982;&#xFF1A;<code>Windows</code> &#x548C;&#x5927;&#x591A;&#x6570; <code>Linux</code> &#x53D1;&#x884C;&#x7248;&#x3002;</li>
<li>&#x793A;&#x4F8B;: &#xC2E0;(<code>&amp;#xc2e0;</code>)</li>
</ul>
</li>
<li><strong>NFD</strong>&#xFF08;Normalization Form Canonical Decomposition&#xFF09; &#x53C8;&#x79F0;&#x5B8C;&#x5168;&#x5206;&#x89E3;
<ul>
<li>NFD &#x89C4;&#x8303;&#xFF0C;&#x5B83;&#x5C06;&#x5B57;&#x7B26;&#x5206;&#x89E3;&#x4E3A;&#x57FA;&#x672C;&#x5B57;&#x7B26;&#x548C;&#x7EC4;&#x5408;&#x5B57;&#x7B26;&#x3002;</li>
<li>NFD &#x89C4;&#x8303;&#xFF0C;&#x662F; <code>macOS</code>&#x3001;<code>iOS</code> &#x7684; <code>HFS+</code> &#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x91C7;&#x7528;&#x7684;&#x5F52;&#x4E00;&#x5316;&#x89C4;&#x8303;<a href="#2">[2]</a> <a href="#3">[3]</a>&#x3002;</li>
<li>&#x793A;&#x4F8B;: &#x1109;&#x1175;&#x11AB;(<code>&amp;#x1109;&amp;#x1175;&amp;#x11ab;</code>)</li>
</ul>
</li>
</ul>
</blockquote>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5728;&#x5B8C;&#x5168;&#x5206;&#x89E3;&#x4E0B; `e &#x5B57;&#x7B26;&#x88AB;&#x62C6;&#x89E3;&#x6210;&#x4E86;&#x4E24;&#x4E2A;&#x5B57;&#x7B26;: e &#x548C; &#x300;</p>
<p>&#x6839;&#x636E;&#x4EE5;&#x4E0A;&#x4FE1;&#x606F;&#xFF0C;&#x53EF;&#x4EE5;&#x63A8;&#x8BBA;&#x8FD9;&#x5927;&#x6982;&#x662F; iOS 15.4 &#x7684;&#x4E00;&#x4E2A;Bug&#xFF0C;&#x5728;&#x5907;&#x4EFD;&#x65F6;&#xFF0C;&#x5C06;&#x4E24;&#x4E2A;&#x5305;&#x542B; <code>&#xE8;</code> &#x8DEF;&#x5F84;&#x91C7;&#x7528;&#x4E86;&#x4E24;&#x4E2A;&#x4E0D;&#x540C;&#x7684; Unicode Normalization &#x89C4;&#x8303;&#x6765;&#x7F16;&#x7801;&#x3002;&#x4ECE;&#x800C;&#x5BFC;&#x81F4;&#x5728;iOS 18.3.1 &#x8FD8;&#x539F;&#x65F6;&#xFF0C;&#x4E24;&#x4E2A;&#x5B57;&#x7B26;&#x88AB;&#x89E3;&#x7801;&#x6210;&#x4E24;&#x4E2A;&#x4E0D;&#x540C;&#x7684;&#x8DEF;&#x5F84;&#xFF0C;&#x5BFC;&#x81F4;&#x8FD8;&#x539F;&#x5931;&#x8D25;&#x3002;</p>
<h2 id="%E4%BF%AE%E5%A4%8D%E9%97%AE%E9%A2%98">&#x4FEE;&#x590D;&#x95EE;&#x9898;</h2>
<p>&#x5728;&#x5C1D;&#x8BD5;&#x4FEE;&#x590D;&#x95EE;&#x9898;&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x5148;&#x5BF9;&#x6E05;&#x5355;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x5206;&#x6790;&#xFF0C;&#x5224;&#x65AD;&#x95EE;&#x9898;&#x89C4;&#x6A21;&#xFF0C;&#x5E76;&#x67E5;&#x627E;&#x5177;&#x4F53;&#x539F;&#x56E0;&#x3002;</p>
<pre><code class="language-python">import sqlite3
import hashlib

class ManifestDB:
    def __init__(self,):
        self.file = None
        self.conn = None
        self.cursor = None
        
    def open(self, file):
        self.file = file
        self.conn = sqlite3.connect(file)
        self.cursor = self.conn.cursor()

    def close(self):
        self.conn.close()

    @staticmethod
    def fileId(domain, relativePath):
        return hashlib.sha1(f&quot;{domain}-{relativePath}&quot;.encode(&apos;utf-8&apos;)).hexdigest()
    
    def exists(self, fileID):
        self.cursor.execute(&quot;SELECT COUNT(*) FROM Files WHERE fileID = ?&quot;, (fileID,))
        return self.cursor.fetchone()[0] &gt; 0

    def files(self):
        self.cursor.execute(&quot;SELECT fileID, domain, relativePath, flags, file FROM Files&quot;)
        return self.cursor.fetchall()
</code></pre>
<pre><code class="language-python">import unicodedata
import plistlib

def NormalizationForm(string):
    nfc = unicodedata.normalize(&apos;NFC&apos;, string)
    nfd = unicodedata.normalize(&apos;NFD&apos;, string)
    if nfc == nfd:
        return &apos;Plain&apos;
    elif string == nfc:
        return &apos;NFC&apos;
    elif string == nfd:
        return &apos;NFD&apos;

    nfkc = unicodedata.normalize(&apos;NFKC&apos;, string)
    nfkd = unicodedata.normalize(&apos;NFKD&apos;, string)
    if string == nfkc:
        return &apos;NFKC&apos;
    elif string == nfkd:
        return &apos;NFKD&apos;
    else:
        return &apos;Unknown&apos;

def GetRelativePath(plist):
    root = plist[&apos;$top&apos;][&apos;root&apos;]
    indx = plist[&apos;$objects&apos;][root][&apos;RelativePath&apos;]
    return plist[&apos;$objects&apos;][indx]

def SetRelativePath(plist, relativePath):
    root = plist[&apos;$top&apos;][&apos;root&apos;]
    indx = plist[&apos;$objects&apos;][root][&apos;RelativePath&apos;]
    plist[&apos;$objects&apos;][indx] = relativePath
</code></pre>
<pre><code class="language-python">import os
from termcolor import cprint

print(&apos;Checking for potential errors...&apos;)

db = ManifestDB()
db.open(r&apos;Manifest_15.4.db&apos;)
items = db.files()
items = { f[0] : f for f in items}

print(&apos;- Item count:&apos;, len(items))

count = {}
for index, key in enumerate(items):
    fileID, domain, relativePath, flags, file = items[key]
    
    form = NormalizationForm(relativePath)
    count[form] = count.get(form, 0) + 1
    
    plistBlob = plistlib.loads(file)
    plistPath = GetRelativePath(plistBlob)
    
    if fileID != db.fileId(domain, relativePath):
        cprint(f&apos;- Detected target item ID mismatch Origin: {fileID}&apos;, &apos;red&apos;)
        cprint(f&apos;  * fileID: {fileID}=sha1({ f&quot;{domain}-{relativePath}&quot;.encode() })&apos;, &apos;yellow&apos;)
        cprint(f&apos;  - domain: {domain}&apos;)
        cprint(f&apos;  - relativePath: {relativePath}&apos;)
        
    if plistPath != relativePath:
        cprint(f&apos;- Detected target item path mismatch Origin: {fileID}&apos;, &apos;red&apos;)
        cprint(f&apos;  - domain: {domain}&apos;)
        cprint(f&apos;  - relativePath(UTF-8): {relativePath.encode()}&apos;)
        cprint(f&apos;  * plistPath   (UTF-8): {plistPath.encode()}&apos;, &apos;yellow&apos;)

    pdir = os.path.dirname(relativePath) 
    if pdir:
        pid = db.fileId(domain, pdir)
        if pid not in items:
            cprint(f&apos;- Detected parent directory of target item does not exist: {fileID}&apos;, &apos;red&apos;)
            cprint(f&apos;  - domain: {domain}&apos;)
            cprint(f&apos;  - relativePath: {relativePath}&apos;)
            cprint(f&apos;  * ParentItem: {pid}=sha1({ f&quot;{domain}-{pdir}&quot;.encode() })&apos;, &apos;yellow&apos;)
    
    if index % 5000 == 0:
        print(f&apos;- {index:0&lt;5} / {len(items)} ...&apos;)

print(&apos;Check completed, relativePath normalization form statistics:&apos;)
for form in count:
    print(f&apos;- {form: &lt;5}: {count[form]}&apos;)
</code></pre>
<p>&#x8F93;&#x51FA;:</p>
<pre><code class="language-bash">Checking for potential errors...
- Item count: 100717
- 00000 / 100717 ...
- 50000 / 100717 ...
- 10000 / 100717 ...
- 15000 / 100717 ...
- 20000 / 100717 ...
- 25000 / 100717 ...
- Detected target item ID mismatch Origin: 84f50bb8bc96c5741ab156130ba4de8b4901c1c1
  * fileID: 84f50bb8bc96c5741ab156130ba4de8b4901c1c1=sha1(b&apos;AppDomain-org.videolan.vlc-ios-Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/36 The Hand of Thrawn Duology -\xd3\xb0ecter of the Past&apos;)
  - domain: AppDomain-org.videolan.vlc-ios
  - relativePath: Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/36 The Hand of Thrawn Duology -&#x4F0;ecter of the Past
- Detected target item ID mismatch Origin: b8ae2d19ce590a182d23561dded5dc34f053e42e
  * fileID: b8ae2d19ce590a182d23561dded5dc34f053e42e=sha1(b&apos;AppDomain-org.videolan.vlc-ios-Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogy\xc3\xa8ampions of the Force&apos;)
  - domain: AppDomain-org.videolan.vlc-ios
  - relativePath: Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogy&#xE8;ampions of the Force
- 30000 / 100717 ...
- 35000 / 100717 ...
- 40000 / 100717 ...
- 45000 / 100717 ...
- 50000 / 100717 ...
- 55000 / 100717 ...
- 60000 / 100717 ...
- 65000 / 100717 ...
- 70000 / 100717 ...
- 75000 / 100717 ...
- 80000 / 100717 ...
- 85000 / 100717 ...
- 90000 / 100717 ...
- 95000 / 100717 ...
- 100000 / 100717 ...
Check completed, relativePath normalization form statistics:
- Plain: 100701
- NFC  : 2
- NFD  : 14
</code></pre>
<p>&#x7ECF;&#x8FC7;&#x4EE5;&#x4E0A;&#x811A;&#x672C;&#x68C0;&#x67E5;&#x53D1;&#x73B0;&#xFF0C;&#x5176;&#x5B9E;&#x4E0A;&#x7EA7;&#x9879;&#x76EE;&#x662F;&#x5B58;&#x5728;&#x7684;&#xFF0C;&#x56E0;&#x4E3A;&#x5176;&#x4E2D;&#x5305;&#x542B;&#x975E; ASCII &#x5B57;&#x7B26;&#xFF0C;&#x56E0;&#x6B64;&#x5B57;&#x7B26; <code>e&#x300;</code> &#x662F;&#x4EE5; UTF-8&#x7F16;&#x7801;&#x6765;&#x8BA1;&#x7B97;&#x7684; SHA1 &#x503C;&#x3002;&#x4F46;&#x662F;&#x5728;&#x8FD9;&#x91CC;&#x4E0A;&#x7EA7;&#x9879;&#x76EE;&#x7684; fileID &#x4E0E; relativePath &#x5BF9;&#x4E0D;&#x4E0A;&#xFF0C;&#x5E94;&#x8BE5;&#x662F;&#x5728;&#x5907;&#x4EFD;&#x65F6;&#x8BA1;&#x7B97; fileID &#x4E0E;&#x5B58;&#x50A8; relativePath &#x7684;&#x7F16;&#x7801;&#x89C4;&#x8303;&#x53D1;&#x751F;&#x4E86;&#x53D8;&#x5316;&#x5BFC;&#x81F4;&#x7684;&#x95EE;&#x9898;&#x3002;</p>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230; &#x51FA;&#x9519;&#x7684;&#x9879;&#x76EE;&#x7684;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;&#x4F7F;&#x7528;&#x7684; &#x89C4;&#x8303;&#x662F; NFD &#xFF08;&#x5B8C;&#x5168;&#x5206;&#x89E3;&#xFF09;&#xFF0C;&#x800C;&#x4E0A;&#x7EA7;&#x9879;&#x76EE;&#x7684; fileID &#x4E5F;&#x662F;&#x4F7F;&#x7528;&#x7684; NFD &#x8BA1;&#x7B97;&#x7684;&#xFF0C;&#x4F46;&#x662F; relativePath &#x5374;&#x662F; NFC &#xFF08;&#x5B8C;&#x5168;&#x7EC4;&#x5408;&#xFF09;&#xFF0C;&#x6240;&#x4EE5;&#x4F1A;&#x5BFC;&#x81F4;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;&#x4E0D;&#x5339;&#x914D;&#x3002;</p>
<p>&#x90A3;&#x4E48;&#x786E;&#x5B9A;&#x4E86;&#x95EE;&#x9898;&#x7684;&#x539F;&#x56E0;&#xFF0C;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x5C06; fileID &#x4E0D;&#x5339;&#x914D;&#x7684; relativePath &#x8F6C;&#x6362;&#x4E3A; NFD &#x7F16;&#x7801;&#x89C4;&#x8303;&#x5373;&#x53EF;&#x3002;</p>
<pre><code class="language-python">import shutil

shutil.copy2(r&apos;Manifest_15.4.db&apos;, r&apos;Manifest.db.fixed&apos;)

db = ManifestDB()
db.open(r&apos;Manifest.db.fixed&apos;)

for fileID, domain, relativePath, flags, file in db.files():
    if fileID != db.fileId(domain, relativePath):
        cprint(f&apos;- Process: {fileID}&apos;, &apos;yellow&apos;)

        relativePathNFD = unicodedata.normalize(&apos;NFD&apos;, relativePath)
        plistBlob = plistlib.loads(file)
        SetRelativePath(plistBlob, relativePathNFD)
        plistBlobNFD = plistlib.dumps(plistBlob, fmt=plistlib.FMT_BINARY)
        
        if fileID == db.fileId(domain, relativePathNFD):
            cprint(f&apos;  - NFD: {relativePathNFD}&apos;, &apos;green&apos;)
            cprint(f&apos;  - FIX: &apos;, &apos;green&apos;)
            cprint(f&apos;    * From(UTF-8): {relativePath.encode()}&apos;, &apos;green&apos;)
            cprint(f&apos;    * To  (UTF-8): {relativePathNFD.encode()}&apos;, &apos;green&apos;)

            db.cursor.execute(&quot;UPDATE Files SET relativePath = ?, file = ? WHERE fileID = ?&quot;, (relativePathNFD, plistBlobNFD, fileID))

db.conn.commit()
db.close()
print(&apos;Finished!&apos;)
</code></pre>
<p>&#x8F93;&#x51FA;:</p>
<pre><code class="language-bash">- Process: 84f50bb8bc96c5741ab156130ba4de8b4901c1c1
  - NFD: Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/36 The Hand of Thrawn Duology -&#x423;&#x308;ecter of the Past
  - FIX:
    * From(UTF-8): b&apos;Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/36 The Hand of Thrawn Duology -\xd3\xb0ecter of the Past&apos;
    * To  (UTF-8): b&apos;Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/36 The Hand of Thrawn Duology -\xd0\xa3\xcc\x88ecter of the Past&apos;
- Process: b8ae2d19ce590a182d23561dded5dc34f053e42e
  - NFD: Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogye&#x300;ampions of the Force
  - FIX:
    * From(UTF-8): b&apos;Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogy\xc3\xa8ampions of the Force&apos;
    * To  (UTF-8): b&apos;Documents/Audio books/Starwars/4 New Republic Era (5 to 25 ABY)/22 The Jedi Academy Trilogye\xcc\x80ampions of the Force&apos;
Finished!
</code></pre>
<p>&#x5C06; <code>Manifest.db.fixed</code> &#x6587;&#x4EF6;&#x63D0;&#x4EA4;&#x7ED9;&#x7528;&#x6237;&#x66FF;&#x6362;&#x5230;&#x539F;&#x5907;&#x4EFD;&#x7684; <code>Manifest.db</code> &#x6587;&#x4EF6;&#x540E;&#xFF0C;&#x6210;&#x529F;&#x89E3;&#x51B3;&#x4E86;&#x95EE;&#x9898;&#x3002;</p>
]]></content:encoded></item><item><title><![CDATA[复利公式 与 自然对数 e]]></title><description><![CDATA[自然对数 e 之 “连续” 的意义]]></description><link>https://www.7-0.cc/compound-interest-formula-and-the-natural-logarithm-e/</link><guid isPermaLink="false">69b41875b1f19d0001c3e1a7</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Sat, 22 Feb 2025 13:22:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: &#x590D;&#x5229;;&#x81EA;&#x7136;&#x5BF9;&#x6570;e<br>
@@ Date: 2025-02-22</p>
<p>&#x81EA;&#x7136;&#x5BF9;&#x6570; $e$ &#x4E0E;&#x590D;&#x5229;&#x516C;&#x5F0F;&#x7684;&#x5173;&#x7CFB;&#x53EF;&#x4EE5;&#x4ECE;&#x590D;&#x5229;&#x8BA1;&#x7B97;&#x4E2D;&#x63A8;&#x5BFC;&#x51FA;&#x6765;&#x3002;&#x4EE5;&#x4E0B;&#x662F;&#x8BE6;&#x7EC6;&#x7684;&#x9610;&#x8FF0;&#xFF1A;</p>
<h2 id="1-%E5%8D%95%E5%88%A9">1. &#x5355;&#x5229;</h2>
<p>&#x5355;&#x5229;&#x8BA1;&#x7B97;&#x516C;&#x5F0F;:</p>
<p>$$<br>
A = P \left(1 + r\right)<br>
$$</p>
<p>&#x5176;&#x4E2D;&#xFF1A;</p>
<ul>
<li>$A$ &#x662F;&#x6700;&#x7EC8;&#x91D1;&#x989D;</li>
<li>$P$ &#x662F;&#x672C;&#x91D1;</li>
<li>$r$ &#x662F;&#x5229;&#x7387;</li>
</ul>
<p>&#x4E5F;&#x5C31;&#x662F;&#x8BF4; 1000&#x5143; &#x4EE5;&#x5E74;&#x5229;&#x7387; 50% &#x5B58;&#x4E00;&#x5E74;&#xFF0C;&#x4E00;&#x5E74;&#x540E;&#x672C;&#x91D1;&#x5229;&#x606F;&#x5219;&#x4E3A;&#xFF1A;$1000 \times (1 + 0.5) = 1500$ &#x5143;&#x3002;</p>
<p>&#x5982;&#x679C;&#x6211;&#x4EEC;&#x628A;<strong>&#x5E74;&#x5229;&#x7387;</strong>&#x62C6;&#x5206;&#x6210;<strong>&#x6708;&#x5229;&#x7387;</strong>&#xFF0C;&#x518D;&#x628A; 1000&#x5143; &#x5206;&#x4E24;&#x6B21;&#x5B58;&#xFF0C;&#x6BCF;&#x6B21;&#x5B58;&#x534A;&#x5E74;&#xFF1A;</p>
<p>&#x4E0A;&#x534A;&#x5E74;:</p>
<p>$$<br>
1025 = 1000 \times (1 + \frac{0.5}{2})<br>
$$</p>
<p>&#x4E0B;&#x534A;&#x5E74;:</p>
<p>$$<br>
1562.5 = 1025 \times (1 + \frac{0.5}{2})<br>
$$</p>
<p>&#x540C;&#x6837;&#x7684;&#x5E74;&#x5229;&#x7387;&#x5728;&#x5206;&#x4E24;&#x6B21;&#x5B58;&#x53D6;&#x540E;&#xFF0C;&#x6BD4;&#x5B58;&#x4E00;&#x5E74;&#x591A;&#x4E86; 62.5 &#x5143;&#x3002;</p>
<p>&#x53E6;&#x5916;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF1A;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x62C6;&#x7684;&#x6B21;&#x6570;&#x8D8A;&#x591A;&#xFF0C;&#x5219;&#x6700;&#x7EC8;&#x91D1;&#x989D;&#x4E5F;&#x5C31;&#x8D8A;&#x5927;&#xFF0C;&#x800C;&#x8FD9;&#x5C31;&#x662F;&#x590D;&#x5229;&#x3002;</p>
<h2 id="2-%E5%A4%8D%E5%88%A9">2. &#x590D;&#x5229;</h2>
<p>&#x590D;&#x5229;&#x662F;&#x6307;&#x5728;&#x8BA1;&#x7B97;&#x5229;&#x606F;&#x65F6;&#xFF0C;&#x5C06;&#x672C;&#x91D1;&#x548C;&#x5DF2;&#x4EA7;&#x751F;&#x7684;&#x5229;&#x606F;&#x4E00;&#x8D77;&#x4F5C;&#x4E3A;&#x4E0B;&#x4E00;&#x671F;&#x7684;&#x672C;&#x91D1;&#x3002;&#x590D;&#x5229;&#x516C;&#x5F0F;&#x4E3A;&#xFF1A;</p>
<p>$$<br>
A = P \left(1 + \frac{r}{n}\right)^{nt}<br>
$$</p>
<p>&#x5176;&#x4E2D;&#xFF1A;</p>
<ul>
<li>$n$ &#x662F;&#x8BA1;&#x606F;&#x6B21;&#x6570;</li>
<li>$t$ &#x662F;&#x65F6;&#x95F4; (&#x5E74;)</li>
</ul>
<h2 id="3-%E8%BF%9E%E7%BB%AD%E5%A4%8D%E5%88%A9">3. &#x8FDE;&#x7EED;&#x590D;&#x5229;</h2>
<p>&#x5F53;&#x8BA1;&#x606F;&#x6B21;&#x6570; $n$ &#x8D8B;&#x8FD1;&#x4E8E;&#x65E0;&#x7A77;&#x5927;&#x65F6;&#xFF0C;&#x590D;&#x5229;&#x8BA1;&#x7B97;&#x53D8;&#x4E3A;&#x8FDE;&#x7EED;&#x590D;&#x5229;&#x3002;&#x6B64;&#x65F6;&#xFF0C;&#x516C;&#x5F0F;&#x53D8;&#x4E3A;&#xFF1A;</p>
<p>$$<br>
A = P \cdot e^{rt}<br>
$$</p>
<p>&#x5176;&#x4E2D; $e$ &#x662F;&#x81EA;&#x7136;&#x5BF9;&#x6570;&#x7684;&#x5E95;&#xFF0C;&#x7EA6;&#x7B49;&#x4E8E; 2.71828&#x3002;</p>
<h2 id="4-%E6%8E%A8%E5%AF%BC%E8%BF%87%E7%A8%8B">4. &#x63A8;&#x5BFC;&#x8FC7;&#x7A0B;</h2>
<p>$$<br>
P \left(1 + \frac{r}{n}\right)^{nt} = P \cdot e^{rt}<br>
$$</p>
<h3 id="41-%E6%8E%A8%E5%AF%BC%E8%87%AA%E7%84%B6%E5%AF%B9%E6%95%B0-e">4.1 &#x63A8;&#x5BFC;&#x81EA;&#x7136;&#x5BF9;&#x6570; e</h3>
<p>&#x8BBE; $P = 1$&#x3001;$r = 1$&#x3001;$t = 1$&#xFF0C;&#x5219;&#x590D;&#x5229;&#x516C;&#x5F0F;&#x7B80;&#x5316;&#x4E3A;&#xFF1A;</p>
<p>$$<br>
A = \left(1 + \frac{1}{n}\right)^n<br>
$$</p>
<p>&#x5F53; $n$ &#x8D8B;&#x8FD1;&#x4E8E;&#x65E0;&#x7A77;&#x5927;&#x65F6;&#xFF0C;$A$ &#x7684;&#x6781;&#x9650;&#x5373;&#x4E3A; $e$&#xFF1A;</p>
<p>$$<br>
e = \lim_{n \to \infty} \left(1 + \frac{1}{n}\right)^n<br>
$$</p>
<h3 id="42-%E6%8E%A8%E5%AF%BC%E8%BF%9E%E7%BB%AD%E5%A4%8D%E5%88%A9%E5%85%AC%E5%BC%8F">4.2 &#x63A8;&#x5BFC;&#x8FDE;&#x7EED;&#x590D;&#x5229;&#x516C;&#x5F0F;</h3>
<ol>
<li>&#x8BBE; $P = 1$&#xFF0C;&#x4E14;&#x5F53; $n$ &#x8D8B;&#x8FD1;&#x4E8E;&#x65E0;&#x7A77;&#x5927;&#x65F6;&#xFF0C;&#x516C;&#x5F0F;&#x8868;&#x793A;&#x5982;&#x4E0B;:</li>
</ol>
<p>$$<br>
\lim_{n \to \infty} \left(1 + \frac{r}{n}\right)^{nt}<br>
$$</p>
<ol>
<li>&#x4E3A;&#x4E86;&#x7B80;&#x5316;&#x8BA1;&#x7B97;&#xFF0C;&#x6211;&#x4EEC;&#x5F15;&#x5165;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x53D8;&#x91CF; $\frac{1}{m}$ &#x6765;&#x66FF;&#x6362; $\frac{r}{n}$&#xFF0C;&#x5E76;&#x4E14; &#x5F53; $n \to \infty$ &#x65F6;&#xFF0C;$m \to \infty$&#xFF0C;&#x6B64;&#x65F6; $m$&#x3001;$n$ &#x7684;&#x5173;&#x7CFB;&#x4E3A;&#xFF1A;</li>
</ol>
<p>$$<br>
\frac{1}{m} = \frac{r}{n} = \frac{r}{m \cdot r}<br>
$$</p>
<ol start="3">
<li>&#x56E0;&#x6B64;&#xFF0C;&#x4EE3;&#x5165;&#x540E;&#x590D;&#x5229;&#x516C;&#x5F0F;&#x53EF;&#x4EE5;&#x6539;&#x5199;&#x4E3A;&#xFF1A;</li>
</ol>
<p>$$<br>
\lim_{m \to \infty} \left(1 + \frac{1}{m}\right)^{mrt} = \left(\lim_{m \to \infty} \left(1 + \frac{1}{m}\right)^{m}\right)^{rt} = e^{rt}<br>
$$</p>
]]></content:encoded></item><item><title><![CDATA[聚类 k-means]]></title><description><![CDATA[k-means  算法小记]]></description><link>https://www.7-0.cc/k-means-clustering/</link><guid isPermaLink="false">67b88303179718c73e398d17</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Fri, 21 Feb 2025 13:47:22 GMT</pubDate><content:encoded><![CDATA[<p>K-means (K&#x5E73;&#x5747;&#x805A;&#x7C7B;) &#x662F;&#x4E00;&#x79CD;&#x5E38;&#x7528;&#x7684;&#x65E0;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#x7B97;&#x6CD5;&#xFF0C;&#x4E3B;&#x8981;&#x7528;&#x4E8E;&#x805A;&#x7C7B;&#x5206;&#x6790;&#x3002;&#x5176;&#x76EE;&#x6807;&#x662F;&#x5C06;&#x6570;&#x636E;&#x96C6;&#x5212;&#x5206;&#x4E3A; K &#x4E2A;&#x7C07;&#xFF0C;&#x4F7F;&#x5F97;&#x6BCF;&#x4E2A;&#x6570;&#x636E;&#x70B9;&#x5F52;&#x5C5E;&#x4E8E;&#x6700;&#x8FD1;&#x7684;&#x7C07;&#x4E2D;&#x5FC3;&#xFF0C;&#x4E14;&#x7C07;&#x5185;&#x6570;&#x636E;&#x70B9;&#x5C3D;&#x53EF;&#x80FD;&#x76F8;&#x4F3C;&#xFF0C;&#x7C07;&#x95F4;&#x5DEE;&#x5F02;&#x5C3D;&#x53EF;&#x80FD;&#x5927;&#x3002;</p>
<p><strong>&#x7279;&#x70B9;</strong>&#xFF1A;</p>
<ul>
<li>&#x7B80;&#x5355;&#x6613;&#x7528;&#xFF0C;&#x5E7F;&#x6CDB;&#x5E94;&#x7528;&#x4E8E;&#x56FE;&#x50CF;&#x5206;&#x5272;&#x3001;&#x5E02;&#x573A;&#x7EC6;&#x5206;&#x3001;&#x6587;&#x6863;&#x805A;&#x7C7B;&#x7B49;&#x9886;&#x57DF;&#x3002;&#x3002;</li>
<li>&#x9700;&#x9884;&#x5148;&#x8BBE;&#x5B9A; K &#x503C;&#xFF0C;&#x9009;&#x62E9;&#x4E0D;&#x5F53;&#x53EF;&#x80FD;&#x5F71;&#x54CD;&#x7ED3;&#x679C;&#x3002;</li>
<li>&#x5BF9;&#x521D;&#x59CB;&#x4E2D;&#x5FC3;&#x654F;&#x611F;&#xFF0C;&#x53EF;&#x80FD;&#x9677;&#x5165;&#x5C40;&#x90E8;&#x6700;&#x4F18;&#x3002;</li>
<li>&#x5BF9;&#x566A;&#x58F0;&#x548C;&#x5F02;&#x5E38;&#x503C;&#x654F;&#x611F;&#x3002;</li>
</ul>
<h2 id="k-means-%E7%AE%97%E6%B3%95%E6%AD%A5%E9%AA%A4%EF%BC%9A">K-means &#x7B97;&#x6CD5;&#x6B65;&#x9AA4;&#xFF1A;</h2>
<ol>
<li>&#x521D;&#x59CB;&#x5316; K &#x4E2A;&#x4E2D;&#x5FC3;&#x70B9;&#xFF08; centroids &#xFF09;&#x3002;</li>
<li>&#x5C06;&#x6BCF;&#x4E2A;&#x6570;&#x636E;&#x70B9;&#x5206;&#x914D;&#x5230;&#x6700;&#x8FD1;&#x7684;&#x4E2D;&#x5FC3;&#x70B9;&#x6240;&#x5C5E;&#x7C07;&#x4E2D;&#x3002;</li>
<li>&#x66F4;&#x65B0;&#x6BCF;&#x4E2A;&#x7C07;&#x7684;&#x4E2D;&#x5FC3;&#x70B9;&#xFF0C;&#x4F7F;&#x5176;&#x6210;&#x4E3A;&#x5176;&#x6240;&#x6709;&#x6570;&#x636E;&#x70B9;&#x7684;&#x5E73;&#x5747;&#x503C;&#x3002;</li>
<li>&#x91CD;&#x590D;&#x6B65;&#x9AA4; 2 &#x548C;&#x6B65;&#x9AA4; 3&#xFF0C;&#x76F4;&#x5230;&#x7C07;&#x4E2D;&#x5FC3;&#x4E0D;&#x518D;&#x79FB;&#x52A8;&#x6216;&#x8FBE;&#x5230;&#x6700;&#x5927;&#x8FED;&#x4EE3;&#x6B21;&#x6570;&#x3002;</li>
</ol>
<h2 id="%E5%AE%9E%E4%BE%8B">&#x5B9E;&#x4F8B;</h2>
<p>&#x9996;&#x5148;&#xFF0C;&#x6211;&#x4EEC;&#x751F;&#x6210;&#x4E00;&#x4E9B;&#x968F;&#x673A;&#x6570;&#x636E;&#xFF0C;&#x7136;&#x540E;&#x4F7F;&#x7528; KMeans &#x7B97;&#x6CD5;&#x5BF9;&#x5B83;&#x4EEC;&#x8FDB;&#x884C;&#x805A;&#x7C7B;&#xFF0C;&#x5E76;&#x4F7F;&#x7528; matplotlib &#x7ED8;&#x5236;&#x51FA;&#x805A;&#x7C7B;&#x7ED3;&#x679C;&#x3002;</p>
<pre><code class="language-python">import cv2
import numpy as np
import matplotlib.pyplot as plt

# &#x8BBE;&#x7F6E;&#x968F;&#x673A;&#x6570;&#x79CD;&#x5B50;
np.random.seed(None)

# &#x751F;&#x6210; 100 &#x4E2A;&#x4E8C;&#x7EF4;&#x6570;&#x636E;&#x70B9;&#xFF0C;&#x8303;&#x56F4;&#x5728; [0, 50]
data = np.random.randint(0, 50, (100, 2)).astype(np.float32)

# &#x5B9A;&#x4E49; K &#x503C;&#xFF08;&#x7C07;&#x7684;&#x6570;&#x91CF;&#xFF09;
K = 3

# &#x5B9A;&#x4E49; K-means &#x7684;&#x505C;&#x6B62;&#x6761;&#x4EF6;, &#x4E24;&#x4E2A;&#x6807;&#x8BC6;&#x7B26; &#x901A;&#x8FC7; + &#x6765;&#x7EC4;&#x5408;, &#x7C7B;&#x4F3C;&#x4E8E; |
#  - TERM_CRITERIA_MAX_ITER: &#x6700;&#x5927;&#x8FED;&#x4EE3;&#x6B21;&#x6570;&#x6761;&#x4EF6;&#xFF0C;&#x8FBE;&#x5230;&#x6307;&#x5B9A;&#x6B21;&#x6570;&#x65F6;&#x505C;&#x6B62;&#x8FED;&#x4EE3;
#  - TERM_CRITERIA_EPS: &#x7CBE;&#x5EA6;&#x6761;&#x4EF6;&#xFF0C;&#x7C07;&#x4E2D;&#x5FC3;&#x7684;&#x79FB;&#x52A8;&#x5E45;&#x5EA6;&#x5C0F;&#x4E8E;&#x9608;&#x503C;&#xFF08;&#x7CBE;&#x5EA6;&#xFF09;&#x65F6;&#x505C;&#x6B62;&#x8FED;&#x4EE3;
criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 10, 1.0)

# &#x8FD0;&#x884C; K-means &#x7B97;&#x6CD5;
#   - attempts: &#x91CD;&#x590D;&#x7B97;&#x6CD5;&#x6B21;&#x6570;, &#x8FD4;&#x56DE;&#x7D27;&#x51D1;&#x6027;&#x6700;&#x597D;&#x7684;&#x4E00;&#x6B21;&#x7ED3;&#x679C;
#   - flags: &#x521D;&#x59CB;&#x4E2D;&#x5FC3;&#x7684;&#x9009;&#x62E9;&#x65B9;&#x6CD5;, &#x8FD9;&#x91CC;&#x91C7;&#x7528;&#x968F;&#x673A;&#x9009;&#x62E9;
#   - &#x8FD4;&#x56DE;&#x503C;: 
#     - compactness: &#x8868;&#x793A;&#x7ED3;&#x679C;&#x7684;&#x7D27;&#x51D1;&#x6027;, &#x5373;&#x6240;&#x6709;&#x6570;&#x636E;&#x70B9;&#x5230;&#x5176;&#x6240;&#x5C5E;&#x7C07;&#x4E2D;&#x5FC3;&#x7684;&#x8DDD;&#x79BB;&#x7684;&#x5E73;&#x65B9;&#x548C;
#     - labels: &#x8868;&#x793A;&#x6BCF;&#x4E2A;&#x6570;&#x636E;&#x70B9;&#x6240;&#x5C5E;&#x7684;&#x6807;&#x7B7E;(&#x7C07;)&#x7684;&#x7D22;&#x5F15;, &#x5F62;&#x72B6;&#x4E3A; (N, 1): [ [lebel_id], [lebel_id], ... ]
#     - centers: &#x8868;&#x793A;&#x6BCF;&#x4E2A;&#x7C07;&#x7684;&#x4E2D;&#x5FC3;
# &#x53C2;&#x8003;: https://docs.opencv.org/4.11.0/d5/d38/group__core__cluster.html#ga9a34dc06c6ec9460e90860f15bcd2f88
compactness, labels, centers = cv2.kmeans(data, K, None, criteria, attempts=10, flags=cv2.KMEANS_RANDOM_CENTERS)

# &#x5C06;&#x6570;&#x636E;&#x70B9;&#x6309;&#x6807;&#x7B7E;&#x5206;&#x79BB;, &#x4F7F;&#x7528; NumPy &#x7684;&#x5E03;&#x5C14;&#x7D22;&#x5F15;&#x64CD;&#x4F5C;
cluster1 = data[labels.ravel() == 0]
cluster2 = data[labels.ravel() == 1]
cluster3 = data[labels.ravel() == 2]

# &#x4F7F;&#x7528; Matplotlib &#x53EF;&#x89C6;&#x5316;&#x7ED3;&#x679C;
# &#x5C55;&#x793A;&#x539F;&#x59CB;&#x6570;&#x636E;&#x70B9;
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)  # 1 &#x884C; 2 &#x5217;&#xFF0C;&#x7B2C; 1 &#x4E2A;&#x5B50;&#x56FE;
plt.scatter(data[:, 0], data[:, 1], c=&apos;blue&apos;, label=&apos;Data Points&apos;) # data[:, 0] &#x6240;&#x6709;&#x70B9;&#x7684; X &#x5750;&#x6807;&#x96C6;, NumPy &#x591A;&#x7EF4;&#x5207;&#x7247;&#x8BED;&#x6CD5;
plt.ylabel(&apos;Y&apos;)
plt.title(&apos;Original Data Points&apos;)
plt.legend()

# &#x5C55;&#x793A;&#x805A;&#x7C7B;&#x7ED3;&#x679C;
plt.subplot(1, 2, 2)  # 1 &#x884C; 2 &#x5217;&#xFF0C;&#x7B2C; 2 &#x4E2A;&#x5B50;&#x56FE; 
plt.scatter(cluster1[:, 0], cluster1[:, 1], c=&apos;blue&apos;, label=&apos;Cluster 1&apos;)
plt.scatter(cluster2[:, 0], cluster2[:, 1], c=&apos;green&apos;, label=&apos;Cluster 2&apos;)
plt.scatter(cluster3[:, 0], cluster3[:, 1], c=&apos;red&apos;, label=&apos;Cluster 3&apos;)
plt.scatter(centers[:, 0], centers[:, 1], s=200, c=&apos;black&apos;, marker=&apos;*&apos;, label=&apos;Centers&apos;)
plt.xlabel(&apos;X&apos;)
plt.ylabel(&apos;Y&apos;)
plt.title(&apos;K-means Clustering with OpenCV&apos;)
plt.legend()
plt.show()
</code></pre>
<p><img src="https://www.7-0.cc/content/images/2025/02/---k-means_1_0.png" alt="&#x805A;&#x7C7B; k-means_1_0.png" loading="lazy"></p>
<p>&#x4ECE;&#x7ED3;&#x679C;&#x56FE;&#x4E2D;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x6240;&#x6709;&#x70B9;&#x90FD;&#x90FD;&#x88AB;&#x805A;&#x6210;&#x4E86; 3 &#x4E2A;&#x7C07;&#xFF0C;&#x4EE5;&#x989C;&#x8272;&#x533A;&#x5206;&#x3002;</p>
<h2 id="k-%E7%9A%84%E5%8F%96%E5%80%BC%E4%B8%8E%E8%81%9A%E7%B1%BB%E6%95%88%E6%9E%9C">K &#x7684;&#x53D6;&#x503C;&#x4E0E;&#x805A;&#x7C7B;&#x6548;&#x679C;</h2>
<p>K &#x7684;&#x53D6;&#x503C;&#x4EE5;&#x53CA;&#x4E2D;&#x5FC3;&#x7684;&#x7684;&#x521D;&#x59CB;&#x5316;&#x65B9;&#x5F0F;&#xFF0C;&#x5BF9;&#x805A;&#x7C7B;&#x6548;&#x679C;&#x5F71;&#x54CD;&#x5F88;&#x5927;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4E0B;&#x9762;&#x7684;&#x6848;&#x4F8B;&#x89C2;&#x5BDF;&#x4E0D;&#x540C;&#x7684; K &#x503C;&#x4E0E;&#x7D27;&#x51D1;&#x6027;&#xFF08;WCSS - Within Cluster Sum of Squares&#xFF09;&#x7684;&#x5173;&#x7CFB;&#x3002;</p>
<pre><code class="language-python">import cv2
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(None)

# &#x751F;&#x6210; 4 &#x4E2A;&#x7C07;&#x7684;&#x6570;&#x636E;
data = np.concatenate([
    np.random.normal(loc=center, scale=2, size=(25, 2))
    for center in [[0, 0], [10, 10], [0, 10], [10, 0]]
]).astype(np.float32)

# &#x5B9A;&#x4E49; K &#x503C;&#x8303;&#x56F4;
K_values = range(1, 11)
compactness_values = []

# &#x5B9A;&#x4E49; K-means &#x7684;&#x505C;&#x6B62;&#x6761;&#x4EF6;
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)

# &#x5BF9;&#x6BCF;&#x4E2A; K &#x503C;&#x8FD0;&#x884C; K-means
for K in K_values:
    # &#x8FD0;&#x884C; K-means
    compactness, labels, centers = cv2.kmeans(data, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    compactness_values.append(compactness)  # &#x8BB0;&#x5F55;&#x7D27;&#x51D1;&#x6027;

# &#x5C55;&#x793A;&#x539F;&#x59CB;&#x6570;&#x636E;&#x70B9;
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)  # 1 &#x884C; 2 &#x5217;&#xFF0C;&#x7B2C; 1 &#x4E2A;&#x5B50;&#x56FE;
plt.scatter(data[:, 0], data[:, 1], c=&apos;blue&apos;, label=&apos;Data Points&apos;) # data[:, 0] &#x6240;&#x6709;&#x70B9;&#x7684; X &#x5750;&#x6807;&#x96C6;, NumPy &#x591A;&#x7EF4;&#x5207;&#x7247;&#x8BED;&#x6CD5;
plt.xlabel(&apos;X&apos;)
plt.ylabel(&apos;Y&apos;)
plt.title(&apos;Original Data Points&apos;)
plt.legend()

# &#x7ED8;&#x5236; K &#x503C;&#x4E0E;&#x7D27;&#x51D1;&#x6027;&#x7684;&#x5173;&#x7CFB;&#x56FE;
plt.subplot(1, 2, 2)
plt.plot(K_values, compactness_values, marker=&apos;o&apos;, linestyle=&apos;-&apos;, color=&apos;b&apos;)
plt.xlabel(&apos;K (Number of Clusters)&apos;)
plt.ylabel(&apos;WCSS (Compactness)&apos;)
plt.title(&apos;K vs WCSS (OpenCV)&apos;)
plt.xticks(K_values)
plt.grid(True)
plt.show()
</code></pre>
<p><img src="https://www.7-0.cc/content/images/2025/02/---k-means_3_0.png" alt="&#x805A;&#x7C7B; k-means_3_0.png" loading="lazy"></p>
<p>&#x901A;&#x8FC7;&#x4E0A;&#x9762;&#x7684;&#x66F2;&#x7EBF;&#x56FE;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x5F53; K &#x503C;&#x8D8A;&#x5927;&#xFF0C;&#x7D27;&#x51D1;&#x6027;&#xFF08;WCSS&#xFF09;&#x7684;&#x5EA6;&#x91CF;&#x503C;&#x8D8A;&#x4F4E;&#xFF0C;&#x66F2;&#x7EBF;&#x6574;&#x4F53;&#x4E0A;&#x50CF;&#x662F;&#x4E00;&#x4E2A;&#x80F3;&#x818A;&#x8098;&#x7684;&#x5F62;&#x72B6;&#x3002; &#x800C;&#x5F53; K &#x503C;&#x8FBE;&#x5230;&#x67D0;&#x4E2A;&#x503C;&#x65F6;&#xFF08;&#x66F2;&#x7EBF;&#x7684;&#x8098;&#x70B9;&#xFF09;&#xFF0C;&#x6298;&#x7EBF;&#x7684;&#x4E0B;&#x964D;&#x8D8B;&#x52BF;&#x5F00;&#x59CB;&#x663E;&#x8457;&#x964D;&#x4F4E;&#xFF0C;&#x8FD9;&#x4E2A;&#x4F4D;&#x7F6E;&#x5C31;&#x662F; K &#x7684;&#x6700;&#x4F73;&#x503C;&#xFF0C;&#x56E0;&#x6B64;&#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x4E5F;&#x79F0;&#x4E3A; &#x8098;&#x70B9;&#x6CD5;&#xFF08;Elbow method&#xFF09;&#x3002;</p>
<h2 id="%E5%8F%82%E8%80%83">&#x53C2;&#x8003;</h2>
<ul>
<li><a href="https://www.naftaliharris.com/blog/visualizing-k-means-clustering/?ref=7-0.cc">Visualizing K-Means Clustering</a></li>
<li><a href="https://www.bilibili.com/video/BV11a4y187rP?t=19.3&amp;ref=7-0.cc">&#x89C6;&#x9891;&#x6F14;&#x793A;: k-means&#x7B97;&#x6CD5;&#x805A;&#x7C7B;&#x8FC7;&#x7A0B;</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[常见距离算法]]></title><description><![CDATA[常见的几个距离算法小记]]></description><link>https://www.7-0.cc/common-distance-algorithm/</link><guid isPermaLink="false">67b88671179718c73e398d38</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Wed, 19 Feb 2025 16:00:00 GMT</pubDate><content:encoded><![CDATA[<p>&#x8DDD;&#x79BB;&#x7B97;&#x6CD5;&#x7528;&#x4E8E;&#x8861;&#x91CF;&#x6570;&#x636E;&#x70B9;&#x4E4B;&#x95F4;&#x7684;&#x76F8;&#x4F3C;&#x6027;&#x6216;&#x5DEE;&#x5F02;&#x6027;&#xFF0C;&#x6839;&#x636E;&#x6570;&#x636E;&#x7279;&#x6027;&#x7684;&#x4E0D;&#x540C;&#xFF0C;&#x53EF;&#x4EE5;&#x91C7;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x5EA6;&#x91CF;&#x65B9;&#x6CD5;&#x3002;</p>
<p>&#x4E00;&#x822C;&#x800C;&#x8A00;&#xFF0C;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x51FD;&#x6570; $\text{dist}(x, y)$&#xFF0C;&#x82E5;&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x201C;&#x8DDD;&#x79BB;&#x5EA6;&#x91CF;&#x201D;(distance measure)&#xFF0C;&#x5219;&#x9700;&#x8981;&#x6EE1;&#x8DB3;&#x4EE5;&#x4E0B;&#x57FA;&#x672C;&#x6027;&#x8D28;&#xFF1A;</p>
<ol>
<li><strong>&#x975E;&#x8D1F;&#x6027;</strong>: $\text{dist}(x_i, x_j) \geq 0$&#xFF1B;</li>
<li><strong>&#x540C;&#x4E00;&#x6027;</strong>: $\text{dist}(x_i, x_j) = 0$ &#x5F53;&#x4E14;&#x4EC5;&#x5F53; $x_i = x_j$&#xFF1B;</li>
<li><strong>&#x5BF9;&#x79F0;&#x6027;</strong>: $\text{dist}(x_i, x_j) = \text{dist}(x_j, x_i)$&#xFF1B;</li>
<li><strong>&#x4E09;&#x89D2;&#x4E0D;&#x7B49;&#x5F0F;</strong>: $\text{dist}(x_i, x_j) \leq \text{dist}(x_i, x_k) + \text{dist}(x_k, x_j)$&#x3002;</li>
</ol>
<p>&#x5E38;&#x89C1;&#x7684;&#x6709;&#x4EE5;&#x4E0B;&#x51E0;&#x79CD;&#xFF1A;</p>
<h2 id="1-%E6%AC%A7%E6%B0%8F%E8%B7%9D%E7%A6%BB-euclidean-distance">1. &#x6B27;&#x6C0F;&#x8DDD;&#x79BB; (Euclidean Distance)</h2>
<ul>
<li><strong>&#x5B9A;&#x4E49;</strong>: &#x4E24;&#x70B9;&#x5728;&#x6B27;&#x51E0;&#x91CC;&#x5F97;&#x7A7A;&#x95F4;&#x4E2D;&#x7684;&#x76F4;&#x7EBF;&#x8DDD;&#x79BB;&#x3002;</li>
<li><strong>&#x516C;&#x5F0F;</strong>: &#x5BF9;&#x4E8E;&#x70B9; $P = (p_1, p_2, \dots, p_n)$ &#x548C; $Q = (q_1, q_2, \dots, q_n)$&#xFF0C;&#x6B27;&#x6C0F;&#x8DDD;&#x79BB;&#x4E3A;&#xFF1A;<br>
$$<br>
d(P, Q) = \sqrt{\sum_{i=1}^n (p_i - q_i)^2}<br>
$$</li>
<li><strong>&#x5E94;&#x7528;</strong>: &#x9002;&#x7528;&#x4E8E;&#x8FDE;&#x7EED;&#x6570;&#x636E;&#xFF0C;&#x5982;KNN&#x3001;K-Means&#x7B49;&#x3002;</li>
</ul>
<h2 id="2-%E6%9B%BC%E5%93%88%E9%A1%BF%E8%B7%9D%E7%A6%BB-manhattan-distance">2. &#x66FC;&#x54C8;&#x987F;&#x8DDD;&#x79BB; (Manhattan Distance)</h2>
<ul>
<li><strong>&#x5B9A;&#x4E49;</strong>: &#x4E24;&#x70B9;&#x5728;&#x6807;&#x51C6;&#x5750;&#x6807;&#x7CFB;&#x4E0A;&#x7684;&#x7EDD;&#x5BF9;&#x8F74;&#x8DDD;&#x603B;&#x548C;&#x3002;</li>
<li><strong>&#x516C;&#x5F0F;</strong>:<br>
$$<br>
d(P, Q) = \sum_{i=1}^n |p_i - q_i|<br>
$$</li>
<li><strong>&#x5E94;&#x7528;</strong>: &#x9002;&#x7528;&#x4E8E;&#x7F51;&#x683C;&#x72B6;&#x8DEF;&#x5F84;&#xFF0C;&#x5982;&#x57CE;&#x5E02;&#x8857;&#x533A;&#x8DDD;&#x79BB;&#x3002;</li>
</ul>
<h2 id="3-%E5%88%87%E6%AF%94%E9%9B%AA%E5%A4%AB%E8%B7%9D%E7%A6%BB-chebyshev-distance">3. &#x5207;&#x6BD4;&#x96EA;&#x592B;&#x8DDD;&#x79BB; (Chebyshev Distance)</h2>
<ul>
<li><strong>&#x5B9A;&#x4E49;</strong>: &#x4E24;&#x70B9;&#x5728;&#x5404;&#x5750;&#x6807;&#x8F74;&#x4E0A;&#x7684;&#x6700;&#x5927;&#x5DEE;&#x503C;&#x3002;</li>
<li><strong>&#x516C;&#x5F0F;</strong>:<br>
$$<br>
d(P, Q) = \max_i |p_i - q_i|<br>
$$</li>
<li><strong>&#x5E94;&#x7528;</strong>: &#x9002;&#x7528;&#x4E8E;&#x9700;&#x8981;&#x8861;&#x91CF;&#x6700;&#x5927;&#x5DEE;&#x5F02;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x5982;&#x68CB;&#x76D8;&#x4E0A;&#x7684;&#x79FB;&#x52A8;&#x3002;</li>
</ul>
<h2 id="4-%E9%97%B5%E5%8F%AF%E5%A4%AB%E6%96%AF%E5%9F%BA%E8%B7%9D%E7%A6%BB-minkowski-distance">4. &#x95F5;&#x53EF;&#x592B;&#x65AF;&#x57FA;&#x8DDD;&#x79BB; (Minkowski Distance)</h2>
<ul>
<li><strong>&#x5B9A;&#x4E49;</strong>: &#x6B27;&#x6C0F;&#x8DDD;&#x79BB;&#x548C;&#x66FC;&#x54C8;&#x987F;&#x8DDD;&#x79BB;&#x7684;&#x63A8;&#x5E7F;&#xFF0C;&#x901A;&#x8FC7;&#x53C2;&#x6570; $p$ &#x63A7;&#x5236;&#x8DDD;&#x79BB;&#x7C7B;&#x578B;&#x3002;</li>
<li><strong>&#x516C;&#x5F0F;</strong>:<br>
$$<br>
d(P, Q) = \left( \sum_{i=1}^n |p_i - q_i|^p \right)^{1/p}<br>
$$</li>
<li><strong>&#x5E94;&#x7528;</strong>: &#x901A;&#x8FC7;&#x8C03;&#x6574; $p$ &#x503C;&#x9002;&#x5E94;&#x4E0D;&#x540C;&#x573A;&#x666F;&#x3002;</li>
<li><strong>&#x7279;&#x70B9;</strong>&#xFF1A;
<ul>
<li>
<p><strong>p=1</strong>: &#x95F5;&#x53EF;&#x592B;&#x65AF;&#x57FA;&#x8DDD;&#x79BB;&#x7B49;&#x540C;&#x4E8E;<strong>&#x66FC;&#x54C8;&#x987F;&#x8DDD;&#x79BB;</strong>&#x3002;</p>
</li>
<li>
<p><strong>p=2</strong>: &#x95F5;&#x53EF;&#x592B;&#x65AF;&#x57FA;&#x8DDD;&#x79BB;&#x7B49;&#x540C;&#x4E8E;<strong>&#x6B27;&#x6C0F;&#x8DDD;&#x79BB;</strong>&#x3002;</p>
<p>$$<br>
d(P, Q) = \left( \sum_{i=1}^n |p_i - q_i|^2 \right)^{1/2}<br>
$$</p>
<p>&#x8FDB;&#x4E00;&#x6B65;&#x7B80;&#x5316;&#x4E3A;&#xFF1A;<br>
$$<br>
d(P, Q) = \sqrt{\sum_{i=1}^n (p_i - q_i)^2}<br>
$$</p>
</li>
<li>
<p><strong>p&#x2192;&#x221E;</strong>: &#x95F5;&#x53EF;&#x592B;&#x65AF;&#x57FA;&#x8DDD;&#x79BB;&#x8D8B;&#x8FD1;&#x4E8E;<strong>&#x5207;&#x6BD4;&#x96EA;&#x592B;&#x8DDD;&#x79BB;</strong>&#x3002;</p>
</li>
</ul>
</li>
</ul>
<h2 id="5-%E6%B1%89%E6%98%8E%E8%B7%9D%E7%A6%BB-hamming-distance">5. &#x6C49;&#x660E;&#x8DDD;&#x79BB; (Hamming Distance)</h2>
<ul>
<li><strong>&#x5B9A;&#x4E49;</strong>: &#x4E24;&#x4E2A;&#x7B49;&#x957F;&#x5B57;&#x7B26;&#x4E32;&#x5728;&#x76F8;&#x540C;&#x4F4D;&#x7F6E;&#x4E0A;&#x4E0D;&#x540C;&#x5B57;&#x7B26;&#x7684;&#x6570;&#x91CF;&#x3002;</li>
<li><strong>&#x516C;&#x5F0F;</strong>:<br>
$$<br>
d(P, Q) = \sum_{i=1}^n \delta(p_i, q_i), \quad \delta(p_i, q_i) =<br>
\begin{cases}<br>
0 &amp; \text{&#x5982;&#x679C; } p_i = q_i \<br>
1 &amp; \text{&#x5982;&#x679C; } p_i \neq q_i<br>
\end{cases}<br>
$$</li>
<li><strong>&#x5E94;&#x7528;</strong>: &#x7528;&#x4E8E;&#x7F16;&#x7801;&#x7406;&#x8BBA;&#x3001;&#x4FE1;&#x606F;&#x68C0;&#x7D22;&#x7B49;&#x3002;</li>
</ul>
<h2 id="6-%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6-cosine-similarity">6. &#x4F59;&#x5F26;&#x76F8;&#x4F3C;&#x5EA6; (Cosine Similarity)</h2>
<ul>
<li><strong>&#x5B9A;&#x4E49;</strong>: &#x901A;&#x8FC7;&#x8BA1;&#x7B97;&#x4E24;&#x4E2A;&#x5411;&#x91CF;&#x7684;&#x5939;&#x89D2;&#x4F59;&#x5F26;&#x503C;&#x6765;&#x8861;&#x91CF;&#x76F8;&#x4F3C;&#x6027;&#x3002;</li>
<li><strong>&#x516C;&#x5F0F;</strong>:<br>
$$<br>
\text{cosine}(P, Q) = \frac{P \cdot Q}{|P| |Q|}<br>
$$</li>
<li><strong>&#x5E94;&#x7528;</strong>: &#x9002;&#x7528;&#x4E8E;&#x6587;&#x672C;&#x5206;&#x6790;&#x3001;&#x63A8;&#x8350;&#x7CFB;&#x7EDF;&#x7B49;&#x3002;</li>
</ul>
<h2 id="7-%E6%9D%B0%E5%8D%A1%E5%BE%B7%E8%B7%9D%E7%A6%BB-jaccard-distance">7. &#x6770;&#x5361;&#x5FB7;&#x8DDD;&#x79BB; (Jaccard Distance)</h2>
<ul>
<li><strong>&#x5B9A;&#x4E49;</strong>: &#x8861;&#x91CF;&#x4E24;&#x4E2A;&#x96C6;&#x5408;&#x7684;&#x5DEE;&#x5F02;&#xFF0C;&#x57FA;&#x4E8E;&#x4EA4;&#x96C6;&#x4E0E;&#x5E76;&#x96C6;&#x7684;&#x6BD4;&#x4F8B;&#x3002;</li>
<li><strong>&#x516C;&#x5F0F;</strong>:<br>
$$<br>
d(P, Q) = 1 - \frac{|P \cap Q|}{|P \cup Q|}<br>
$$</li>
<li><strong>&#x5E94;&#x7528;</strong>: &#x7528;&#x4E8E;&#x96C6;&#x5408;&#x76F8;&#x4F3C;&#x6027;&#x6BD4;&#x8F83;&#xFF0C;&#x5982;&#x6587;&#x6863;&#x76F8;&#x4F3C;&#x6027;&#x3002;</li>
</ul>
<h2 id="8-%E9%A9%AC%E6%B0%8F%E8%B7%9D%E7%A6%BB-mahalanobis-distance">8. &#x9A6C;&#x6C0F;&#x8DDD;&#x79BB; (Mahalanobis Distance)</h2>
<ul>
<li><strong>&#x5B9A;&#x4E49;</strong>: &#x8003;&#x8651;&#x6570;&#x636E;&#x5206;&#x5E03;&#x7684;&#x8DDD;&#x79BB;&#x5EA6;&#x91CF;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x591A;&#x7EF4;&#x6570;&#x636E;&#x3002;</li>
<li><strong>&#x516C;&#x5F0F;</strong>:<br>
$$<br>
d(P, Q) = \sqrt{(P - Q)^T S^{-1} (P - Q)}<br>
$$<br>
&#x5176;&#x4E2D; $S$ &#x662F;&#x534F;&#x65B9;&#x5DEE;&#x77E9;&#x9635;&#x3002;</li>
<li><strong>&#x5E94;&#x7528;</strong>: &#x9002;&#x7528;&#x4E8E;&#x9700;&#x8981;&#x8003;&#x8651;&#x6570;&#x636E;&#x76F8;&#x5173;&#x6027;&#x7684;&#x573A;&#x666F;&#x3002;</li>
</ul>
<p>&#x8FD9;&#x4E9B;&#x8DDD;&#x79BB;&#x7B97;&#x6CD5;&#x5404;&#x6709;&#x7279;&#x70B9;&#xFF0C;&#x9009;&#x62E9;&#x65F6;&#x5E94;&#x6839;&#x636E;&#x5177;&#x4F53;&#x95EE;&#x9898;&#x548C;&#x6570;&#x636E;&#x7279;&#x6027;&#x8FDB;&#x884C;&#x6743;&#x8861;&#x3002;</p>
]]></content:encoded></item><item><title><![CDATA[行列式 - 同乘后加到另一行后，行列式不变]]></title><description><![CDATA[高等数学之行列式定理证明小记]]></description><link>https://www.7-0.cc/math-determinant-proof/</link><guid isPermaLink="false">69b41e0cb1f19d0001c3e1d9</guid><category><![CDATA[Notebook]]></category><dc:creator><![CDATA[骑驴的柒零]]></dc:creator><pubDate>Tue, 17 Dec 2024 17:54:00 GMT</pubDate><content:encoded><![CDATA[<p>@@ Tags: &#x884C;&#x5217;&#x5F0F;<br>
@@ Date: 2024-12-18 0154</p>
<p>&#x8BC1;&#x660E;&#x884C;&#x5217;&#x5F0F;&#x7684;&#x67D0;&#x884C;&#x7684;&#x5404;&#x5143;&#x7D20;&#x540C;&#x4E58;&#x4EE5;&#x4E00;&#x4E2A;&#x6570;&#x7136;&#x540E;&#x52A0;&#x5230;&#x53E6;&#x4E00;&#x884C;&#x4E0A;&#xFF0C;&#x884C;&#x5217;&#x5F0F;&#x4E0D;&#x53D8;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x6309;&#x7167;&#x4EE5;&#x4E0B;&#x6B65;&#x9AA4;&#x8FDB;&#x884C;&#xFF1A;</p>
<p>&#x7B2C;&#x4E00;&#x6B65;&#xFF0C;&#x8BBE;&#x539F;&#x884C;&#x5217;&#x5F0F;&#x4E3A;</p>
<p>$D = \left| \begin{array}{cccc}<br>
a_{11} &amp; a_{12} &amp; \cdots &amp; a_{1n} \\<br>
a_{21} &amp; a_{22} &amp; \cdots &amp; a_{2n} \\<br>
\vdots &amp; \vdots &amp; \ddots &amp; \vdots \\<br>
a_{i1} &amp; a_{i2} &amp; \cdots &amp; a_{in} \\<br>
a_{j1} &amp; a_{j2} &amp; \cdots &amp; a_{jn} \\<br>
\vdots &amp; \vdots &amp; \ddots &amp; \vdots \\<br>
a_{n1} &amp; a_{n2} &amp; \cdots &amp; a_{nn} \\<br>
\end{array} \right|$</p>
<p>&#x5176;&#x4E2D;&#xFF0C;$i \neq j$&#x3002;</p>
<p>&#x7B2C;&#x4E8C;&#x6B65;&#xFF0C;&#x6839;&#x636E;&#x9898;&#x76EE;&#x8981;&#x6C42;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x7B2C;$i$&#x884C;&#x7684;&#x5404;&#x5143;&#x7D20;&#x540C;&#x4E58;&#x4EE5;&#x4E00;&#x4E2A;&#x6570;$k$&#x7136;&#x540E;&#x52A0;&#x5230;&#x7B2C;$j$&#x884C;&#x4E0A;&#xFF0C;&#x5F97;&#x5230;&#x65B0;&#x7684;&#x884C;&#x5217;&#x5F0F;&#xFF1A;</p>
<p>$D&apos; = \left| \begin{array}{cccc}<br>
a_{11} &amp; a_{12} &amp; \cdots &amp; a_{1n} \\<br>
a_{21} &amp; a_{22} &amp; \cdots &amp; a_{2n} \\<br>
\vdots &amp; \vdots &amp; \ddots &amp; \vdots \\<br>
a_{i1} &amp; a_{i2} &amp; \cdots &amp; a_{in} \\<br>
a_{j1} + ka_{i1} &amp; a_{j2} + ka_{i2} &amp; \cdots &amp; a_{jn} + ka_{in} \\<br>
\vdots &amp; \vdots &amp; \ddots &amp; \vdots \\<br>
a_{n1} &amp; a_{n2} &amp; \cdots &amp; a_{nn} \\<br>
\end{array} \right|$</p>
<p>&#x7B2C;&#x4E09;&#x6B65;&#xFF0C;&#x6839;&#x636E;&#x884C;&#x5217;&#x5F0F;&#x7684;&#x6027;&#x8D28; &#x2014;&#x2014; &#x884C;&#x5217;&#x5F0F;&#x7684;&#x67D0;&#x4E00;&#x884C;&#xFF08;&#x5217;&#xFF09;&#x7684;&#x5143;&#x7D20;&#x90FD;&#x662F;&#x4E24;&#x6570;&#x4E4B;&#x548C;&#xFF0C;&#x5219;D&apos;&#x7B49;&#x4E8E;&#x4E0B;&#x5217;&#x4E24;&#x4E2A;&#x884C;&#x5217;&#x5F0F;&#x4E4B;&#x548C;&#xFF0C;&#x5F97;&#x5230;&#xFF1A;</p>
<p>$D&apos; = \left( \left| \begin{array}{cccc}<br>
a_{11} &amp; a_{12} &amp; \cdots &amp; a_{1n} \\<br>
a_{21} &amp; a_{22} &amp; \cdots &amp; a_{2n} \\<br>
\vdots &amp; \vdots &amp; \ddots &amp; \vdots \\<br>
a_{i1} &amp; a_{i2} &amp; \cdots &amp; a_{in} \\<br>
a_{j1} &amp; a_{j2} &amp; \cdots &amp; a_{jn} \\<br>
\vdots &amp; \vdots &amp; \ddots &amp; \vdots \\<br>
a_{n1} &amp; a_{n2} &amp; \cdots &amp; a_{nn} \\<br>
\end{array} \right| + <br>
\left| \begin{array}{cccc}<br>
a_{11} &amp; a_{12} &amp; \cdots &amp; a_{1n} \\<br>
a_{21} &amp; a_{22} &amp; \cdots &amp; a_{2n} \\<br>
\vdots &amp; \vdots &amp; \ddots &amp; \vdots \\<br>
a_{i1} &amp; a_{i2} &amp; \cdots &amp; a_{in} \\<br>
ka_{i1} &amp; ka_{i2} &amp; \cdots &amp; ka_{in} \\<br>
\vdots &amp; \vdots &amp; \ddots &amp; \vdots \\<br>
a_{n1} &amp; a_{n2} &amp; \cdots &amp; a_{nn} \\<br>
\end{array} \right| \right)$</p>
<p>&#x7B2C;&#x56DB;&#x6B65;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x884C;&#x5217;&#x5F0F;&#x7684;&#x7B2C;$j$&#x884C;&#x662F;&#x7B2C;$i$&#x884C;&#x7684;$k$&#x500D;&#xFF0C;&#x6839;&#x636E;&#x884C;&#x5217;&#x5F0F;&#x7684;&#x6027;&#x8D28; &#x2014;&#x2014; &#x884C;&#x5217;&#x5F0F;&#x4E2D;&#x5982;&#x679C;&#x6709;&#x4E24;&#x884C;&#xFF08;&#x5217;&#xFF09;&#x5143;&#x7D20;&#x6210;&#x6BD4;&#x4F8B;&#xFF0C;&#x5219;&#x6B64;&#x884C;&#x5217;&#x5F0F;&#x7B49;&#x4E8E;&#x96F6;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x6211;&#x4EEC;&#x5F97;&#x5230;&#xFF1A;</p>
<p>$D&apos; = D + 0 = D$</p>
<p>&#x8FD9;&#x5C31;&#x8BC1;&#x660E;&#x4E86;&#x884C;&#x5217;&#x5F0F;&#x7684;&#x67D0;&#x884C;&#x7684;&#x5404;&#x5143;&#x7D20;&#x540C;&#x4E58;&#x4EE5;&#x4E00;&#x4E2A;&#x6570;&#x7136;&#x540E;&#x52A0;&#x5230;&#x53E6;&#x4E00;&#x884C;&#x4E0A;&#xFF0C;&#x884C;&#x5217;&#x5F0F;&#x4E0D;&#x53D8;&#x3002;</p>
]]></content:encoded></item></channel></rss>