之前在STM32CubeMx+HAL笔记(一)里讲过开发流程,在开发过程中最重要的便是程序编写,有两种编程方式:寄存器编程,库函数编程。
一、什么是寄存器
简单来说,寄存器就是器件地址,之前有提过,STM32单片机其实是ST公司购买ARM公司的内核,在内核的基础上增加各种外设元件的一类器件。寄存器就是这些外设元件的地址,在参考手册中我们可以查阅对应芯片型号的所有外设的地址,知道外设地址后就可以对外设进行操作,完成各种功能。
二、如何操作寄存器(寄存器编程)
首先通过查阅参考手册可以知道对应器件的地址,知道地址后就可以对其进行操作。
//定义地址指针
//方式一:定义变量
volatile unsigned int * pointer = (unsigned int *)0x40028000;
//方式二:宏定义
#define pointer (volatile unsigned int *)0x40028000
volatile:关键字,防止编译器优化该变量。比如,
unsigned int *pointer = (unsigned int *)0x40028000;
*pointer += 1;
*pointer += 2;
此段代码的本意假设是先实现外设的某一功能,再实现外设的另一功能;但是如果不加volatile关键字编译器会将其优化为*pointer += 3;而这实现的又是外设的其他功能了,与我们的初衷相悖,所以对寄存器(地址)的变量进行定义时一定要加关键字volatile。
在上面代码中,方式二采用宏定义的方式比方式一更好,定义变量会占据很多内存,而宏定义只是文本的复制,并不占用内存。