【问题标题】:Reading & comparing 10-bit register in 32-bit architecture在 32 位架构中读取和比较 10 位寄存器
【发布时间】:2011-11-08 13:56:14
【问题描述】:

我目前在基于 32 位 ARM9 的微控制器内对 10 位 ADC 进行 C 编程。这个 10 位 ADC 将数字化模拟值保存在 名为“ADC_DATA_REG” 的 10 位寄存器中,该寄存器使用位 9-0 (LSB)。我必须读取该寄存器的值并将其与一个名为“CONST”的32 位常量 进行比较。我的尝试看起来像这样,但它不起作用。我在这里想念什么?我应该使用移位操作吗?这是我第一次处理这个问题,所以欢迎任何例子。

以下代码已针对评论和 anwsers 进行了编辑,但仍然无法正常工作。我还添加了一个 while 语句,用于在读取 ADC_DATA_REG 之前检查 ADC_INT_STATUS 标志是否被提升。提到的标志表示一个中断,一旦 ADC 完成转换并且数据准备好从 ADC_DATA_REG 读取,该中断就挂起。事实证明,即使将寄存器 ADC_DATA_REG 的值分配给它,数据仍然为 0,这就是我的 LED 始终亮着的原因。这也意味着我有一个中断,ADC_DATA_REG中应该有数据,但似乎没有......

#define CONST 0x1FF
unsigned int data = 0;

while (!(ADC_INT_STATUS_REG & ADC_INT_STATUS))
data = ADC_DATA_REG; 

if ((data & 0x3FF)> CONST){ 
   //code to turn off the LED 
} 
else{ 
   //code to turn on the LED 
}

【问题讨论】:

  • 屏蔽值位:if ((data & 0x3ff) > CONST) {}
  • “不工作”到底如何?您是否收到编译错误、运行时错误或错误结果?
  • 我确实编辑了上面的代码,并实现了你给我的所有建议,但我的数据始终保持为 0,即使我旋转电位器,我的 LED 也一直亮着。
  • 看起来您缺少;,因此在读取数据之前,while 会在标志上循环。

标签: c arm


【解决方案1】:

您没有写 ADC_DATA_REG 如何获取 10 位值。但我认为它只是对某个 IO 地址的读取。在这种情况下,从地址读取返回 32 位。在您的情况下,只有较低的 10 个是有效的(或有趣的)。其他 22 位可以是任何东西(例如状态位、垃圾等),因此在继续处理数据之前,您应该将前 22 位归零。

如果 10 位值是有符号的,您还应该执行符号扩展并更正您的数据类型(我知道端口 IO 是无符号的,但可能 adc 返回的 10 位值不是)。那么你的比较应该有效。

【讨论】:

  • 我现在确实用 0 初始化了数据,并且我也屏蔽了这些位,但问题仍然存在。
  • 另外,如果 ADC_DATA_REG(或其他两个 regs)是#define'd 类似 (*(unsigned*)memory_address_of_ADC_DATA_REG),则可能需要 volatile:(*(volatile unsigned*)memory_address_of_ADC_DATA_REG) .然后地址可能是错误的,读取/写入数据的逻辑可能是错误的,ADC 可能没有正确配置/初始化......在不了解系统的情况下很难判断到底是什么/可能是错误的。
  • 我确实在单独的 .h 文件中将其定义为 #define ADC_DATA_REG (*((volatile unsigned int *) 0x13002008)) 但这是一个很好的评论 TY。
  • +1 @Alex,好评。另一件事可能是字节顺序。 Host 和 Device 对字节顺序的理解可能不同,而 10 lsb 可能在你意想不到的地方。
猜你喜欢
  • 2012-04-11
  • 2016-01-18
  • 2022-07-18
  • 2012-10-24
  • 2014-11-18
  • 2022-01-04
  • 2020-11-21
  • 1970-01-01
相关资源
最近更新 更多