视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
winAVR中文教程
2025-09-23 09:50:13 责编:小OO
文档
初次接触GCC因此花费了我不少时间,搞了半天加一个晚上终于能编译成功了!^_^

先是安装《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!!下载本文

显示全文
专题