资料来源:白文网_嵌入式Linux Wiki _ JZ 2440新一期视频Wiki教程(视频文字版)
作者:贝东山
正文字数:2403,阅读时间:2.5分钟
CPU在2440上共有16个第二个处理器,从CP0到CP15。
CP15管理缓存MMU我们要启动缓存,就必须操作CP15二级处理器指令。首先看一下硬件结构。
CP15也有很多寄存器C0 ~ C15起始C7’是备份寄存器
现在,主CPU的值R0被传递到CP15的寄存器。
我们要引入辅助处理器指令
MRC
Mov r1、r0
结果是r0=传递=R1
MRC
c coprocessor=propagate=register
Mcr是将主处理器的值发送给辅助处理器。查看register=propagate=co processor语法格式,并在2440上检索MRC。
得到语法形式
例如,Mcr | MRC {cond} p #,expression1,rd,cn,cm {,expression2}
Mcr P15、0、r1和c1将主处理器的值发送到次处理器。
如果将Expression1的值设定为0,则不可用
R1是默认CPU寄存器的值
C1是cp15寄存器的值
Cm,不需要,写为c0
如果将Expression2值设定为0,则不可用
Cm和expression2用于区分哪个C1,通常写为c0,0。此命令表示主CPU的R1值将写入辅助处理器cp15的cp1寄存器中。
相反,应该从cp15寄存器读取主CPU寄存器。
Mrc p15、0、r1、c1、c0、0此命令指示第二处理器cp15 C1寄存器的值将读取写入主CPU的R1寄存器
2410文档中有cp15寄存器的作用
其中寄存器1控制寄存器下图说明了控制寄存器1的功能
Bit12位控制cache命令的打开或关闭。我将bit 12设置为1
C7有多种寄存器,对应于多种功能。
寄存器7用于操作缓存,并根据语法规则cm{,expression2}区分要选择的C7
通过以下写入程序,cache将知道2440上有data cache和指令cache。其中,必须启用地址映射,才能使用data cache。只能使用指令cache
打开
Reset:
/*关闭看门狗*/
Ldr r0,=0x53000000
Ldr r1,=0
Str r1,[r0]
/* mpll设定,FCLK : HCLK : PCLK=400m : 100m : 50m */
/* locktime(0 x 4 c 000000)=0 x ffffffff */
Ldr r0,=0x4C000000
Ldr r1,=0xFFFFFFFF
Str r1,[r0]
/* clkdivn (0x4c000014)=0x5、TF clk : th clk : TPC lk=1:4:8 */
Ldr r0,=0x4C000014
Ldr r1,=0x5
Str r1,[r0]
/*设置CPU以异步模式工作*/
Mrc p15,0、r0、c1、c0,0
Orrr0、r0、# 0 xc 000000//r 1 _ nf :或:r1 _ ia
Mcr p15,0、r0、c1、c0,0
/* mpllcon设置(0x4c000004)=(9212) | (14) | (10)
* m=MDIV 8=92 8=100
* p=PDIV 2=1 2=3
* s=SDIV=1
* fclk=2 * m * fin/(p * 2s)=2 * 100 * 12/(3 * 2 1)=400m
*/
Ldr r0,=0x4C000004
Ldr r1,=(9212)|(14)|(10)
Str r1,[r0]
/*设置PLL后,锁定时间将被锁定,直到PLL输出稳定为止
*然后,CPU将在新频率FCLK上运行
*/
/*
icache
*/
Bl enable_icache
/*内存: sp堆栈设置*/
/*启用分辨率nor/nand
*请写0 ~ 0地址,然后再读一遍
*得到0后,0地址的内容被修改,与ram相对应。NAND启动
*否则,将启动nor
*/
Mov r1,#0
Ldr r0,[r1] /*读取原始值备份*/
Str r1,[r1] /* 0-[0] */
Ldr r2,[r1] /* r2=[0] */
Cmp r1、R2 /* r1==r2?相同表示法启用NAND */
Ldr sp,=0x 4000000 4096/*首先假设为nor启动*/
Moveq sp、# 4096/* NAND boot */
Streq r0,[r1] /*恢复原始值*/
Bl sdram_init
//bl使用具有初始值的数组,而不是sdram_init2 /*与位置无关的代码*/
/*重定目标文本、rodata、数据部分全部程序*/
Bl copy2sdram
/*清除BSS段*/
Bl clean_bss
/*重置后,CPU处于SVC模式
*现在切换到usr模式
*/
Mrs r0、cpsr /*读取cpsr */
将Bic r0、r0、#0xf /* M4-M0修改为0b10000以使用usr模式*/
Bic r0、r0、#(17) /*清除I位*/
Msr cpsr、r0
/* sp _ usr设置*/
Ldr sp,=0x33f00000
Ldr pc,=sdram
Sdram:
Bl uart0_init
Bl print1
/*故意添加未定义的命令*/
Und_code:
.word0xdeadc0de /*未定义的命令*/
Bl print2
SWI0x123 /*运行此命令以触发SWI异常,进入0x 8 */
//BL使用main /* bl命令进行相对跳跃,程序仍然在NOR/sram中使用*/
Ldr lr,=halt
Ldr pc、=main /*绝对跳跃、SDRAM */
哈特:
b霍尔特
怎么样才能让icache打开2410芯片手册?
Enable_icache:
/* icache */
Mrc p15、0、r0、c1、c0、0
Orrr0、r0、# (112)/* r0=r0 or (112) */
Mcr p15、0、r0、c1、c0和0//条修改后的r0被写入cp15的cp1寄存器中
Mov pc提高lr刷屏效率。
“新产品选拔”STM32MP157开发版热卖!第一批只有300套
1.《【0xc000014c】第二处理器指令_开启ICache程式码范例》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《【0xc000014c】第二处理器指令_开启ICache程式码范例》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/1956470.html