# STM32借助Mbed OS多线程调节电脑音量

{% tabs %}
{% tab title="关键词" %}
STM32 | Mbed OS | 多线程
{% endtab %}

{% tab title="梗概" %}
### Mbed定义STM32

#### STM32

本文使用 Black Pill STM32，其DIP 外形尺寸适合任何面包板，并且 USB C 电缆可以为电路板供电，除非您驱动大量外部电路，否则您可能不需要外部电源。

不过，与某些开发板不同的是，USB 端口无法帮助您进行编程，除非您在引导加载程序中进行烧录。 理论上，如果在复位过程中按住 BOOT0 按钮，板子可以做 DFU。 但是，我的板子偶尔会进入 DFU 模式，这似乎是一个普遍的问题。 解决的诀窍似乎是拔下 USB 并重新插入，而不是使用重置按钮。 插入电路板时，按 BOOT0，几秒钟后，松开 BOOT0 按钮，这使它更可靠一些。 然后，您需要一个 DFU 闪存程序来编写一个 .bin 文件，以便写入位置 0x08000000 处的 DFU 设备的 alt 0，至此，你仍然不能开始调试。

从 USB 连接到 10 针连接器的 STLink v2 加密狗非常便宜，它将让您进行编程和调试。 但是，这些加密狗不支持跟踪功能。

当然，您也可以在没有跟踪的情况下使用，可以通过称为 SWO（串行线输出）的功能进行“printf 样式”输出，而不必将 USB 端口用作串行端口。 如果你想要 SWO，你要么需要更昂贵的 STLink 版本（带有更大的连接器）。 您还可以使用其他类似的探头，例如 Blackmagic 探头。 在某些情况下，您也可以使用半主机，但最好使用正确的探针、SWO 输出或仅使用调试器。

我使用的 STLink 加密狗有 10 个引脚。 不幸的是，并非所有复制品都具有相同的引脚排列。 Blackpill 上的四个引脚（从左侧开始，同时查看连接器）是：3.3 V、SWDIO、SWCLK 和接地。 如果您不介意从 USB 端口获取电源，则只需要最后三个引脚。

通常，这些复制品适配器的外壳上有引脚排列。 对于我来说，我需要的三根电线分别位于引脚 6、7 和 8 上。如果您确实需要从设备中汲取 3.3 V 电压，请小心，消耗过多电流或短路电源线会损坏加密狗。

#### 软件

我选择 Mbed 工具，它是一个类似于 Arduino 的生态系统。不过，其生态系统并不直接支持 Black Pill，且目标板不支持 USB。 不过，它似乎只能在本地运行的 Mbed IDE 上工作。如果您使用不同的工具集，您可能会发现自己需要自己来定义目标，如PlatformIO。

#### 开始

一旦你把所有东西都组装好了，就很容易让程序运行起来。让我们做一个简单的 LED 闪光灯，在 USB 串行端口上输出一些输出。 例如，您可以在在线模拟器中运行“Blinky”示例。 问题是 printf 在我们的板上没有任何用处。

```c
#include "mbed.h"
#include "USBSerial.h"
 
DigitalOut led(LED1);
USBSerial usbSerial(false); // don't wait for connection
 
int main() {
   usbSerial.connect();  // set up serial port
   while (1) {
     led = !led;
    usbSerial.printf("Blink! LED is now %d\\n", led.read());
    ThisThread::sleep_for(500ms);
    }
}
```

就是这么简单。只需按照 Black Pill 配置中的说明设置一个项目。即：

* 在 Mbed IDE 中创建一个新项目。
* 右键单击程序的根文件夹，然后在弹出窗口中选择添加库...
* 打开下拉列表并选择默认值，然后单击完成。

如果您使用的是 STLink，您只需单击运行按钮或调试按钮即可开始使用。 如果您选择了 DFU，IDE 会告诉您将 .bin 文件放在哪里。 这就是你需要为你的 DFU 编程器提供的东西。 如果您使用 Linux，dfu-util 行将如下所示：

### STM32 Mbed OS多线程控制

#### 线程设置

#### 音量调节

#### 多线程通讯

### 源代码
{% endtab %}
{% endtabs %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}
