首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于STM32的嵌入式以太网门禁系统设计(2)

基于STM32的嵌入式以太网门禁系统设计(2)

2 系统软件设计  2.1 以太网协议LwIP
  LwIP是瑞士计算机科学院开发的小型开源的TCP/IP协议栈。由于它只需要十几K的RAM和40K左右的ROM就可以运行,所以很适合在硬件资源并不充裕的嵌入式系统中使用。
  LwIP属于比较松散的通信机制,通过共享内存的方式实现应用层与底层协议之间的通信。它提供了三种API:①RAM API,②LwIP API,③BSD API。
  其中的RAM API其缺点就是代码不易于理解,开发难度大,其优点是相对于其他两种方式占用的资源少,效率更加高,更适合于对于资源相对少的嵌入式使用,所以我们采用RAM API方式进行编写。
  在TCP/IP传输层中有TCP和UDP两种协议,TCP提供IP环境下数据的可靠传输,UDP提供的是不可靠传输,由于门禁系统中必须要求传输数据的正确,所以采用TCP。图5是LwIP下的TCP处理流程框图。
  RAM API把协议栈和应用程序放在一个进程里,该函数基于函数回调技术,下面是LwIP的部分关键配置和代码。
  (1)LwIP配置
  在LwIP的配置文件lwipopts.h中修改如下地方。
  是否使用操作系统,我们不用,所以填写为1:
  #define NO_SYS 1
  配置heap的大小:
  #define MEM_SIZE
  配置pool的大小
  #define PBUF_POOL_SIZE
  #define PBUF_POOL_BUFSIZE
  以上三个配置占据了LwIP协议栈大部分的内存,需要根据自己的需要修改成合适的值。
  (2)LwIP代码
  ①分别设置IP地址,子网掩码和网关:
  IP4_ADDR(&ipaddr,192,168,2,28);
  IP4_ADDR(&netmask,255,255,255,0);
  IP4_ADDR(&gw,192,168,2,254);
  ②初始化底层函数,也就是配置MAC地址,初始化ENC28J60,配置最大输出单元等:
  low_level_init(netif);
  ③连接远程主机,当连接建立,就会调用第4个参数Conn_Back:
  tcp_connect(TCP_pcb,&ipaddr,1026,Conn_back);
  ④当有新的数据接收到时调用的回调函数:
  tcp_recv(TCP_pcb.tcp_recv_callback);
  ⑤服务器成功接收到数据后调用的回调函数:
  tcp_sent(TCP_pcb,tcp_sent_callback);
  ⑥处理错误的回调函数:
  tcp_err(pcb,CMD_conn_err);
  ⑦是否接收到数据:
  ethernetif_input(&enc28j60);
  通信一旦结束或者出现异常状况后,一定要使用pbuf_free()函数释放pbuf,避免内存的浪费。还有一点要注意的是,系统在正常运行的过程中,定时器函数tcp_fasttmr()和tcp_slowtmr()函数必须以固定的时间间隔被规律地调用。
  2.2 门禁系统软件架构与设计
  门禁系统的主要流程如图6所示,每次重新启动后,首先初始化相关寄存器,初始化各个模块,确定已经连接服务器,然后进入程序主循环。

  首先监测是否需要调用LwIP内部的快速定时器和慢速定时器。然后监测服务器是否有断开,如果断开则重新连接服务器,没有断开的话则检测是否有智能卡,有的话接收卡中信息进行处理然后发送给服务器。
  结语
  本文对使用STM32为主控芯片的门禁系统的硬件和软件架构进行了相应的描述,对于文中所涉及的芯片和以太网协议的使用具有指导意义,能够较大幅度地降低成本,同时门禁系统的使用会更加稳定,传输距离更长。
继承事业,薪火相传
返回列表