我刚刚进入使用gcc-avr的AVR MCU编程,但是当我看到示例程序时,我无法从代码中看出什么:
DDRD |= (1 << PD7);
TCCR2 = (1 << WGM21) | (0 << WGM20);
TCCR2 |= (1 << COM20);
TCCR2 |= (6 << CS20);我也没有看到任何声明变量: DDRD、PD7、TCCR2、WGM21、WGM20、COM20、CS20,但它们都是直接使用的。请告诉我如何知道所有预定义的变量及其用法?在不了解代码的情况下,理解代码变得非常困难。
提前谢谢。
发布于 2013-10-25 10:54:11
这种代码在嵌入式系统编程时非常常见,尽管您需要查看头文件和AVR文档来了解这些特定标识符的含义。请注意,如果您是新手,它可能非常复杂,并且您需要了解如何使用原始二进制和C风格的位移位/运算符。(如果你需要了解更多关于这方面的知识,网上有很多教程。)
我试着解释一下基本原理。
您看到的所有标识符都是预处理常量(即#define ...),而不是变量。DDRD和TCCR2将指定内存位置。这些位置将映射到某些功能上,以便在这些位置设置或清除某些位将改变设备的行为(例如启用时钟分配器,或设置GPIO引脚高或低等)。
PD7、WGM21、WGM20、COM20和CS20都是相当小的数字。它们指定您需要在多大程度上偏移某些位模式才能获得某些结果。按位操作(如|和&)和位移位运算符(通常是<<)用于创建写入内存位置的模式。文档将告诉您使用什么模式。
我将使用一个简单的虚构例子来说明这一点。假设有一个寄存器控制某些输出引脚的值。我们将呼叫寄存器OUTPUT1。通常,每个位将对应于一个特定引脚的值。打开引脚4(但不要使用其他引脚)可能如下所示:
OUTPUT1 |= (1 << PIN4);这个按位或是现有的寄存器与模式打开引脚4。再一次关掉那个别针,看起来可能是这样的:
OUTPUT1 &= ~(1 << PIN4);这个按位排列的寄存器是现有的寄存器,除了打开引脚4的模式(结果是清除位)。这是一个完全虚构的例子,所以不要真的尝试它!
这个原理对于许多不同的系统基本上是一样的,所以一旦你在AVR上学习了它,你也有希望适应其他的设备。
https://stackoverflow.com/questions/19587203
复制相似问题