网络接口,建立底层的接收或发送线程,创建TCP/IP线程等。
LwIP的底层接口初始化其实就是对数据链路层和物理层功能的实现。需要做几个方面的动作:LwIP的初始化、网络层设备的初始化、以太网控制器的初始化等。
如图5.2所示,网络模块的初始化函数的流程是首先是LwIP协议栈的初始化,再进行数据链路层发送接收线程的创建,之后进行网络层设备的初始化。
图5.2 LwIP底层接口初始化
而进行LwIP协议栈初始化时,先初始化LwIP统计信息,初始化操作系统的仿真层,再进行初始化存储管理结构,最后创建TCP/IP线程。LwIP协议栈的初始化中可以调用LwIP协议栈所提供的API来实现。
以太网控制器的初始化中,对于STM32F107,需要在初始化中进行设定网卡的MAC地址,初始化网卡,建立稳定的物理层和数据链路层。然后开始向LwIP注册链路层发送函数,创建接受线程。
而网卡初始化过程中需要进行几个步骤: 关闭FEC模块 关闭中断
注册中断向量和中断处理函数 开启中断
设置MAC地址和Flash寄存器 设置发送控制寄存器和接收控制寄存器 初始化发送函数和接收函数
- 24 -
开启FEC模块
在硬件模块完成了物理层和数据链路层的构建,这时,需要一方面从MAC中提取数据部分,然后传送给LwIP协议栈线程进行处理,一方面要把上层中的IP数据包传送给硬件模块,通过硬件模块把数据封装成MAC帧发送到物理网络上。
这个过程中为了减少中断处理程序的反复使用,可以将底层数据到LwIP协议栈的数据传送工作独立出来,独立出一个接收线程和一个发送线程来完成。接收线程和发送线程与底层驱动中数据收发的同步可以利用信号量的机制来实现。
5.4 本章小结
本章介绍了本设计中所涉及的相关网络协议,通过对这些网络协议的学习和理解将为后续的程序编写打下基础。
- 25 -
6 软件设计
系统软件总体结构如图6.1所示,整个程序是围绕stm32f107单片机设计的,软件程序采用模块化设计,更容易理解和调试。整个程序除主程序之外还有5个部分:系统初始化子程序、RS232通讯子程序、网口通讯子程序、I/O数据采集子程序和RS485通讯子程序。
系统初始化子程序
RS232通讯子程序
网口通讯子程序
I/O口数据处理子程序 主程序
图6.1 LwIP系统软件总体结构
6.1 主程序设计
主程序流程图如图6.2所示。系统运行后进入主程序,首先对系统硬件进行初始化,而后再对网络进行初始化,然后检查网络连接是否正常,在连接正常的情况下进行周期运行显示。部分代码如下所示:
图6.2 主程序流程图
- 26 -
int main(void) { }
System_Setup(); //系统的时钟、以太网、I/O口、中断和外设设置 Show_Msg(); TIMConfiguration();
LwIP_Init(); //网络初始化IP地址分配 Check_ETH_PHY(); //检查以太网连接 ETH_To_UART_init(); httpd_init();
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); while (1) { }
System_Periodic_Handle(); //系统周期运行显示 delay_ms(200); USART3_Put_Char(0x21);
6.2 系统初始化子程序
系统初始化子程序主要完成系统上电后,硬件初始化,时钟频率的设置,中断初始化和中断优先级的设置,串行通讯口的初始化配置。同时,在这个子程序中对本设计所涉及的I/O口进行了总体配置。系统初始化子程序的代码如下所示:
void System_Setup(void) {
RCC_ClocksTypeDef RCC_Clocks; SystemInit();
USART_COM1_Init(); USART_COM3_Init();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC|
RCC_AHBPeriph_ETH_MAC_Tx |RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
- 27 -
相关推荐: