基于ARM Thumb汇编的ATSAM3X8E启动文件无法进入执行代码问题求助
问题排查结果
你的代码存在两个核心错误导致配置未生效:
1. 寄存器地址加载逻辑错误
你定义的寄存器地址常量(比如WDT_MR: .word 0x400E1A54)是存储在Flash中的数值常量,你使用LDR r0, =WDT_MR的写法实际加载的是「存储这个常量的内存地址」,而不是常量本身的值(也就是你要访问的硬件寄存器地址),导致后续所有寄存器操作都访问了错误的地址,配置完全没有生效。
正确的写法有两种可选:
- 去掉等于号,直接加载常量值:
LDR r0, WDT_MR - 不用额外定义常量,直接写立即数:
LDR r0, =0x400E1A54
2. 未开启PIOB外设时钟
ATSAM3X系列所有外设访问前必须先在电源管理控制器(PMC)中开启对应时钟,否则所有寄存器操作都会被忽略。你用C语言测试时能正常运行,是因为Microchip Studio自带的启动文件默认已经开启了GPIO端口的时钟,而你自己编写的汇编代码缺少这一步。
你需要在init函数最开头添加开启PIOB时钟的逻辑:
@ 新增:开启PIOB外设时钟 LDR r0, =0x400E0410 @ PMC_PCER0寄存器地址 MOV r1, #(1 << 12) @ PIOB的外设ID为12,置位对应位开启时钟 STR r1, [r0]
可选优化建议
建议你在GPIO配置完成后,主动向PIOB_ODSR寄存器写入对应位的0值,强制拉低引脚电平,避免寄存器复位默认值带来的不确定影响:
@ 新增:强制输出低电平 LDR r0, =PIOB_ODSR MOV r1, #0 STR r1, [r0]
你的链接脚本和向量表配置没有问题,Flash起始地址0x00080000是ATSAM3X8E内部Flash的正确起始地址,.thumb_func标记也会自动处理复位向量的Thumb模式最低位标识,不需要修改。
内容的提问来源于stack exchange,提问作者DashNode
相关产品推荐
相关产品推荐

