RTRM: 阅读参考手册
我提到微控制器有几个引脚。为了方便起见,这些引脚被分组在16个引脚的端口中。 每个端口用一个字母命名: 端口A、端口B等,每个端口内的引脚用0到15之间的数字命名。
我们首先要弄清楚的是哪个引脚连接到哪个LED。此信息在STM32F3DISCOVERY用户手册中 (您下载了一份副本,对吗?)。 在本节中:
第6.4节LED-第18页
手册上说:
LD3
,北面的LED,连接到引脚PE9
。PE9
是端口E上的引脚9的缩写。LD7
, 东面的LED,连接到引脚PE11
。
到目前为止,我们知道我们想要改变引脚PE9和PE11的状态以打开/关闭 北/东LED。
这些引脚是端口E的一部分,因此我们必须处理GPIOE
外围设备。
每个外围设备都有一个与其相关的寄存器块。寄存器块是在连续存储器中分配的寄存器的集合。
寄存器块开始的地址称为其基址。我们需要弄清楚GPIOE
外设的基址是什么。该信息在微控制器参考手册以下章节中:
第3.2.2节内存映射和寄存器边界地址-第51页
该表显示GPIOE
寄存器块的基址为0x4800_1000
。
每个外围设备在文档中也有自己的部分。这些部分中的每一个都以外围设备寄存器块包含的寄存器表结尾。
对于GPIO
系列外设,该表位于:
第11.4.12节GPIO寄存器映射-第243页
'BSRR'是我们将用于设置/重置的寄存器。其偏移值为'GPIOE'基址的'0x18'。 我们可以在参考手册中查找BSRR。GPIO 寄存器 -> GPIO 端口位 设置/重置 寄存器 (GPIOx_BSRR)。
现在我们需要跳转到特定寄存器的文档。上面有几页:
第11.4.7节GPIO端口位设置/复位寄存器(GPIOx_BSRR)-第240页
最后!
这是我们写的注册表。文档中有一些有趣的内容。首先,这个寄存器是只读的...
所以让我们尝试读取它的值:-)
。
我们将使用GDB's 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
设置为 high。这将打开北面的LED。 -
将
1 << 11
(BS11 = 1
) 写入BSRR
将PE11
设置为 high。这将打开东面的LED。 -
将
1 << 25
(BR9 = 1
) 写入BSRR
将PE9
设置为 low。这将关闭北面的LED。 -
最后,将
1 << 27
(BR11 = 1
) 写入BSRR
将PE11
设置为 low。这将关闭东面的LED。