请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TM4C1231H6PZ 主题中讨论的其他器件:DK-TM4C123G、 TM4C123
很抱歉、我被迫在这里提问、但我自己没有解决这个问题、但我一直很积极地陷入死胡同
问题是:在尝试理解手动操作并尝试使用引导加载程序示例之后、我一直无法实现无尽的复位循环。 此外、我对汇编器或通用启动算法不太满意、因此我可能完全错了。
流程图如下所示:
- [处理器初始化] 0x44
- [复制循环] 0x4E
- [零循环] 0x5E
- [分支回复位] 0x76
- [应该是:配置器件] 0x8C
- [程序计数器到 SRAM] 0x90
- [返回到0x34 IntDefaultHandler]
由于某种原因、程序计数器不会设置正确的"在 SRAM 中复位处理程序"地址 (应为0x2000 0000) 、程序会持续运行和运行、从0x34到0x44 (处理器初始化)再到0x90 (这会反复失败)。 计划代码将发布在下面。
链接器脚本
闪存0x000000000x00008000 { RESET0x000000000x00008000 { *。o (RESET、+First) *(InRoot$SECTIONS);所有段 ;*(InRoot$SECTIONS、+RO);所有段 } SRAM 0x20000000 0x00004000 { *(+RO、+RW、+Zi) } }
启动配置
#defineCRYSTICL_FREQ16000000 #defineAPP_START_ADDRESS0x00004000 #defineVTABLE _START_ADDRP_START_ADDRESS #defineFLASH_PAGE_SIZE0x00000400 #defineFLASH_RSVD_SPACE0x00001000 #defineSTACK_SIZE0x0100 #definebuffer_SIZE32
启动.S
113 00000000 第8行 "BL_STARTUP_TM4C123.s" 17 00000000 E000ED08 NVIC_vtable equ 0xe000ed08 20 00000000 ;将汇编器置于正确的配置中。 22 00000000 Thumb 23 00000000 要求8 24 00000000 防腐剂8 25 00000000 26 00000000 ;堆栈被放置在零初始化段中。 27 00000000 面积 ||。bss||、noinit、align=2 29 00000000 ;为堆栈分配存储空间。 30 00000000 PullStack 31 00000000 空间 0x0100 * 4 33 00000400 ;文件的这一部分进入复位部分。 34 00000400 面积 复位、代码、只读、align = 3 36 00000000 ;******** 37 00000000 ; Cortex-M3处理器的最小矢量表。 38 00000000 ;******** 39 00000000 导出 __Vectors 40 00000000 __Vectors 41 00000000 00000400 DCD PullStack +(4*0x0100);偏移00:初始堆栈指针 42 00000004 00000000 DCD RESET_Handler;偏移量04:复位处理程序 43 00000008 00000000 DCD NmiSR ;偏移08: NMI 处理程序 440000000C 00000000 DCD FaultISR;偏移0C:硬件故障处理程序 45 00000010 00000000 DCD IntDefaultHandler;偏移量10:MPU 故障处理程序 4600000014 00000000 DCD IntDefaultHandler;偏移量14:总线故障处理程序 47 00000018 00000000 DCD IntDefaultHandler;偏移量18:用法故障处理程序 48 0000001C 00000000 DCD 0 ;偏移1C:保留 49 00000020 00000000 DCD 0 ;偏移20:保留 50 00000024 00000000 DCD 0 ;偏移24:保留 51 00000028 00000000 DCD 0 ;偏移28:保留 52 0000002C 00000000 DCD UpdateHandler;偏移量2C:SVCall 处理程序 53 00000030 00000000 DCD IntDefaultHandler;偏移量30:调试监视器处理程序 54 00000034 00000000 DCD 0 ;偏移34:保留 120 00000044 ;将代码映像从闪存复制到 SRAM。 121 00000044 导出 ProcessorInit 122 00000044 ProcessorInit 123 00000044 2000 MOV R0、#0x0000 124 00000046 2100 MOV R1、#0x0000 125 00000048 F2C2 0100 移动 R1、#0x2000 126 0000004C 导入 |Image$SRAM$ZI$$$Base|| 127 0000004C 4A17 LDR R2、=||Image$SRAM$ZY$$Base|| 128 0000004E COPY_LOOP 129 0000004E F850 3B04 LDR R3、[r0]、#4 130 00000052 F841 3B04 结构 R3、[R1]、#4 131 00000056 4291 CMP R1、R2 132 00000058 DBF9 BLT copy_loop 133 0000005A 134 0000005A ;零填充.bss 段。 135 0000005A 2000 MOV R0、#0x0000 136 0000005C 导入 |Image$SRAM$ZI$$LIMIT || 137 0000005C 4A14 LDR R2、=||Image$SRAM$Z$$LIMIT || 138 0000005E zero_loop 139 0000005E F841 0B04 结构 R0、[R1]、#4 140 00000062 4291 CMP R1、R2 141 00000064 DBFB BLT zero_loop 142 00000066 143 00000066 ;将矢量表指针设置为 SRAM 的开头。 144 00000066 F64E 5008 模 R0、#(NVIC_VTABLE & 0xFFFF) 145 0000006A F2CE 0000 移动 R0、#(NVIC_vtable >> 16) 146 0000006E 2100 MOV R1、#0x0000 147 00000070 F2C2 0100 移动 R1、#0x2000 148 00000074 6001 结构 R1、[r0] 149 00000076 150 00000076 ;返回给呼叫者。 151 00000076 4770 BX LR 152 00000078 153 00000078 ;******** 154 00000078 ;复位处理程序,在处理器启动时调用。 155 00000078 ;******** 156 00000078 导出 RESET_Handler 157 00000078 RESET_Handler 158 00000078 159 00000078 ;启用浮点单元。 160 00000078 F64E 5088 模 R0、#0xED88 161 0000007C F2CE 0000 移动 R0、#0xE000 162 00000080 6801 LDR R1、[r0] 163 00000082 F441 0170 OR R1、#0x00F00000 164 00000086 6001 结构 R1、[r0] 165 00000088 166 00000088 ;初始化处理器。 167 00000088 F7FF FFFE BL ProcessorInit 168 0000008C 169 0000008C 导入 配置设备 170 0000008C F7FF FFFE BL 配置设备 171 00000090 172 00000090 ;分支到复位处理程序的 SRAM 副本。 173 00000090 F8DF F020 LDR PC、=(Reset_Handler_in_SRAM)