首先,从参考手册可知,程序存储器(flash)、数据存储器(SRAM)、寄存器(外设控制)和输入输出端口被组织在同一个4GB的线性地址空间内。 数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。可访问的存储器空间被分成8个主要块,每个块为512MB。
说白了,寄存器就是一个有着控制外设能力的存储器单元,我们要使用片上外设的功能,就需要按照规定(参考手册),向这些寄存器中写入对应的二进制数值。
而我们向这些寄存器写入数据,就需要知道它的地址,参考手中也给出了这些寄存器的地址,但是每次写都要查手册就显得太麻烦了,效率低并且容易出错,除了错也不好查。
而如果用别名来指代这些地址,就会降低编程的难度,并且可以提高程序的可读性。C语言用#define 就可以做到。而STM32的库函数其实也是这么做的:
从STM32的存储器和总线架构可知,外设寄存器都挂在AHB,APB1,APB2这三条总线上,并且在32中的寄存器都是32位的,也就是4个字节,相当于一个Int。而存储器的地址是呈线性的,通过地址偏移的方法,可将每个寄存器的地址都指代为一个名字。
还有一点也很重要,就是同一个外设的寄存器是连续的,这样我们就可以通过定义一个结构体,这个结构体包含了一块连续的内存空间,这个连续内存空间的长度正好和对应外设寄存器的长度相等,这样一来,只要将结构体首地址设置为寄存器的首地址,那么我们对结构体的赋值,就相当于对外设寄存器的赋值。我们就可以提前将设置参数写入一个专用的赋值结构体中,然后用这个结构体的成员来初始化外设寄存器。并且这一步是可以用函数来完成的,只要再函数接口上预留出接口,我们将寄存器地址和结构体地址传入,即可完成对外设寄存器的配置。这就是STM32固件库函数的构建思路。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)