winAVR中文教程.docx
- 文档编号:7837623
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:16
- 大小:285.09KB
winAVR中文教程.docx
《winAVR中文教程.docx》由会员分享,可在线阅读,更多相关《winAVR中文教程.docx(16页珍藏版)》请在冰豆网上搜索。
winAVR中文教程
初次接触GCC因此花费了我不少时间,搞了半天加一个晚上终于能编译成功了!
^_^
先是安装《PN的配置与GCC入门》操作了一遍,没有成功,之后在论坛了找啊找啊,找了hotpower的一篇文档,两者一结合,ok了,呵呵。
为了更好的方便象我一样的初学者,现在把我操作的一系列步骤写下来,给初学者一个参考。
1、安装WinAVR,我按照其默认的状态安装的。
(省力省心,^_^)
2、打开ProgrammersNotepad,先不要着急新建什么工程,编写什么程序。
按照《PN的配置与GCC入门》配置一下字体显示和一些工具。
我配置的工具如下:
小弟用的是双龙的下载软件。
当然在配置MakefileWizard时,要把C:
\WinAVR\bin目录下的wish84.exe,tcl84.dll,tk84.dll三个文件复制到C:
\WinAVR\mfile目录下,然后用PN打开该目录下的mfile.tcl文件,并按照下图修改。
如果WinAVR不是按默认目录安装的,假如安装到了D:
/program/下,则上图中圈中的地方要改为setprefix“D:
/program/WinAVR/mfile/”.同样工具配置的第一幅图中command和parameters栏都要改到相应的目录下面。
以上配置基本完成,下面进入实战阶段。
3、在ProgrammersNotepad中,点击File->new->project新建一工程项目,可取名为test.pnproj
如图
4、新建文件,点击File->New->Default,
5、在编辑区内编写自己的程序代码,并保存到刚才新建Project的目录下面,取名为test.c
记住一定要保“.c”的格式,否则没有语法显示。
之后整个界面如下所示:
我所加的代码是我随便找的,代码是马老师的SPI主机的发送和接收一个字节的程序。
(做了一点修改)
代码如下:
#include
#include
#include
#include
//#defineunsignedcharuchar
#defineSIZE100
unsignedcharSPI_rx_buff[SIZE];
unsignedcharSPI_tx_buff[SIZE];
unsignedcharrx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;
unsignedchartx_wr_index,tx_rd_index,tx_counter,SPI_ok;
unsignedchart10mscnt;
unsignedchart500mscnt;
unsignedcharsenddata;
voidmcu_ini(void)
{
unsignedchartemp;
cli();
MCUCR=0x00;//disableallinterrupts
DDRA=0xff;
PORTA=0x00;
DDRC=0xff;
PORTC=0x00;
DDRD=0xff;
PORTD=0x00;
TCCR0=0x00;//stop
TCNT0=0x06;//setcount250us
OCR0=0x64;//setcompare
TCCR0=0x02;//starttimer
DDRB|=0xBF;//MISO=inputandMOSI,SCK,SS=output
PORTB|=0x40;//MISO上拉电阻有效
SPCR=0xD5;//SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率
SPSR=0x00;
temp=SPSR;
temp=SPDR;//清空SPI,和中断标志,使SPI空闲
SPI_ok=1;
MCUCR=0x00;
GICR=0x00;
TIMSK=0x01;//timerinterruptsources
sei();//re-enableinterrupts
}
//#pragmainterrupt_handlertimer0_ovf_isr:
10
SIGNAL(SIG_OVERFLOW0)
{
//250us
TCNT0=0x06;//reloadcountervalue
if(++t10mscnt>=40)
{
t10mscnt=0;
if(++t500mscnt>=50)
{
senddata++;
if(senddata>=16)
senddata=0;
t500mscnt=0;
}
}
}
//===========================
//#pragmainterrupt_handlermaster_spi_isr:
11
SIGNAL(SIG_SPI)
{
SPI_rx_buff[rx_wr_index]=SPDR;//从ISP口读出收到的字节
SPI_ok=1;//SPI空闲
if(++rx_wr_index==SIZE)rx_wr_index=0;//放入接收缓冲区,并调整队列指针
if(++rx_counter==SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;//接收缓冲区溢出
}
if(tx_counter)//如果发送缓冲区中有待发的数据tx_counter==0表示没有数据要发送
{
--tx_counter;
SPDR=SPI_tx_buff[tx_rd_index];//发送一个字节数据,并调整指针
if(++tx_rd_index==SIZE)
tx_rd_index=0;
SPI_ok=0;
}
}
//----------------------------------------
unsignedchargetSPIchar(void)
{
unsignedchardata;
while(rx_counter==0);//无接收数据,等待
data=SPI_rx_buff[rx_rd_index];//从接收缓冲区取出一个SPI收到的数据
if(++rx_rd_index==SIZE)
rx_rd_index=0;//调整指针
cli();
--rx_counter;
sei();
returndata;
}
//------------------------------------------
voidputSPIchar(charc)
{
while(tx_counter==SIZE);//发送缓冲区满,等待
cli();
if(tx_counter||SPI_ok==0)//发送缓冲区已中有待发数据
{//或SPI正在发送数据时
SPI_tx_buff[tx_wr_index]=c;//将数据放入发送缓冲区排队
if(++tx_wr_index==SIZE)
tx_wr_index=0;//调整指针
++tx_counter;
}
else
{
SPDR=c;//发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送
SPI_ok=0;//
}
sei();
}
//--------------------------------------------
/*voidspi_init(void)
{
unsignedchartemp;
DDRB|=0xB0;//MISO=inputandMOSI,SCK,SS=output
PORTB|=0xB0;//MISO上拉电阻有效
SPCR=0xD5;//SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率
SPSR=0x80;
temp=SPSR;
temp=SPDR;//清空SPI,和中断标志,使SPI空闲
SPI_ok=1;
}*/
//---------------------------------------------------
intmain(void)
{
unsignedchari;
i=0;
mcu_ini();
//CLI();//关中断
//spi_init();//初始化SPI接口
//SEI();//开中断
while
(1)
{
putSPIchar(i);//发送一个字节
//i++;
putSPIchar(i++);
putSPIchar(i++);
getSPIchar();//接收一个字节(第一个字节为空字节)
getSPIchar();
getSPIchar();
//………
}
}
6、至此代码别写完成,(呵呵,抄来的,别抽我)接下来就要做编译了。
右键点击工程管理窗口的刚才新建的test工程项目,会出现一右键菜单,在点击AddFiles,添加刚才编写的test.c文件。
如果现在就心急就按F5(makeall的快捷方式)去编译的话,恐怕还不行。
否则会出现下面的提示:
出现这样的情况说明还没有完成,还需要下面的操作。
7、要顺利完成编译,还要配置一下makefile,按快捷键F6,或点击桌面(或程序里)Mfile[WinAVR],会弹出makefile文件配置对话框。
如图:
8、接下来就是要配置这个文件了。
1)点击菜单栏的Makefile的按钮,再点击“Mainfilename…”,在出现的对话框里填写test,单击OK.
2)点击Makefile->MCUtype选择芯片类型,我这里选择了M16。
3)点击Makefile->Outputfomat输出格式,我选择了默认。
4)点击Makefile->Optimizationlevel优化级别,选择了默认。
5)点击Makefile->Debugfomat调试格式,我选择了AVR-ext-COFF(AVRStudio4.07+,VMLAB3.10+)。
因为我要用AVRStudio来进行软件调试和模拟。
6)Makefile菜单下的其它选项我都选择了默认。
特别说明的是Makefile下的C/C++sourcefile(s)….这一项,对只有一个程序文件可以不用管,多个的小弟还没有试。
(^_^)
7)完成这些后就可以保存改makefile文件了,要和test.c保存到同一目录下。
配置makefile至关重要,一般情况下的编译不成功都会与他有关。
9、完成了以上这些,你就可以按F5键了,看看编译的效果吧。
>"make.exe"all
--------begin--------
avr-gcc(GCC)3.4.1
Copyright(C)2004FreeSoftwareFoundation,Inc.
Thisisfreesoftware;seethesourceforcopyingconditions.ThereisNO
warranty;notevenforMERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.
Sizebefore:
test.elf:
sectionsizeaddr
.text6120
.data08388704
.bss2118388704
.noinit08388915
.eeprom08454144
.stab17880
.stabstr18700
Total4481
Compiling:
test.c
avr-gcc-c-mmcu=atmega16-I.-gstabs-Os-funsigned-char-funsigned-bitfields-fpack-struct-fshort-enums-Wall-Wstrict-prototypes-Wa,-adhlns=test.lst-std=gnu99-Wp,-M,-MP,-MT,test.o,-MF,.dep/test.o.dtest.c-otest.o
Linking:
test.elf
avr-gcc-mmcu=atmega16-I.-gstabs-Os-funsigned-char-funsigned-bitfields-fpack-struct-fshort-enums-Wall-Wstrict-prototypes-Wa,-adhlns=test.o-std=gnu99-Wp,-M,-MP,-MT,test.o,-MF,.dep/test.elf.dtest.o--outputtest.elf-Wl,-Map=test.map,--cref-lm
CreatingloadfileforFlash:
test.hex
avr-objcopy-Oihex-R.eepromtest.elftest.hex
CreatingloadfileforEEPROM:
test.eep
avr-objcopy-j.eeprom--set-section-flags=.eeprom="alloc,load"\
--change-section-lma.eeprom=0-Oihextest.elftest.eep
CreatingExtendedListing:
test.lss
avr-objdump-h-Stest.elf>test.lss
CreatingSymbolTable:
test.sym
avr-nm-ntest.elf>test.sym
ConvertingtoAVRExtendedCOFF:
test.cof
avr-objcopy--debugging--change-section-address.data-0x800000--change-section-address.bss-0x800000--change-section-address.noinit-0x800000--change-section-address.eeprom-0x810000-Ocoff-ext-avrtest.elftest.cof
Discardinglocalsymboloutsideanycompilationunit:
.do_copy_data_start
Discardinglocalsymboloutsideanycompilationunit:
.do_copy_data_loop
Discardinglocalsymboloutsideanycompilationunit:
.do_clear_bss_start
Discardinglocalsymboloutsideanycompilationunit:
.do_clear_bss_loop
Sizeafter:
test.elf:
sectionsizeaddr
.text6140
.data08388704
.bss2118388704
.noinit08388915
.eeprom08454144
.stab17880
.stabstr18700
Total4483
Errors:
none
--------end--------
>ProcessExitCode:
0
10、至此我们已成功的编译完成了我们的项目了,Congratulations!
!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- winAVR 中文 教程