之前挖的坑 http://club.digiic.com/Forum/PostDetail/p-6393.html
今天开始填
涉及到两个程序
1、放在User Flash第一页的小程序,负责从SPI FLASH中读取数据到SRAM并启动这个程序
2、放在SPI FLASH里面被引导的程序
以下分析程序1的实现方法,完整的程序在附件中
;初始化SPI硬件
BL SPI_Init
;使能SPI FLASH
BL FLASH_ENABLE
;读命令
MOV R8, #0x03
BL SPI_RW
;读地址
MOV R8, #0x00
BL SPI_RW
MOV R8, #0x00
BL SPI_RW
MOV R8, #0x01
BL SPI_RW
;设置加载地址
LDR R10,=0x20000000
;设置循环次数
MOV R9,#0x3000
MOVT R9,#0x0000
;开始读取
READ_1
MOV R8, #0xFF
BL SPI_RW
STRB R8, [R10]
ADD.W R10,#1
SUBS R9,R9,#1
BNE READ_1
;读取完成 关闭SPI FLASH使能
BL FLASH_DISABLE
;开始引导
;设置R0寄存器 0x2000 0000 用于做RAM指针
MOV R0,#0x0000
MOVT R0,#0x2000
;清R1 R2寄存器
MOVW R1,#0
MOVW R2,#0
;读取0x2000 0000这个位置的字内存 这里放的是MSP的值
LDR R1,[R0]
;用MSR指令修改MSP寄存器 其他指令无法直接修改MSP寄存器的值
MSR MSP,R1
;R0+4 往后挪32bit 这个位置存放的是复位执行地址
ADD.W R0,#4
;拿到复位地址到R2
LDR R2,[R0]
;跳转到复位地址 引导完成
BX R2
;封死
B .
ENDP
需要解释的地方
LDR R10,=0x20000000 和 MOV R9,#0x3000
这两条指令指定了从SPI FLASH中读取的程序存放的起始地址和长度,这两个值在后面写被引导的程序时,链接地址要根据这俩值进行调整。
引导过程关键指令 MSR 和 BX
由于MSP这个寄存器是特殊寄存器,只能用MSR指令进行修改,这里用于初始化MSP值。
BX指令用于跳转到被引导程序的复位向量的位置上。


块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖