C语言实现时钟设置代码详解

《朱老师物联网大讲堂》学习笔记

学习地址:www.zhulaoshi.org


上一节的代码已经完成了对时钟的基本初始化,

这一节,是对代码的写法进行升级。


也算是个总结吧:把以前写过的,再写一次。


1.同一模块中寄存器是连续的,所以可以采用基址+偏移量的方式来实现对某个寄存器的访问

这个就是基地址

#define ELFIN_CLOCK_POWER_BASE 0xE0100000

这些就是偏移量

#define CLK_SRC0_OFFSET 0x200
#define CLK_SRC1_OFFSET 0x204
#define CLK_SRC2_OFFSET 0x208

把基地址存入某个寄存器,使用下面这种方式来访问,

ldr r0, =ELFIN_CLOCK_POWER_BASE
ldr r1, =0x0
str r1, [r0, #CLK_SRC0_OFFSET]


在此基础上,进一步进化,得到这样的代码,这句话得到的本质还是一个地址值。

#define REG_CLK_SRC0 (ELFIN_CLOCK_POWER_BASE + CLK_SRC0_OFFSET)


在经过这样,

#define rREG_CLK_SRC0 (*(volatile unsigned int *)REG_CLK_SRC0)

对这句话,我想再啰嗦几句,volatile是为了怕编译器优化,从而改变寄存器的值,使得结果的输出和我们预想的不一样,

unsigned是因为,地址本来就不可能为负数,所以还可以增加地址方位空间,

int * 代表这个地址指向的是一个int型数据类型,而地址的格式本来就是整数,

这个用法C高级中见过,脑袋中不是糊的,但是还有2选1的疑惑,

最左边的那个*,就是在访问这个地址所存储的值,所以下面可以直接对其访问并修改它上面的值。


就可以对其进行直接赋值了,

rREG_CLK_SRC0 = 0x0;


因为使用的是C语言的函数,所以就不用我么去手动像这样返回了,

mov pc,lr


经过升级,代码确实看的舒服多了。

你可能感兴趣的:(ARM裸机)