由于有了stm32f4xx.h头文件,大部分寄存器对应的地址都已预先定义好,但是有些寄存器并未完全定义,比如前面提到的几个模式寄存器,因此它们的地址要预先定义。要使用#define,将相应的地址映射给几个寄存器名称,需要掌握一些C语言编程技巧。
比如查阅表2-3,可以查到GPIOF_MODER的地址是0x4002 1400。要对这个寄存器做好地址映射,如果这样写:#define GPIOF_MODER 0x40021400,GPIOF_MODER仅仅代表了一个立即数,并不是一个地址。在C语言中要把地址引用出来,一般使用指针。指针的表达形式是在常量或者变量前面加*号。若要把0x4002 1400作为地址,首先要将它转换成指针常量的类型。C语言强制转换的指令是(unsigned int*)0x40021400,这时的0x40021400已经变为了指针类型。要将这个指针映射给GPIOF_MODER,则还要使用语句#define GPIOF_MODER*(unsigned int*)0x40021400,这样在程序中使用GPIOF_MODER,即等同于使用地址为0x40021400的寄存器。
使用上一章建立好的项目文件,在main.c文件中编写程序如下:
(www.xing528.com)
细心的读者可以发现,使用每个外设时都要去查这么多寄存器的地址,工作量会很大,实际上编程的时候,除了可赋予直接地址外,还有一种利用基地址+偏移量的间接方式,因为STM32的地址映射非常有规律,寄存器之间的间隔都是一致的,数据手册中都给出了偏移地址,所以只需使用基地址与偏移地址。尝试将#define部分写成下面的形式:
如果换了其他GPIO口,可以直接修改GPIO的基地址,而不需要再去查每个寄存器的地址,这样可省去很多时间。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。