2

我刚刚使用 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,但它们是直接使用的。请让我知道如何知道所有预定义变量及其用法?在不知道相同代码的情况下理解代码变得非常困难。

提前致谢。

4

1 回答 1

2

这种代码在嵌入式系统编程时非常常见,尽管您需要查看头文件和 AVR 文档以了解这些特定标识符的含义。请注意,如果您是新手,它可能会非常复杂,您需要了解如何使用原始二进制和 C 风格的位移/运算符。(如果您需要了解更多相关信息,网上有很多教程。)

不过,我将尝试解释基本原理。

您看到的所有标识符都是预处理器常量(即#define ...),而不是变量。DDRD并将TCCR2指定内存位置。这些位置将映射到某些功能,因此在这些位置设置或清除某些位将改变设备的行为(例如启用时钟分频器,或将 GPIO 引脚设置为高或低等)。

PD7, WGM21, WGM20, COM20, 和CS20都是相当小的数字。它们指定您需要将某些位模式偏移多远才能获得某些结果。按位运算符(例如|&)和位移运算符(通常<<)用于创建写入内存位置的模式。该文档将告诉您要使用哪些模式。

我将使用一个简单的虚构示例来说明这一点。假设有一个寄存器控制一些输出引脚的值。我们将调用寄存器 OUTPUT1。通常,每个位将对应于特定引脚的值。打开引脚 4(但不理会其他引脚)可能如下所示:

OUTPUT1 |= (1 << PIN4);

这个按位或是现有寄存器与打开引脚 4 的模式。再次关闭该引脚可能如下所示:

OUTPUT1 &= ~(1 << PIN4);

这个按位与是现有寄存器,除了打开引脚 4 的模式(这导致清除该位)之外的所有内容。虽然这是一个完全虚构的例子,所以不要实际尝试!

对于许多不同的系统,原理基本相同,所以一旦你在 AVR 上学会了它,你也希望能够适应其他设备。

于 2013-10-25T10:54:11.543 回答