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

这篇博客是朱老师物联网大讲堂的学习笔记,讲述了如何使用C语言通过基地址和偏移量访问寄存器来设置时钟。文中详细解析了代码升级的过程,包括定义基地址和偏移量,以及如何通过 volatile 和指针访问并修改寄存器的值,以实现时钟设置。
摘要由CSDN通过智能技术生成

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

学习地址: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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值