寄存器
是时候探索Led
API在幕后的作用了。
简而言之,它只是写入一些特殊的内存区域。进入07-registers
目录,让我们
逐个语句运行starter代码语句。
#![no_main] #![no_std] #[allow(unused_imports)] use aux7::{entry, iprint, iprintln}; #[entry] fn main() -> ! { aux7::init(); unsafe { // A magic address! const GPIOE_BSRR: u32 = 0x48001018; // Turn on the "North" LED (red) *(GPIOE_BSRR as *mut u32) = 1 << 9; // Turn on the "East" LED (green) *(GPIOE_BSRR as *mut u32) = 1 << 11; // Turn off the "North" LED *(GPIOE_BSRR as *mut u32) = 1 << (9 + 16); // Turn off the "East" LED *(GPIOE_BSRR as *mut u32) = 1 << (11 + 16); } loop {} }
这是什么魔法?
地址0x48001018
指向寄存器。寄存器是控制外围设备的特殊存储器区域。 外围设备是一块电子设备,位
于微控制器封装内的处理器旁边,为处理器提供额外的功能。毕竟,处理器本身只能做数学和逻辑。
该特定寄存器控制通用输入/输出(GPIO) 引脚 (GPIO是外围设备),并可用于驱动这些引脚中的每一个低或高。
旁白: LEDs, 数字输出和电压电平
驱动? 引脚? 低的? 高的?
引脚是电触点。我们的微控制器有几个,其中一些连接到LED。LED(发光二极管)仅当电压以特定极性施加到其上时才会发光。
幸运的是,微控制器的引脚连接到具有正确极性的LED。我们所要做的就是通过引脚输出一些非零电压以打开LED。 连接到LED的引脚被配置为数字输出,只能输出两个不同的电压电平:"低", 0 伏, 或 "高", 3 伏。 "高" (电压) 将点亮LED,而 "低" (电压) 将熄灭LED。
这些"低"和"高"状态直接映射到数字逻辑的概念。"低"为0
或false
和"高"为1
或true
。
这就是为什么这种引脚配置被称为数字输出。
好的。但是怎样才能知道这个寄存器的作用呢?RTRM时间到了(阅读参考手册)!