您现在的位置:首页 > 技术资料 | ![]() |
AVR单片机GCC编程
![]() 摘要: Atmel公司的AVR 8位RISC单片机是一种非常普通的单片机.它是一个具有电擦写可编程只读存储器(EEPROM),随机访问存储器(RAM),模数转换器,大量的输入和输出线路,计时器,RS-232通讯接口UART以及其他很多功能的单片集成电路.
软件安装:哪些是你所需要的采用GNU C语言开发环境你需要下列软件:
mkdir /usr/local/atmel 软件安装:GNU binutils这个binutils软件包提供建立目标文件所需要的所有低级工具.它包括一个AVR汇编器(avr-as),连接器(avr-ld),库处理工具(avr-ranlib,avr-ar),生成可载入单片机EEPROM目标文件的程序(avr-objcopy),反汇编器(avr-objdump)和象avr-strip和avr-size这类的工具软件.运行下列命令编译安装binutils: bunzip2 -c binutils-2.11.2.tar.bz2 tar xvf - 软件安装:AVR GCC编译器avr-gcc将是我们的C语言编译器.运行下列命令编译安装这个编译器: tar zxvf gcc-core-3.0.3.tar.gz 软件安装:AVR C语言库这个C语言库仍在开发中.安装过程可能版本与版本之间有些细微的差别.如果你想照着本文一步一步做的话我推荐采用上表列出的版本.上表中的软件我已经做过测试了,本文中我们所写的程序和后面的文章中的程序都在上面这个版本上工作得很好.设置一些环境变量(bash语法): 软件安装:编程器这个编程器将指定的准备好的目标代码载入到我们单片机的EEPROM中.这个Linux下的uisp是一个非常好的编程器.可以直接用在Makefile里面.你只要添加"make load"规则,这样你就可以编译载入软件一次完成. uisp按照下面这样安装: tar zxvf uisp-20011025.tar.gz 一个小的测试工程我们将以一个小的测试电路开始.这个测试电路的目的仅仅是测试我们的开发环境.我们用它来编译,下载以及测试一个小程序.这个测试程序仅仅是引起LED闪烁.我建议给这个单片机弄一个小的印刷电路板.以后你就可以在这块电路板的区域做你自己的试验.一个好办法是用一个模拟板当作这个.你无论如何也不能尝试着把AVR和它的4MHZ晶震直接放在模拟板上.更好的办法是用少量的短线把输入和输出脚与模拟板相连,因为这样的模拟板不是为快速数字电路制作的. 4MHZ的晶震和电容器在物理上应该非常靠近单片机. ![]() 在我们这个例子里编程器的连接器电阻实际上是不必要的.只有在你打算把port-B 输入输出脚用于其他目的时才需要. 需要的硬件你需要的部件列在下表中.所有的这些都非常普通,便宜,只是单片机贵点,大概7.5欧元.尽管它是非常普通的单片机,它也不是随便在那家当地的无线电商店就能买到的,象那些大的电子部件销售商例如:(www.reichelt.de(德国),www.conrad.de(德国),www.selectronic.fr(法国)等等........,可能在你的国家这些类似的站点)的仓库里才有全部的部件.
安装编程器硬件AT90S4433支持在线编程(ISP).![]() 简单说就是:你没有必要为了给单片机编程而移动单片机模块.你会看到可以用50-150欧元买到做好的编程器硬件,但没有必要为一个编程器更多地投资.采用Linux,uisp软件和免费的并口你就可以建立起一个非常好的简单的AVR编程器,也就采用一根简单的电缆连接而已.编程器电缆的线必须符合下列要求:
电缆长度不超过70cm. 写入软件在GCC的帮助下AT90S4433可以用一般的C语言编程. 了解一些AVR汇编很有用,但也不是非要不可.AVR C语言库的avr-libc-reference 讲述了libc的大部分函数. Harald Leitner写了一个关于如何使用AVR和GCC的带有大量有用的例子的文档(haraleit.pdf, 286Kb, 原作 http://www.avrfreaks.net/AVRGCC/). 从Atmel公司的网页, (www.atmel.com, 找到: avr products -> 8 bit risc-> Datasheets), 你可以下载完整的数据资料 (复制到本地: avr4433.pdf, 2361Kb) . 它描述了所有的寄存器以及如何使用CPU.使用4433的时候有一点要注意的是它只有128字节的RAM和4K字节的EEPROM.这就意味着你不能定义大的数据结构和字符串.程序中不能采用深入的嵌套调用或者是递归调用. 就像写 char string[90]; 这样一行就已经太大了. 一个整数是16bit,如果需要一个小的整数你可以采用 unsigned char i; /* 0-255 */ 你将非常惊讶你的程序是多么大.它真是一个强大的处理器. 理论不如实践,我们将写一个程序让我们的LED每隔0.5秒闪烁一次.虽然不是很有用不过也是一个非常好的开头,而且可以用来测试我们的开发环境和编程器. void main(void) 编译和载入在开始之前确认一下PATH中包含了/usr/local/atmel/bin路径,必要的话编辑你的.bash_profile或者.tcshrc,添加如下内容:export PATH=/usr/local/atmel/bin:${PATH} (for bash) # /sbin/lsmod modeprobe parport 为了给普通用户ppdev接口写权限,运行一次下面的命令: chmod 666 /dev/parport0 确保没有在并口上的打印守护进程运行.如果你运行了就要在你连接编程器电缆前停止这个进程.现在编译和单片机编程的所有准备工作都做好了.我们的测试程序包(avrledtest-0.1.tar.gz) 里面有个编译工程文件文件.你要做的只是输入: make make load T这样就编译和载入软件了.我并不想详细描述所有的命令. 你可以打开那个 Makefile 查看,它们都是一样的.我自己都不能把它们完全记下来.我只是知道我只需要做"make load".如果你想写不同的程序你只要把Makefile中所有出现avrledtest的地方用你的程序名字替换就行了. 一些有趣的binutils比实际编译过程更有趣的是一些小工具软件.avr-objdump -h avrledtest.out S显示程序的不同段的大小..text是调入falsh EEPROM的指令代码,.data是象static char str[]="hello"; 这类的初始化数据..bss是非初始化全局数据,在我们这个里面全是零..eeprom用于存储倒eeprom的变量,我从没有用过这个..stab和.stabstr是调试信息,不会载入AVR的. avrledtest.out: file format elf32-avrSections:Idx Name Size VMA LMA File off Algn 0 .text 0000008c 00000000 00000000 00000094 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 00000000 00800060 0000008c 00000120 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00800060 0000008c 00000120 2**0 ALLOC 3 .eeprom 00000000 00810000 00810000 00000120 2**0 CONTENTS 4 .stab 00000750 00000000 00000000 00000120 2**2 CONTENTS, READONLY, DEBUGGING 5 .stabstr 000005f4 00000000 00000000 00000870 2**0 CONTENTS, READONLY, DEBUGGING你也可以用avr-size命令得到一个更精简的形式: avr-size avrledtest.out text data bss dec hex filename 140 0 0 140 8c avrledtest.out在AVR上工作你必须特别注意.text+data+bss不超过4K,data+bss+stack(你可以不考虑stack的大小,它取决于有多少嵌套调用)不能超过128字节. 下面这个命令也非常有意思: avr-objdump -S avrledtest.out 它会生成你的代码的汇编列表.结论现在你已经了解到足以开始我们的工程的AVR硬件和GCC方面的知识.LinuxFocus将来会有更多更复杂的,更有趣的关于硬件这方面的文章.参考文献
|