历史上的今天
今天是:2025年02月20日(星期四)
2021年02月20日 | 基于S3C6410的ARM11学习(八) 核心初始化之设置外设基地址
2021-02-20 来源:eefocus
下面就是核心初始化的最后一个了。外设基地址初始化。这个操作是告诉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
就没有上述操作了,因为外设的地址已经固定了。所以就不用写代码了。
史海拾趣
|
RELEASETYPE is not set. Using default settings. 今天编译CE5.0内核遇到这么个警告: RELEASETYPE is not set. Using default settings. 结果导致编译出错,而用同样的BSP在我同事的机子上却没事,所以我怀疑是PB出了问题,哪位大侠给指点一下… 查看全部问答> |
|
程序实现功能如下: 通过clk的脉冲,在recive=0时统计clk的跳变数,达到计时的目的,再把时间通过4个七段数码管显示出来。 程序代码如下: library ieee; use ieee.std_logic_1164.all; entity device is port(clk   ...… 查看全部问答> |
|
今天兴高采烈的在调 PWM程序 弄示波器探头接触引脚的时候 貌似出现了点火花 我也没太在意 出现了波形 可是频率差了点 于是乎准备重新载程序 突然就出现了 我想估计芯片毁了… 查看全部问答> |
|
请教各位: 在BIOS中,我用TSK0调用函数test(),硬件中断INT1调用T0ISR().运行程序后,程序一直进入T0ISR(),而不调用\\"任务\\"对象.不应该是在两次中断之间的时间里,会调用TSK0吗?或者是需要什么API函数调用? 部分程序 ...… 查看全部问答> |




