首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gcc-avr ATmega16 16/32编程

gcc-avr ATmega16 16/32编程
EN

Stack Overflow用户
提问于 2013-10-25 10:21:50
回答 1查看 265关注 0票数 2

我刚刚进入使用gcc-avr的AVR MCU编程,但是当我看到示例程序时,我无法从代码中看出什么:

代码语言:javascript
运行
复制
DDRD |= (1 << PD7);
TCCR2 = (1 << WGM21) | (0 << WGM20);
TCCR2 |= (1 << COM20);
TCCR2 |= (6 << CS20);

我也没有看到任何声明变量: DDRD、PD7、TCCR2、WGM21、WGM20、COM20、CS20,但它们都是直接使用的。请告诉我如何知道所有预定义的变量及其用法?在不了解代码的情况下,理解代码变得非常困难。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-25 10:54:11

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

我试着解释一下基本原理。

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

PD7WGM21WGM20COM20CS20都是相当小的数字。它们指定您需要在多大程度上偏移某些位模式才能获得某些结果。按位操作(如|&)和位移位运算符(通常是<<)用于创建写入内存位置的模式。文档将告诉您使用什么模式。

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

代码语言:javascript
运行
复制
OUTPUT1 |= (1 << PIN4);

这个按位或是现有的寄存器与模式打开引脚4。再一次关掉那个别针,看起来可能是这样的:

代码语言:javascript
运行
复制
OUTPUT1 &= ~(1 << PIN4);

这个按位排列的寄存器是现有的寄存器,除了打开引脚4的模式(结果是清除位)。这是一个完全虚构的例子,所以不要真的尝试它!

这个原理对于许多不同的系统基本上是一样的,所以一旦你在AVR上学习了它,你也有希望适应其他的设备。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19587203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档