先是安装《PN的配置与GCC 入门》操作了一遍,没有成功,之后在论坛了找啊找啊,找了hotpower的一篇文档,两者一结合,ok了 ,呵呵。
为了更好的方便象我一样的初学者,现在把我操作的一系列步骤写下来,给初学者一个参考。
1、安装WinAVR, 我按照其默认的状态安装的。(省力省心,^_^)
2、打开Programmers Notepad,先不要着急新建什么工程,编写什么程序。按照《PN的配置与GCC 入门》配置一下字体显示和一些工具。
我配置的工具如下:
小弟用的是双龙的下载软件。
当然在配置Makefile Wizard 时,要把C:\\WinAVR\\bin目录下的wish84.exe,tcl84.dll,tk84.dll三个文件复制到C:\\WinAVR\\mfile目录下,然后用PN打开该目录下的mfile.tcl文件,并按照下图修改。
如果WinAVR不是按默认目录安装的,假如安装到了D:/program/ 下,则上图中圈中的地方要改为set prefix “D:/program/WinAVR/mfile/”.同样工具配置的第一幅图中command和parameters 栏都要改到相应的目录下面。
以上配置基本完成,下面进入实战阶段。
3、在Programmers Notepad中,点击File->new->project 新建一工程项目,可取名为test.pnproj
如图
4、新建文件,点击File->New->Default,
5、在编辑区内编写自己的程序代码,并保存到刚才新建Project的目录下面,取名为test.c
记住一定要保“.c”的格式,否则没有语法显示。之后整个界面如下所示:
我所加的代码是我随便找的,代码是马老师的SPI主机的发送和接收一个字节的程序。(做了一点修改)
代码如下:
#include #include #include #include //#define unsigned char uchar #define SIZE 100 unsigned char SPI_rx_buff[SIZE]; unsigned char SPI_tx_buff[SIZE]; unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow; unsigned char tx_wr_index,tx_rd_index,tx_counter,SPI_ok; unsigned char t10mscnt; unsigned char t500mscnt; unsigned char senddata; void mcu_ini(void) { unsigned char temp; cli(); MCUCR = 0x00; //disable all interrupts DDRA=0xff; PORTA=0x00; DDRC=0xff; PORTC=0x00; DDRD=0xff; PORTD=0x00; TCCR0 = 0x00; //stop TCNT0 = 0x06; //set count 250us OCR0 = 0x; //set compare TCCR0 = 0x02; //start timer DDRB |= 0xBF; //MISO=input and MOSI,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; //timer interrupt sources sei(); //re-enable interrupts } //#pragma interrupt_handler timer0_ovf_isr:10 SIGNAL(SIG_OVERFLOW0) { //250us TCNT0 = 0x06; //reload counter value if(++t10mscnt>=40) { t10mscnt=0; if(++t500mscnt>=50) { senddata++; if(senddata>=16) senddata=0; t500mscnt=0; } } } //=========================== //#pragma interrupt_handler master_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; } } //---------------------------------------- unsigned char getSPIchar(void) { unsigned char data; 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(); return data; } //------------------------------------------ void putSPIchar(char c) { 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(); } //-------------------------------------------- /*void spi_init(void) { unsigned char temp; DDRB |= 0xB0; //MISO=input and MOSI,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; }*/ //--------------------------------------------------- int main(void) { unsigned char i; i=0; mcu_ini(); //CLI(); //关中断 //spi_init(); //初始化SPI接口 //SEI(); //开中断 while(1) { putSPIchar(i); //发送一个字节 //i++; putSPIchar(i++); putSPIchar(i++); getSPIchar(); //接收一个字节(第一个字节为空字节) getSPIchar(); getSPIchar(); //……… } } 6、至此代码别写完成,(呵呵,抄来的,别抽我)接下来就要做编译了。 右键点击工程管理窗口的刚才新建的test工程项目,会出现一右键菜单,在点击Add Files,添加刚才编写的test.c文件。 如果现在就心急就按F5(make all 的快捷方式)去编译的话,恐怕还不行。否则会出现下面的提示: 出现这样的情况说明还没有完成,还需要下面的操作。 7、要顺利完成编译,还要配置一下 makefile ,按快捷键F6,或点击桌面(或程序里)Mfile[WinAVR],会弹出makefile文件配置对话框。如图: 8、接下来就是要配置这个文件了。 1)点击菜单栏的Makefile的按钮,再点击“Main file name…”,在出现的对话框里填写test,单击OK. 2)点击Makefile->MCU type 选择芯片类型,我这里选择了M16。 3)点击Makefile->Output fomat 输出格式,我选择了默认。 4)点击Makefile->Optimization level 优化级别, 选择了默认。 5)点击Makefile->Debug fomat 调试格式,我选择了AVR-ext-COFF(AVR Studio 4.07+,VMLAB 3.10+)。因为我要用AVR Studio 来进行软件调试和模拟。 6)Makefile菜单下的其它选项我都选择了默认。特别说明的是Makefile 下的C/C++source file(s)….这一项,对只有一个程序文件可以不用管,多个的小弟还没有试。(^_^) 7)完成这些后就可以保存改makefile 文件了,要和test.c保存到同一目录下。配置makefile至关重要,一般情况下的编译不成功都会与他有关。 9、完成了以上这些,你就可以按F5键了,看看编译的效果吧。 > "make.exe" all -------- begin -------- avr-gcc (GCC) 3.4.1 Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Size before: test.elf : section size addr .text 612 0 .data 0 8388704 .bss 211 8388704 .noinit 0 83815 .eeprom 0 8454144 .stab 1788 0 .stabstr 1870 0 Total 4481 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.d test.c -o test.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.d test.o --output test.elf -Wl,-Map=test.map,--cref -lm Creating load file for Flash: test.hex avr-objcopy -O ihex -R .eeprom test.elf test.hex Creating load file for EEPROM: test.eep avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 -O ihex test.elf test.eep Creating Extended Listing: test.lss avr-objdump -h -S test.elf > test.lss Creating Symbol Table: test.sym avr-nm -n test.elf > test.sym Converting to AVR Extended COFF: 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 -O coff-ext-avr test.elf test.cof Discarding local symbol outside any compilation unit: .do_copy_data_start Discarding local symbol outside any compilation unit: .do_copy_data_loop Discarding local symbol outside any compilation unit: .do_clear_bss_start Discarding local symbol outside any compilation unit: .do_clear_bss_loop Size after: test.elf : section size addr .text 614 0 .data 0 8388704 .bss 211 8388704 .noinit 0 83815 .eeprom 0 8454144 .stab 1788 0 .stabstr 1870 0 Total 4483 Errors: none -------- end -------- >Process Exit Code: 0 10、至此我们已成功的编译完成了我们的项目了,Congratulations!!下载本文