【问题标题】:gcc-avr ATmega16/32 Programminggcc-avr ATmega16/32 编程
【发布时间】:2013-10-25 18:54:11
【问题描述】:

我刚刚开始使用 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,但它们是直接使用的。请让我知道如何知道所有预定义变量及其用法?不知道代码就很难理解代码。

提前致谢。

【问题讨论】:

    标签: gcc arduino avr-gcc


    【解决方案1】:

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

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

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

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

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

    OUTPUT1 |= (1 << PIN4);
    

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

    OUTPUT1 &= ~(1 << PIN4);
    

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

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

    【讨论】:

    • 谢谢我得到了指针。是否有任何参考文档说明了这些变量?它可以只有几页,我可以在其中简要介绍每个变量,例如编码参考手册。稍后我可以参考数据表了解其详细概念。例如:变量含义地址此外还有任何图表显示MUC的寄存器,内存组织。就像 8051 片上 RAM-8052.com/images/8051map.gif 它为我提供了特殊寄存器、通用寄存器、定时器的详细信息,并声明了寄存器变量名称
    • 这很大程度上取决于您拥有的芯片。一些 SFR(特殊功能寄存器)是大多数/所有 AVR 通用的,但有些仅限于特定型号。我建议您在 Atmel.com 上查看您正在使用的模型的文档(例如 ATmega325 或其他)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多