You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:09:03