基于S3C6410的ARM11学习(八) 核心初始化之设置外设基地址
1赞下面就是核心初始化的最后一个了。外设基地址初始化。这个操作是告诉CPU外设的基地址是多少。
之前,对这个很疑惑,外设的基地址对于芯片来说,不是已经固定了,还要告诉他基地址是多少干嘛了。STM32就不用这一步操作。这个时候,就要去研究这两种芯片的内核了。S3C6410用的是ARM11的核,而STM32用的是CORTEX-M3的内核。
对于cortex-m3内核,外设的地址就已经是固定了,从0x40000000开始,大小是0.5G。所以不管你是什么芯片,只要你使用了cortex-m3内核,你的外设的基地址就变不了,变的是外设地址对应的外设不一样。所以,就没有必要告诉CPU外设的基地址了,直接操作这些地址即可。CPU会自己识别这个地址是外设地址还是内存地址,从而采用不同的总线去访问。
对于ARM11.我没有在内核中找到cortex-m3内核的存储器映射的图。就可能ARM11核,就没有对外设的地址进行固定。所以,不同的芯片,即使使用的是ARM11的内核,那外设地址也有可能不一样。所以ARM11就加了一个告诉CPU外设基地址这个东西,当地址属于外设地址,CPU就使用外设总线去访问。
既然要告诉CPU外设的地址,那么肯定就是要对一个寄存器操作了。这个寄存器就在CP15下的某个寄存器。
就在c15组下的c2寄存器。
上面是对这个寄存器的说明。
ARM11将存储空间分为memory接口和peripheral接口。解释说,这个寄存器的作用是将memory属性重定向为不共享的设备。这样可以强制访问外设端口并且重写这些页表。
红色处说明,复位值,表明重定向没有发生。
对于S3C6410来说,该外设基地址是0x7000_0000。所以我们就要把这个地址写入到这个寄存器中。
写入该寄存器,手册中也有说明该汇编代码
所以,代码也很简单了。
1、 将r0寄存器的值赋值为0x7000_0000(S3C6410外设基地址)
2、 将r0寄存器中的值的后8位改为8’b00010011。对照手册,就是将外设地址空间大小是256M。
从S3C6410手册115也有说明。外设通过PERI总线访问,地址范围是0x7000_0000到0x7FFF_FFFF。大小总共是256M。所以这里要设置寄存器的后面5位为10011。即256M。
3、 将r0的值写入到Peripheral Port Memory Remap Register。
4、 程序返回
这样,就完成了外设地址的设置了。但是,这里我们要注意了,这个外设地址的设置应该要在访问外设之前设置,否则外设访问就不成功了。回想前面的核心初始化,我们对看门狗进行了关闭,看门狗也是外设的一种。因为他地址空间是在外设空间里面的。所以呢,我们要在看门狗关闭前进行外设地址的设置。
所以,最终reset中的核心初始化代码为:
其实就是调用之间说的核心初始化的各个函数。但是要注意设置外围基地址是要放在看门狗关闭之前的。
这样,就完成了核心初始化了。完成了核心初始化,就要先测试我们写的代码到底对不对了。怎么测试了?相信学过51的都知道,学51的第一个实验是什么,点亮led。所以这里就用点亮led要测试核心初始化代码到底是否正确。下次,我们就要来点灯了。
对比STM32
就没有上述操作了,因为外设的地址已经固定了。所以就不用写代码了。