This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1231H6PZ:引导加载程序无限复位循环

Guru**** 2386610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/672376/tm4c1231h6pz-bootloader-endless-reset-loop

器件型号:TM4C1231H6PZ
主题中讨论的其他器件:DK-TM4C123GTM4C123

很抱歉、我被迫在这里提问、但我自己没有解决这个问题、但我一直很积极地陷入死胡同

问题是:在尝试理解手动操作并尝试使用引导加载程序示例之后、我一直无法实现无尽的复位循环。 此外、我对汇编器或通用启动算法不太满意、因此我可能完全错了。

流程图如下所示:

  • [处理器初始化] 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) 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Paul:

    您使用的是哪种编译器? 列表文件看起来与 ARM 编译器列表文件不同。 您是否有机会尝试 TivaWare 库中的 boot_serial。 您可以在中找到 TM4C123器件的引导加载程序示例 /examples/boards/dk-tm4c123g/boot_serial.

    您是否编辑 了您展示的任何#define? 如果您已编辑 了任何#define、 我建议您恢复为原始文件、并确保在您尝试根据应用需求更改它们之前一切都正常工作。

    CCS 版本中的引导加载程序示例应该起作用。 您能否尝试一下 CCS 示例、看看您是否获得了不同的结果?