weiqi7777

基于S3C6410的ARM11学习(八) 核心初始化之设置外设基地址

1
阅读(3705)


    下面就是核心初始化的最后一个了。外设基地址初始化。这个操作是告诉CPU外设的基地址是多少。

    之前,对这个很疑惑,外设的基地址对于芯片来说,不是已经固定了,还要告诉他基地址是多少干嘛了。STM32就不用这一步操作。这个时候,就要去研究这两种芯片的内核了。S3C6410用的是ARM11的核,而STM32用的是CORTEX-M3的内核。

         clip_image002

对于cortex-m3内核,外设的地址就已经是固定了,从0x40000000开始,大小是0.5G。所以不管你是什么芯片,只要你使用了cortex-m3内核,你的外设的基地址就变不了,变的是外设地址对应的外设不一样。所以,就没有必要告诉CPU外设的基地址了,直接操作这些地址即可。CPU会自己识别这个地址是外设地址还是内存地址,从而采用不同的总线去访问。

 

对于ARM11.我没有在内核中找到cortex-m3内核的存储器映射的图。就可能ARM11核,就没有对外设的地址进行固定。所以,不同的芯片,即使使用的是ARM11的内核,那外设地址也有可能不一样。所以ARM11就加了一个告诉CPU外设基地址这个东西,当地址属于外设地址,CPU就使用外设总线去访问。

 

既然要告诉CPU外设的地址,那么肯定就是要对一个寄存器操作了。这个寄存器就在CP15下的某个寄存器。

clip_image004

就在c15组下的c2寄存器。

clip_image006

上面是对这个寄存器的说明。

ARM11将存储空间分为memory接口和peripheral接口。解释说,这个寄存器的作用是将memory属性重定向为不共享的设备。这样可以强制访问外设端口并且重写这些页表。

 

clip_image008

clip_image010

红色处说明,复位值,表明重定向没有发生。

对于S3C6410来说,该外设基地址是0x7000_0000。所以我们就要把这个地址写入到这个寄存器中。

 

写入该寄存器,手册中也有说明该汇编代码

clip_image012

 

所以,代码也很简单了。

clip_image014

1、  r0寄存器的值赋值为0x7000_0000S3C6410外设基地址)

2、  r0寄存器中的值的后8位改为8’b00010011。对照手册,就是将外设地址空间大小是256M

clip_image016

         S3C6410手册115也有说明。外设通过PERI总线访问,地址范围是0x7000_00000x7FFF_FFFF。大小总共是256M。所以这里要设置寄存器的后面5位为10011。即256M

3、 r0的值写入到Peripheral Port Memory Remap Register

4、  程序返回

 

这样,就完成了外设地址的设置了。但是,这里我们要注意了,这个外设地址的设置应该要在访问外设之前设置,否则外设访问就不成功了。回想前面的核心初始化,我们对看门狗进行了关闭,看门狗也是外设的一种。因为他地址空间是在外设空间里面的。所以呢,我们要在看门狗关闭前进行外设地址的设置。

所以,最终reset中的核心初始化代码为:

clip_image018

其实就是调用之间说的核心初始化的各个函数。但是要注意设置外围基地址是要放在看门狗关闭之前的。

 

这样,就完成了核心初始化了。完成了核心初始化,就要先测试我们写的代码到底对不对了。怎么测试了?相信学过51的都知道,学51的第一个实验是什么,点亮led。所以这里就用点亮led要测试核心初始化代码到底是否正确。下次,我们就要来点灯了。


对比STM32

      就没有上述操作了,因为外设的地址已经固定了。所以就不用写代码了。