
引言:本文基于ST系列协议栈程序,详细阐述了标准库下的EtherCAT协议栈整体框架结构。文中将重点介绍协议栈的组织架构、核心模块功能以及移植注意事项,为开发者提供清晰的协议栈使用指南。
一、标准库协议栈整体框架结构
ST系列协议栈标准库框架主要包含两大核心部分:Libraries和EtherCAT,这两部分又包含多个细分模块。
- Libraries(库函数)
1.1 CMSIS
包含与STM32微控制器内核相关的文件,提供对ARM Cortex-M内核的访问接口。
1.2 STM32FXXX_StdPeriph_Driver
包含与STM32FXXX处理器外设相关的底层驱动,为应用层提供硬件抽象接口。
- EtherCAT(EtherCAT协议相关模块)
2.1 MDK-ARM
-
包含Stack_size、Vectors、Reset_Handler、NMI_Handler等文件
-
包含uvprojx工程文件
-
提供开发环境配置
2.2 User
包含与STM32定时器、ADC、外部中断和FSMC等配置相关的文件。
2.3 EtherCAT
包含了与EtherCAT通信协议与应用层控制相关的文件。
2.4 Src(源文件目录)
包含与EtherCAT通信协议有关的源文件,各文件功能如下:
-
Aoeappl.c:包含AOE邮箱接口
-
Bootmode.c:包含boot模式虚拟接口
-
Coeappl.c:COE应用层接口模块;处理对象字典中索引为0x1000、0x1001、0x1008、0x1009、0x100A、0x1018、0x10F1、0x1C00、0x1C32、0x1C33等通用对象,实现对象字典的初始化、添加、移除和清除等操作
-
Diag.c:包含诊断对象处理
-
Ecataoe.c:包含AOE邮箱接口
-
Ecatappl.c:EtherCAT从站应用层接口,整个协议栈运行的核心模块,处理EtherCAT从站状态机和过程数据接口,实现输入/输出过程数据对象的映射处理、ESC与处理器本地内存的输入/输出过程数据交换
-
Ecatcoe.c:包含COE邮箱接口函数
-
Ecateoe.c:包含EOE邮箱接口函数
-
Ecatfoe.c:包含FOE邮箱接口函数
-
Ecatslv.c:处理EtherCAT状态机模块;状态机转换请求由主站发起,主站将请求状态写入ALControl寄存器,从站采用查询方式获取状态转换事件,通过AL_ControlInd()函数处理状态机转换,配置SM通道开启/关闭,检查SM通道参数
-
Ecatsoe.c:包含一个演示SOE的简短示例
-
El9800appl.c:提供与应用层接口的函数和主函数
-
Emcy.c:包含紧急接口
-
Eoeappl.c:包含一个如何使用EOE服务的例子
-
Foeappl.c:包含一个如何使用FOE的例子
-
Mailbox.c:处理EtherCAT邮箱服务模块,包括邮箱通信接口初始化、邮箱通道参数配置、根据当前状态机开启/关闭邮箱服务、邮箱通信失败后的重复发送请求、邮箱数据的读写等
-
Objdef.c:访问COE对象字典模块,实现读写对象字典、获取对象字典入口及具体处理函数
-
Sdoserv.c:SDO服务处理模块,处理所有SDO信息服务
2.5 Inc(头文件目录)
包含与EtherCAT通信协议有关的头文件,各头文件功能如下:
-
applInterface.h:定义应用程序接口函数
-
bootmode.h:声明在引导状态下需要调用的函数
-
cia402appl.h:定义与cia402相关的变量、对象和轴结构
-
coeappl.h:对coeappl.c文件中的函数进行声明
-
ecat_def.h:定义从站样本代码配置
-
ecataoe.h:定义和AOE相关的宏、结构体,并对ecataoe.c文件中的函数进行声明
-
ecatappl.h:对ecatappl.c文件中的函数进行声明
-
ecatcoe.h:定义错误码、COE服务和COE结构相关的宏,并对ecatcoe.h文件中的函数进行声明
-
ecateoe.h:定义与EOE相关的宏和结构体,并对ecateoe.c文件中的函数进行声明
-
ecatfoe.h:定义与FOE相关的宏和结构体,并对ecatfoe.c文件中的函数进行声明
-
ecatslv.h:对数据类型、从站状态机状态、ESM转换错误码、应用层状态码、从站工作模式、应用层事件掩码和全局变量进行定义
-
ecatsoe.h:定义与SOE相关的宏和结构体,并对ecatsoe.c文件中的函数进行声明
-
el9800appl.h:对对象字典中索引为0x800、0x1601、0x1802、0x1a00、0x1c12、0x1c13、0x6000、0x6020、0x7010、0x8020、0xf000、0xf0100、0xffff等特定对象进行定义
-
esc.h:对EtherCAT从站控制器芯片中寄存器的地址和相关掩码进行说明
-
mailbox.h:定义邮箱通信相关的宏和结构体,并对mailbox.c文件中的函数进行声明
-
mcihw.h:通过并行接口来访问ESC的定义和宏
-
objdef.h:定义某些数据类型,对支持同步变量的类型进行宏定义,定义描述对象字典的结构体类型
2.6 Port(外围端口初始化与驱动)
包含与从站外围端口初始化和驱动相关的文件:
Mcihw.c:包含对微控制器GPIO、定时器、ADC及外部中断等外设初始化程序,同时提供读取和写入EtherCAT从站控制器芯片中寄存器的函数
二、标准库编程整体框架结构
根据标准库函数编写的程序可分为CMSIS、MDK-ARM、Doc、User、Hardware、Src、Stack、STM32Fxxx_StdPeriph_Driver、SYSTEM几部分,程序有如下几个部分组成:
- Start(启动文件)
-
system_stm32fxxx.c:包含片上核外外设的地址和中断定义
-
core_cm3.c:包含用于访问内核寄存器的名称、地址定义
-
startup_stm32fxxx_hd.s:STM32微控制器的启动文件
- Src(源文件)
-
foeappl.c:包含一个如何使用FOE的例子
-
coeappl.c:COE应用层接口模块
-
ecatappl.c:EtherCAT从站应用层接口,整个协议栈运行的核心模块
-
aoeappl.c:包含AOE邮箱接口
-
eoeappl.c:包含一个如何使用EOE服务的例子
-
el9800appl.c:提供了与应用层接口的函数和主函数
- Hardware(硬件初始化)
-
el9800hw.c:对从站开发板的外设和GPIO进行初始化,定义读取和写入从站控制器芯片DPRAM中寄存器的函数,实现中断入口函数的定义
-
SPI1.c:对微控制器的SPI外设进行配置
-
ADC1.c:对微控制器的ADC和DMA通道进行配置
-
EXTI.c:对微控制器外部中断进行配置
-
Timer.c:对微控制器定时器及其中断进行配置
- Stack(协议栈核心处理)
-
ecatslv.c:处理EtherCAT状态机模块
-
mailbox.c:处理EtherCAT邮箱服务模块
-
objdef.c:访问COE对象字典模块
-
sdoserv.c:SDO服务处理模块
-
ecatcoe.c:包含COE邮箱接口函数
-
bootmode.c:包含boot模式虚拟接口
-
diag.c:包含诊断对象处理
-
ecataoe.c:包含AOE邮箱接口
-
ecateoe.c:包含EOE邮箱接口函数
-
ecatfoe.c:包含FOE邮箱接口函数
-
ecatsoe.c:包含一个演示SOE的简短示例
-
emcy.c:包含紧急接口
-
fc1100hw.c:包含1100的外围配置文件
- Library(标准外设库)
包含标准外设库文件:
-
misc.c:提供外设对内核中NVIC(中断向量控制器)的访问函数
-
stm32fxxx_adc.c:包含与STM32FXXX的ADC外设编写的库函数文件
-
stm32fxxx_dma.c:包含与STM32FXXX的DMA外设编写的库函数文件
-
stm32fxxx_exti.c:包含与STM32FXXX的EXTI外设编写的库函数文件
-
stm32fxxx_fsmc.c:包含与STM32FXXX的FSMC外设编写的库函数文件
-
stm32fxxx_gpio.c:包含与STM32FXXX的GPIO外设编写的库函数文件
-
stm32fxxx_pwr.c:包含与STM32FXXX的PWR外设编写的库函数文件
-
stm32fxxx_rcc.c:包含与STM32FXXX的RCC外设编写的库函数文件
-
stm32fxxx_spi.c:包含与STM32FXXX的SPI外设编写的库函数文件
-
stm32fxxx_syscfg.c:包含与STM32FXXX的SYSCFG外设编写的库函数文件
-
stm32fxxx_tim.c:包含与STM32FXXX的TIM外设编写的库函数文件
-
stm32fxxx_usart.c:包含与STM32FXXX的USART外设编写的库函数文件
三、程序修改与移植注意事项
- 移植MCU
1.1 替换库函数
根据需要移植的MCU更换相应的库函数,将更换后的库函数路径放进程序中。例如,以STM32F103替换STM32F407为例,将所有含stm32f4xx的.c和.s文件都替换成stm32f10x.c和.s文件。


1.2 更改芯片型号和名称
更改MCU型号:以STM32F103替换STM32F407为例,将芯片型号由STM32F407ZGTx改为STM32F103VB。


更改预处理宏定义:将宏定义内的名称由STM32F40_41xxx改为STM32F10x_MD。


1.3 更改程序
编译后根据报错信息更改程序,修改完成后将程序下载到开发板内,再根据具体需求进一步修改。例如,以STM32F103替换STM32F407的EXTI中断配置为例,根据报错信息和结构体更改初始化程序。


- SPI的读写函数
在进行读写指令之前,使用SPI_Cmd()函数对SPI的外设进行失能后再使能,确保读写功能正常使用。


结语
ST系列MCU的EtherCAT协议栈框架结构清晰,模块化设计便于开发者理解和使用。通过合理组织各模块,开发者可以高效地实现EtherCAT从站功能,同时也能方便地进行MCU移植和功能扩展。在实际开发过程中,需要特别注意SPI外设的正确配置,以及在移植过程中对库函数和芯片型号的准确替换,以确保协议栈能够稳定运行。