<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>流水灯 on 鹿鸣青野的blog</title><link>https://www.sylgalaxy.xyz/tags/%E6%B5%81%E6%B0%B4%E7%81%AF/</link><description>Recent content in 流水灯 on 鹿鸣青野的blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 08 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.sylgalaxy.xyz/tags/%E6%B5%81%E6%B0%B4%E7%81%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>STM32 GPIO 入门三连：点亮 LED、流水灯与蜂鸣器</title><link>https://www.sylgalaxy.xyz/posts/stm32-gpio-led-buzzer/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/stm32-gpio-led-buzzer/</guid><description>&lt;p&gt;环境配好、接线踩坑之后，接下来就是让外设动起来。这组实验全部围绕 GPIO 输出：先点亮一颗 LED，再扩展成八路流水灯，最后用同样的思路驱动蜂鸣器。三个实验的代码都在工程的 &lt;code&gt;User\main.c&lt;/code&gt; 里（如 &lt;code&gt;3-1点亮LED灯&lt;/code&gt;、&lt;code&gt;3-2流水灯&lt;/code&gt;、&lt;code&gt;3-3蜂鸣器&lt;/code&gt;）。&lt;/p&gt;
&lt;h2 id="一点亮第一颗-led"&gt;一、点亮第一颗 LED&lt;/h2&gt;
&lt;p&gt;之前两天都在跟接线较劲，怀疑人生；当 LED 终于亮起来的时候，成就感爆棚。&lt;strong&gt;核心教训：嵌入式开发，硬件接线和软件一样重要。&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// PA0 配置为推挽输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GPIO_InitStructure.GPIO_Pin &lt;span style="color:#f92672"&gt;=&lt;/span&gt; GPIO_Pin_0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GPIO_InitStructure.GPIO_Mode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; GPIO_Mode_Out_PP; &lt;span style="color:#75715e"&gt;// 推挽输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GPIO_InitStructure.GPIO_Speed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; GPIO_Speed_50MHz;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;GPIO_Init&lt;/span&gt;(GPIOA, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;GPIO_InitStructure);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 低电平点亮 LED
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;GPIO_ResetBits&lt;/span&gt;(GPIOA, GPIO_Pin_0);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键理解：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPIO 配置：推挽输出模式，速度 50MHz&lt;/li&gt;
&lt;li&gt;LED 驱动：低电平有效，&lt;code&gt;GPIO_ResetBits&lt;/code&gt; 拉低点亮&lt;/li&gt;
&lt;li&gt;当前状态：常亮，&lt;code&gt;while(1)&lt;/code&gt; 为空&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二流水灯pa0-pa7-八个-led"&gt;二、流水灯：PA0-PA7 八个 LED&lt;/h2&gt;
&lt;p&gt;在单颗 LED 的基础上，实现 PA0-PA7 八个 LED 流水灯效果。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 配置 GPIOA 所有引脚为推挽输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GPIO_InitStructure.GPIO_Pin &lt;span style="color:#f92672"&gt;=&lt;/span&gt; GPIO_Pin_All; &lt;span style="color:#75715e"&gt;// 一次性配置所有引脚
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;GPIO_Init&lt;/span&gt;(GPIOA, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;GPIO_InitStructure);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 流水灯核心：GPIO_Write 一次写入 16 位数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;GPIO_Write&lt;/span&gt;(GPIOA, &lt;span style="color:#f92672"&gt;~&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0x0001&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 0x0001取反=0xFFFE，PA0低电平点亮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Delay_ms&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;300&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;GPIO_Write&lt;/span&gt;(GPIOA, &lt;span style="color:#f92672"&gt;~&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0x0002&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// PA1点亮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Delay_ms&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;300&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;GPIO_Write&lt;/span&gt;(GPIOA, &lt;span style="color:#f92672"&gt;~&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0x0004&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// PA2点亮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ... 依次类推到 PA7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="gpio-操作函数对比"&gt;GPIO 操作函数对比&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;函数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;使用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GPIO_ResetBits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;单引脚拉低&lt;/td&gt;
&lt;td&gt;单个LED控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GPIO_SetBits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;单引脚拉高&lt;/td&gt;
&lt;td&gt;单个LED控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GPIO_WriteBit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;按位设置&lt;/td&gt;
&lt;td&gt;单引脚精确控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GPIO_Write&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16位整体写入&lt;/td&gt;
&lt;td&gt;多引脚同时控制&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="位操作技巧"&gt;位操作技巧&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~0x0001&lt;/code&gt; = &lt;code&gt;0xFFFE&lt;/code&gt; → PA0 低电平（点亮），其余高电平（熄灭）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~0x0002&lt;/code&gt; = &lt;code&gt;0xFFFD&lt;/code&gt; → PA1 低电平（点亮）&lt;/li&gt;
&lt;li&gt;位左移：&lt;code&gt;0x0001 &amp;lt;&amp;lt; n&lt;/code&gt; 可以简化代码&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="优化思路"&gt;优化思路&lt;/h3&gt;
&lt;p&gt;当前代码是 8 行重复，可以用循环 + 移位简化：&lt;/p&gt;</description></item></channel></rss>