[原创] 引导存放在spi flash中的程序--Part1
857 查看
11 回复
 楼主 | 发布于 2018-09-19 | 只看楼主
分享到:

之前挖的坑 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指令用于跳转到被引导程序的复位向量的位置上。


本帖有更多资源,需 登录 才可以下载,没有帐号?立即 注册

(0 ) (0 )
回复 举报

回复于 2018-09-19 沙发

多谢分享!!!!
(0 )
评论 (0) 举报

回复于 2018-09-20 2#

支持下,谢谢分享~
(0 )
评论 (0) 举报

回复于 2018-09-20 3#

感谢分享
(0 )
评论 (0) 举报

回复于 2018-09-20 4#

不错,感谢分享
(0 )
评论 (0) 举报

回复于 2018-09-21 5#

干些分析
(0 )
评论 (0) 举报

回复于 2018-09-23 6#

谢谢分享!!!!
(0 )
评论 (0) 举报

回复于 2018-11-30 7#

感谢分享,有需要机械臂,机器人,电源的小伙伴可以联系我哦!相互学习,共同进步!
(0 )
评论 (0) 举报

回复于 2019-02-09 8#

谢谢分享
(0 )
评论 (0) 举报

回复于 2020-02-05 9#

感谢分享
(0 )
评论 (0) 举报

回复于 2020-03-05 10#

(0 )
评论 (0) 举报
发表回复
0/3000





举报

请选择举报类别

  • 广告垃圾
  • 违规内容
  • 恶意灌水
  • 重复发帖

全部板块

返回顶部