手写bootloader(手写*_*)

╄→尐↘猪︶ㄣ 提交于 2019-12-04 14:01:11

思路
1.关看门狗
2.设置时钟
3.初始化sdram
4.重定位
5.执行main
.text 表示代码段
.global _start (global 表示全局标号)

关看门狗
可以调c完成disable_watch_dag 确定看门狗地址0x....
ldr r0 ,=0x... ldr 违汇编指令
mov r1,#0
str r1, [r0]
设置时钟 可以用 c clock_init()
CLKDIVN 定义位置board中
ldr r0, =0x4c00001
mov r1, #0x03 0x03 分频系数 //FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
str r1,[r0] asm 如果是c,它是标志嵌入汇编 读芯片手册,调整异步模式,根据芯片具体情况
mrc 指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断
MCR{} p15, 0, , , {,}
为协处理器将执行的操作的操作码。对于CP15协处理器来说, 永远为0b000,当不为0b000时,该指令操作结果不可预知
作为元寄存器的ARM寄存器,其值被传<
Rd>不能为PC,当其为PC时,指令操作结果不可预知送到得协处理器寄存器中
作为目标寄存器的协处理器寄存器,其编号可能为C0,C1....C15。 附加的目标寄存器或者原操作数寄存器,用于区分同一个编号的不同物理寄存器。当指令中不需要提供附加信息时,将C0指定为,否则指令操作结果不可预知。 提供附加信息,用于区别同一个编号的不同物理寄存器。当指令中指定附加信息时,省略或者将其指定为0,否则指令操作结果不可预知
orr ORR指令的格式为: ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR指令用于在两个操作数上进行逻辑戒运算,并把结果放置到目的寄存器中
操作数1应该是一 个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。
该指令常用于设置操 作数1的某些位。

MRC指令将协处理器的寄存器中数值传送到ARM处理器的寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断

指令示例: ORR R0,R0,#3 ;
该指令设置R0的0、1位,其余位保持不变。
orr r0,r0,#0xd3
0xd3=1101 0111
将r0与0xd3作算数或运算,然后将结果返还给r0,即把r0的bit[7:6]和bit[4]和bit[2:0]置为1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!