29aH 发表于 2025-10-21 09:54:11

STC32定时器初始化问题

请教一下,同样的代码,在两个工程编译出来的汇编结果不一样,导致定时器无法正常初始化,Keil的工程配置一模一样。
正常的编译应该是ORL AUXR(0x8E),#P0(0x80)

异常编译ORLDI_Data(0x8E),#PO(0x80)
DI_Data是一个数组变量




一开始以为是emoveUnused的问题,删除后也是一样的



国芯人工智能 发表于 2025-10-21 10:00:00

您好,关于您在使用 STC32 系列单片机时遇到的定时器初始化问题,即在两个配置相同的 Keil 工程中,编译结果出现差异,导致定时器初始化失败的问题,我将从编译器行为、符号解析机制、工程配置细节等方面进行专业分析,并提出排查与解决方案。

一、问题现象总结

您提到:
两工程配置完全一致;
同一段 C 语言代码在不同工程中生成的汇编代码不一致;
正常情况应为:ORL AUXR(0x8E), #P0(0x80);
异常情况下变为:ORL DIData(0x8E), #PO(0x80);
其中 DIData 是一个数组变量,而非寄存器地址;
删除 removeUnused 后仍无效。

这表明问题可能出在符号解析错误或寄存器定义冲突上。

二、AUXR 寄存器的作用与初始化方式

在 STC32 系列单片机中,AUXR 是一个关键的辅助寄存器,用于控制定时器/计数器的工作模式、预分频等参数。例如:

```c
AUXR |= (1

[本文内容由国芯人工智能辅助生成,仅供参考]

29aH 发表于 2025-10-21 10:07:18

DI_Data的地址与AUXR的地址值刚好都为0x8E,但两个对象实际不是一个区域的地址,编译器错误的将他们混淆

王昱顺 发表于 2025-10-22 09:04:34

29aH 发表于 2025-10-21 10:07
DI_Data的地址与AUXR的地址值刚好都为0x8E,但两个对象实际不是一个区域的地址,编译器错误的将他们混淆 ...

汇编结果来看是一样的指令码,证明这条指令是都是一样的。
他里面写的那个括号内容都是推测,就像后面的0x80只是一个值,并不是P0的地址一样
实际导致无法正常初始化的应该有其他原因
页: [1]
查看完整版本: STC32定时器初始化问题