1、记住一定要保“.c”的格式,否则没有语法显示。之后整个界面如下所示:我所加的代码是我随便找的,代码是马老师的SPI主机的发送和接收一个字节的程序。(做了一点修改)代码如下:#include stdio.havr/signal.havr/interrupt.h/#define unsigned char uchar#define SIZE 100 unsigned char SPI_rx_buffSIZE; unsigned char SPI_tx_buffSIZE;unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overfl
2、ow;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; /sto
3、p TCNT0 = 0x06; /set count 250us OCR0 = 0x64; /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 = 0x
4、00; GICR = 0x00; TIMSK = 0x01; /timer interrupt sources sei(); /re-enable interrupts/#pragma interrupt_handler timer0_ovf_isr:10SIGNAL(SIG_OVERFLOW0) /250us /reload counter value if(+t10mscnt=40) t10mscnt=0; if(+t500mscnt=50) senddata+; if(senddata=16) senddata=0; t500mscnt=0; /=/#pragma interrupt_h
5、andler master_spi_isr:11 SIGNAL(SIG_SPI) SPI_rx_buffrx_wr_index = SPDR; /从ISP口读出收到的字节 / 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 =
6、 SPI_tx_bufftx_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_buffrx_rd_index; /从接收缓冲区取出一个SPI收到的数据 if (+rx_rd_index = SIZE) rx_rd_index = 0; /调整指针 cli(); -rx_counter;
7、 return data;/-void putSPIchar(char c) while (tx_counter = SIZE);/发送缓冲区满,等待 if (tx_counter | SPI_ok=0 ) /发送缓冲区已中有待发数据 /或SPI正在发送数据时 SPI_tx_bufftx_wr_index = c; /将数据放入发送缓冲区排队 if (+tx_wr_index = SIZE) tx_wr_index = 0; +tx_counter; else SPDR = c; /发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送 SPI_ok = 0; / /-/*void sp
8、i_init(void) unsigned char temp; DDRB |= 0xB0; PORTB |= 0xB0; SPSR = 0x80;*/ /-int main(void) unsigned char i; i=0; mcu_ini(); /CLI(); /关中断 /spi_init(); /初始化SPI接口 /SEI(); /开中断 while(1) putSPIchar(i); /发送一个字节 /i+; putSPIchar(i+); getSPIchar(); /接收一个字节(第一个字节为空字节) / 6、 至此代码别写完成,(呵呵,抄来的,别抽我)接下来就要做编译了。右键
9、点击工程管理窗口的刚才新建的test工程项目,会出现一右键菜单,在点击Add Files,添加刚才编写的test.c文件。如果现在就心急就按F5(make all 的快捷方式)去编译的话,恐怕还不行。否则会出现下面的提示:出现这样的情况说明还没有完成,还需要下面的操作。7、要顺利完成编译,还要配置一下 makefile ,按快捷键F6,或点击桌面(或程序里)MfileWinAVR,会弹出makefile文件配置对话框。如图:8、接下来就是要配置这个文件了。1) 点击菜单栏的Makefile的按钮,再点击“Main file name”,在出现的对话框里填写test,单击OK.2)点击Makef
10、ile-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).这一项,对只有一个程序文件可以不用管,多个的
11、小弟还没有试。(_)7)完成这些后就可以保存改makefile 文件了,要和test.c保存到同一目录下。配置makefile至关重要,一般情况下的编译不成功都会与他有关。9、完成了以上这些,你就可以按F5键了,看看编译的效果吧。 make.exe all- begin -avr-gcc (GCC) 3.4.1Copyright (C) 2004 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for
12、 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 8388915.eeprom 0 8454144.stab 1788 0.stabstr 1870 0Total 4481Compiling: test.cavr-gcc -c -mmcu=atmega16 -I. -gstabs -Os -funsigned-char -funsigned-bitfields
13、 -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.elfavr-gcc -mmcu=atmega16 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhl
14、ns=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 -lmCreating load file for Flash: test.hexavr-objcopy -O ihex -R .eeprom test.elf test.hexCreating load file for EEPROM: test.eepavr-objcopy -j .eeprom -set-section-flags=.eeprom=alloc,load
15、-change-section-lma .eeprom=0 -O ihex test.elf test.eepCreating Extended Listing: test.lssavr-objdump -h -S test.elf Creating Symbol Table: test.symavr-nm -n test.elf Converting to AVR Extended COFF: test.cofavr-objcopy -debugging -change-section-address .data-0x800000 -change-section-address .bss-0
16、x800000 -change-section-address .noinit-0x800000 -change-section-address .eeprom-0x810000 -O coff-ext-avr test.elf test.cofDiscarding local symbol outside any compilation unit: .do_copy_data_start .do_copy_data_loop .do_clear_bss_start .do_clear_bss_loopSize after:.text 614 0Total 4483Errors: none- end -Process Exit Code: 010、至此我们已成功的编译完成了我们的项目了,Congratulations!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1