RTRM:阅读参考手册 我提到微控制器有几个引脚。为方便起见,这些引脚分为 16个引脚的端口。每个端口都用一​​个字母命名:端口A,端口B等,每个端口内的引脚用0到15之间的数字命名。

    我们要弄清楚的第一件事是哪个引脚连接到哪个LED。此信息在STM32F3DISCOVERY 用户手册中(您下载了副本,对吧?)。在这个特定的部分:

    第6.4节LED - 第18页

    手册说:

    LD3,北LED,连接到引脚PE9。PE9是E的简称:E端口9号。 LD7,东LED,连接到引脚PE11。 到目前为止,我们知道我们想要改变引脚PE9和PE11的状态以打开/关闭北/东LED。这些引脚是端口E的一部分,因此我们必须处理GPIOE 外设。

    每个外设都有一个与之关联的寄存器块。寄存器块是在连续存储器中分配的寄存器的集合。寄存器块启动的地址称为其基址。我们需要弄清楚GPIOE外围设备的基地址是什么。该信息在微控制器参考手册的以下部分中:

    第3.2.2节存储器映射和寄存器边界地址 - 第51页

    该表说明了GPIOE寄存器块的基址0x4800_1000。

    每个外围设备在文档中也有自己的部分。这些部分中的每一部分都以外设寄存器块包含的寄存器表结束。对于GPIO外设系列,该表位于:

    第11.4.12节GPIO寄存器映射 - 页243

    我们感兴趣的0x18是与GPIOE 外围设备的基地址偏移的寄存器。根据该表,这将是登记册BSRR。

    现在我们需要跳转到该特定寄存器的文档。这是几页以上:

    第11.4.7节GPIO端口位置1 /复位寄存器(GPIOx_BSRR) - 第240页

    最后!

    这是我们写的寄存器。文档说了一些有趣的事情。首先,这个寄存器是只写的…所以让我们尝试读取它的值:-)。

    我们将使用GDB的examine命令:x。

    (gdb) next 16 (GPIOE_BSRR as mut u32) = 1 << 9;

    (gdb) x 0x48001018 0x48001018: 0x00000000

    (gdb) # the next command will turn the North LED on (gdb) next 19 (GPIOE_BSRR as mut u32) = 1 << 11;

    (gdb) x 0x48001018 0x48001018: 0x00000000 读取寄存器返回0。这符合文档所说的内容。

    文档中说的另一件事是0到15位可用于设置相应的引脚。即位0设置引脚0.这里,设置意味着在引脚上输出一个高值。

    文档还说第16到31位可用于复位相应的引脚。在这种情况下,位16复位引脚号0.正如您所猜测的,复位意味着在引脚上输出一个低值。

    将这些信息与我们的计划相关联,似乎都是一致的:

    写1 << 9(BS9 = 1)BSRR 设置PE9 高。那会使北方LED 上。

    写1 << 11(BS11 = 1)BSRR设置PE11 高。那会使东LED 上。

    写1 << 25(BR9 = 1)BSRR设置PE9 低。这使得北极LED 关闭。

    最后,写1 << 27(BR11 = 1)BSRR设置PE11 低。这使得东方LED 关闭。