9G-AVR EWAVR开发过程简介
一,准备EWARM+AVR STUDIO+PROTEUS+UIP软件包
1,在http://www.mcu123.com/news/Soft/embsof/avr/200902/491.html
下载IAR Embedded Workbench for AVR 5.20 FULL版本
CD-EWAVR-520-2.zip
http://esoft.mcu123.com/MCU123_temp_0080309@/avr/CD-EWAVR-520-2.zip
(注册机自行查找,安装过程略)
2,在http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725
下载AVR Studio 4.16 (build 628)软件
AvrStudio416Setup.exe
http://www.atmel.com/dyn/resources/prod_documents/AvrStudio416Setup.exe
(AVRISP自行购买,安装过程略)
3, 在http://bbs.cechina.cn/ShowTopic.aspx?id=78131上下载
Proteus Pro 7[1].4 sp3.part01.rar 到 Proteus Pro 7[1].4 sp3.part15.rar
其中Proteus Pro 7[1].4 sp3.part08.rar下载不了,请到
在http://bbs.eeworld.com.cn/viewthread.php?tid=71645上注册下载
下载Proteus Pro 7.4 sp3.part08.rar (3.91 MB) 软件
Proteus_Pro_7.4_sp3.part08.rar
按次序改名成Proteus_Pro_7.4_sp3.part01.rar至Proteus_Pro_7.4_sp3.part15.rar后
解压即得到Proteus Pro 7.4 sp3软件及基注册号和破解补丁;
(汉化文件自己找)
4,在http://www.sics.se/~adam/uip/index.php/Download
下载uip-1.0.tar.gz软件
uip-1.0.tar.gz
http://www.sics.se/~adam/download/?f=uip-1.0.tar.gz
5,在http://www.tuxgraphics.org/common/src2/article09051/上下载
eth_tcp_client_server-3.3.tar.gz
http://www.tuxgraphics.org/common/src2/article09051/eth_tcp_client_server-3.3.tar.gz
二,建立AVR NET工程
1,在IAR EW IDE菜单中“Project”->“Create New Project”打开“Create New Project”窗口,点击“OK”打开“另存为”窗口,
选择项目工程存储路径“D:\works\avrnet-1.0.0\Project\”填写项目文件名“avrnet.ewp",在菜单中“File”->“Save All”
打开“Save Workspace As”窗口,填写工作环境文件名“avrnet.eww”;
2,在“D:\works\avrnet-1.0.0\”下建立“driver”、“atmega32”“include”和“source”空文件夹;
3,在D:\works\avrnet-1.0.0\driver\下建立uart.c如下:
#include "config.h"
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = (1<<URSEL) | 0x06;
UBRRL = 0x33; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x18;
}
int putchar(int c)
{
while(!(UCSRA&(1<<UDRE)));
UDR=(char)c;
return 0;
}
int getchar(void)
{
while(!(UCSRA&(1<<RXC)));
return (int)UDR;
}
4,在D:\works\avrnet-1.0.0\atmega32\下建立main.c如下:
#include "config.h"
extern void uart0_init(void);
void init_devices(void)
{
_CLI(); //disable all interrupts
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
uart0_init();
_SEI(); //re-enable interrupts
}
int main(void)
{
unsigned int i=0;
init_devices();
printf("\n\r\n\r\n\rAVRnet Version 1.0-ATmega32A (yuanxihuah@21cn.com) Build on %s %s\n\r\n\r",__DATE__,__TIME__);
while(1)
{
__delay_cycles(16*1000);
printf("\n\rAVRnet-1.0.0 run time = %d ...",i++);
}
}
5,在D:\works\avrnet-1.0.0\include\下建立config.h如下:
#include <stdio.h>
#ifndef ENABLE_BIT_DEFINITIONS
#define ENABLE_BIT_DEFINITIONS
// Enable the bit definitions in the iom128.h file
#endif
#include <avr_macros.h>
#include <ina90.h>
#include <intrinsics.h>
#include <iomacro.h>
#include <iom32a.h>
三,配置AVR NET工程
1, 在IAR EW IDE的左面“Workspace”窗口下面的“Files”空白部分右击鼠标,选择“Add”->“Add Group”出现““Add Group - avrnet”窗口,
在“Group name”中填上“DRV”,同样方法建立“SRC”“INC”“LIB”等文件组后点击“Save All”快捷键;
2, 在IAR EW IDE的左面“Workspace”窗口下面的“SRC”上右击鼠标,选择“Add”->“Add Files”出现““Add Files - SRC”窗口,选择
打开“D:\works\avrnet-1.0.0\atmega32”文件夹下的main.c文件;
3, 在IAR EW IDE的左面“Workspace”窗口下面的“SRC”上右击鼠标,选择“Add”->“Add Files”出现““Add Files - SRC”窗口,选择
打开“D:\works\avrnet-1.0.0\driver”文件夹下的uart.c文件;
在IAR EW IDE的左面“Workspace”窗口下面的“Files”的“avrnet - Release”左击鼠标,选择“Project”->“Options”出现“Options for node "avrnet"”窗口;
4,在左面“Category:”中选择上“General Options”,在“Target”->“Processor configuration”中选择“--cpu=m32a, Atmega32A”,
“Memory model”中选择“Small”;
5,在左面“Category:”中选择上“C/C++ Complier”,在“Preprocessor”->“Additional include directories:”中填上下面几行:
$PROJ_DIR$\..\include
$PROJ_DIR$\..\library\uip-1.0\uip
6,在左面“Category:”中选择上“Linker”,在“Output”中勾选“override default”,在下面填上:avrnet-1.0.0.hex
在“Format”中勾选“Other”并在“Output”后面选择上“intel-standard”;
四,调试AVR NET工程
1,在IAR EW IDE菜单中“Project”->“Make”打开编译工程命令生成目标码:
D:\works\avrnet-1.0.0\project\Release\Exe\avrnet-1.0.0.hex
2,利用Proteus仿真程序(自行实现)。
五,移植AVR NET工程
1,解压uip-1.0.tar.gz软件包,把全部代码的“uip-1.0”文件夹复制到“D:\works\avrnet-1.0.0\library”,修改D:\works\avrnet-1.0.0\library\uip-1.0\unix\main.c
为uip_main.c并与其它C文件一起复制到D:\works\avrnet-1.0.0\atmega32,H文件复制到D:\works\avrnet-1.0.0\include下面;
2,在IAR EW IDE的左面“Workspace”窗口下面的“Files”空白部分右击鼠标,选择“Add”->“Add Group”出现“Add Group - avrnet”窗口,
在“Group name”中填上“UIP”后点击“Save All”快捷键;
3,在IAR EW IDE的左面“Workspace”窗口下面的“UIP”上右击鼠标,选择“Add”->“Add Group”出现““Add Group - UIP”窗口,
在“Group name”中填上“UIP”,同样方法建立“APPS”“LIB”“UNIX”等文件组后点击“Save All”快捷键;
4,在IAR EW IDE的左面“Workspace”窗口“UIP”下面的“UIP”上右击鼠标,选择“Add”->“Add Files”出现“Add Files - UIP”窗口,选择
打开“D:\works\avrnet-1.0.0\library\uip-1.0\uip” 文件夹下的8个C文件;
5,在IAR EW IDE的左面“Workspace”窗口“UIP”下面的“LIB”上右击鼠标,选择“Add”->“Add Files”出现“Add Files - LIB”窗口,选择
打开“D:\works\avrnet-1.0.0\library\uip-1.0\lib” 文件夹下的1个C文件;
6,在D:\works\avrnet-1.0.0\include建立inttypes.h文件:
#ifndef __INTTYPES_H_
#define __INTTYPES_H_
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed int int16_t;
typedef unsigned int uint16_t;
typedef signed long int int32_t;
typedef unsigned long int uint32_t;
typedef signed long long int int64_t;
typedef unsigned long long int uint64_t;
#endif /* __INTTYPES_H_ */
7,添加ENC28J60驱动
解压eth_tcp_client_server-3.3.tar.gz文件包,把其中的enc28j60.c和enc28j60.h复制到D:\works\avrnet-1.0.0\driver目录;
用上面类似的方式添加到工程目录“DRV”中;
把enc28j60.c的第15行的#include <avr/io.h>修改为:#include "config.h"
把enc28j60.c的第20行的#include <util/delay.h>修改为:#include "delay.h" //#include <util/delay.h>
在D:\works\avrnet-1.0.0\include建立delay.h文件,实现以下延时接口;
void _delay_loop_1(uint8_t __count){}
void _delay_loop_2(uint16_t __count){}
void _delay_ms(double __ms){}
void _delay_us(double __us){}
修改D:\works\avrnet-1.0.0\atmega32\tapdev.c文件的驱动接口函数:
#include "config.h"
#include "uip.h"
#include "clock-arch.h"
extern void enc28j60Init(uint8_t* macaddr);
extern uint16_t enc28j60PacketReceive(uint16_t maxlen, uint8_t* packet);
extern void enc28j60PacketSend(uint16_t len, uint8_t* packet);
volatile unsigned int Packet_length;
/*---------------------------------------------------------------------------*/
void tapdev_init(void)
{
#if UIP_FIXEDETHADDR == 0
extern unsigned char avr_mac[];
#else
unsigned char avr_mac[] = {UIP_ETHADDR0,UIP_ETHADDR1,UIP_ETHADDR2, UIP_ETHADDR3, UIP_ETHADDR4, UIP_ETHADDR5};
#endif
enc28j60Init(avr_mac);
Packet_length = 0;
GICR |= 0x01 << 6;
}
/*---------------------------------------------------------------------------*/
unsigned int tapdev_read(void)
{
unsigned int temp;
extern volatile clock_time_t sys_ticks;
temp = sys_ticks;
while (Packet_length == 0 && temp == sys_ticks) {;}
temp = Packet_length;
Packet_length = 0;
return temp;
}
/*---------------------------------------------------------------------------*/
#pragma vector=INT0_vect
__interrupt void enc28j60_int(void)
{
Packet_length = enc28j60PacketReceive(UIP_BUFSIZE,uip_buf);
}
void tapdev_send(void)
{
enc28j60PacketSend(uip_len ,uip_buf);
}
8,增加系统定时器
把D:\works\avrnet-1.0.0\atmega32的第42行修改为:#include "config.h"//#include <sys/time.h>
在clock_time_t clock_time(void) {}前面增加:volatile clock_time_t sys_ticks;
并且把clock_time_t clock_time(void) {}函数体其它内容注释掉,改为:return sys_ticks;
在D:\works\avrnet-1.0.0\driver建立clock.c文件:
#include "clock-arch.h"
#include "config.h"//#include <sys/time.h>
extern volatile clock_time_t sys_ticks;
void sys_clock_init(void)
{
TCCR0 = 0;
TCCR0 |= (1 << CS02);
TIMSK |= (1 << TOIE0);
TCNT0 = 0x06;
sys_ticks = 0;
}
#pragma vector=TIMER0_OVF_vect //定时器0溢出中断入口地址
__interrupt void time0(void)
{
TCNT0 = 0x06;
sys_ticks++;
}
六,测试TELNET协议
1, 在IAR EW IDE的左面“Workspace”窗口“UIP”下面的“APPS”上右击鼠标,选择“Add”->“Add Files”出现“Add Files - APPS”窗口,选择
D:\works\avrnet-1.0.0\library\uip-1.0\apps下面的“TELNETD”文件夹的C文件加入到项目后,点击“Save All”快捷键;
2,在左面“Category:”中选择上“C/C++ Complier”,在“Preprocessor”->“Additional include directories:”中填上下面几行:
$PROJ_DIR$\..\library\uip-1.0\apps\telnetd
$PROJ_DIR$\..\library\uip-1.0\lib
3,打开D:\works\avrnet-1.0.0\include\uip-conf.h 把第148行的#include "telnetd.h"注释打开;
4,打开D:\works\avrnet-1.0.0\atmega32\uip_main.c文件,加入#include "config.h" 包含,修改main(void)为uip_main(void),并在其中打开
telnetd_init();注释掉 /* httpd_init(); */,完成;
5,在D:\works\avrnet-1.0.0\atmega32\main.c文件前加入extern int uip_main(void);并在while(1) 前加入调用uip_main();主程序,完成。
6,在D:\works\avrnet-1.0.0\include\uip-conf.h中,修改#define UIP_CONF_MAX_CONNECTIONS 6 //40 减少连接数,修改
#define UIP_CONF_MAX_LISTENPORTS 1 //40,修改#define UIP_CONF_BYTE_ORDER UIP_LITTLE_ENDIAN //LITTLE_ENDIAN,
并且添加以下代码:
#define TELNETD_CONF_NUMLINES 1
#define TELNETD_CONF_LINELEN 40
#define notdef 0
#define UIP_CONF_IPV6 0
#define UIP_ARCH_ADD32 0
#define UIP_ARCH_CHKSUM 0
#define UIP_NEIGHBOR_CONF_ADDRTYPE 0
#define UIP_IPADDR0 192
#define UIP_IPADDR1 168
#define UIP_IPADDR2 1
#define UIP_IPADDR3 80
#define UIP_NETMASK0 255
#define UIP_NETMASK1 255
#define UIP_NETMASK2 255
#define UIP_NETMASK3 0
#define UIP_DRIPADDR0 192
#define UIP_DRIPADDR1 168
#define UIP_DRIPADDR2 1
#define UIP_DRIPADDR3 1
#define UIP_ETHADDR0 'A'
#define UIP_ETHADDR1 'V'
#define UIP_ETHADDR2 'R'
#define UIP_ETHADDR3 'N'
#define UIP_ETHADDR4 'E'
#define UIP_ETHADDR5 'T'
7,编译通过。(参考了网络上的一些例子,只记得有一个是风城少主的。请多包涵。)
离线
下载看看
离线
10几年前喜欢用AVR,自从有了STM32就不再了😗😙
离线