您尚未登录。

楼主 #1 2020-05-09 20:45:26

缥缈九哥
会员
注册时间: 2020-05-09
已发帖子: 93
积分: 96

9G-AVR EWAVR开发过程简介--缥缈九哥

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,编译通过。(参考了网络上的一些例子,只记得有一个是风城少主的。请多包涵。)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn