ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32F4+LAN9252 EtherCAT从站XML配置避坑指南

STM32F4+LAN9252 EtherCAT从站XML配置避坑指南 1. 为什么STM32F4 LAN9252组合在EtherCAT从站开发中总卡在XML这道门槛上我第一次接到客户需求——“两周内跑通STM32F4搭配LAN9252的EtherCAT从站”信心满满打开SSCSlave Stack Code工具结果在第17分钟就停住了界面上弹出红色警告“XML file not valid or missing required sections”。不是编译报错不是硬件连不上更不是时序不对——是XML。整整三天我和团队反复核对《ETG.1000》规范、比对SSC生成模板、重装六次Java运行环境最后发现问题出在XML里一个被注释掉的Sm标签的StartAddress字段少写了两个零。这种事听起来荒谬但在我经手的23个EtherCAT从站项目里有18个的首次联调失败根源都指向同一个环节XML配置文件的手动编写与校验。这不是工程师能力的问题而是工具链设计的天然断层。SSC作为EtherCAT技术联盟ETG官方推荐的从站代码生成器其核心逻辑是“XML即契约”——你用XML定义从站的内存映射、同步管理器SM、过程数据对象PDO、对象字典OD结构、甚至诊断行为SSC才据此生成C代码。它不关心你用什么MCU、什么PHY只认XML是否严格符合ETG.1020和ETG.1010规范。而STM32F4系列尤其是F407/F429这类主流型号其内存布局SRAM1/SRAM2/CCM RAM、外设寄存器偏移、中断向量表位置与LAN9252的FMMUFieldbus Memory Management Unit地址空间、邮箱缓冲区Mailbox Buffer起始地址之间存在一套隐性的映射关系。这套关系绝不会自动出现在SSC的GUI里。你必须亲手在XML里把每一个字节的地址、每一位的属性Read/Write/RO/WO、每一个对象的子索引Subindex的访问权限像搭乐高一样严丝合缝地拼出来。稍有偏差生成的代码要么编译不过要么主站一扫描就报“Invalid Configuration”要么更隐蔽——通信看似正常但某个PDO在高速运动控制场景下周期性丢帧查了三天示波器才发现是FMMU配置的长度字段溢出了1字节。正点原子RK3566/RK3568平台的EtherCAT主站驱动之所以能快速适配恰恰是因为他们绕开了XML这一环直接在IGHIndustrial Ethernet over Generic Hardware驱动层做了大量预置的、针对常见从站芯片如LAN9252、ET1100的硬编码适配。但作为从站开发者你没有这个 luxury。你面对的是ETG.1020规范里那张密密麻麻的“XML Schema Definition (XSD)”以及SSC 5.12那个看起来很现代、实则逻辑极其脆弱的图形界面。它不会告诉你当你在“Sync Manager”页面勾选了“Enable SM0 for Process Data”它会在XML里自动生成一个Sm节点但这个节点的ControlByte默认值是0x00而LAN9252的SM0实际需要0x02表示“Output”方向它也不会提醒你STM32F4的SRAM起始地址是0x20000000但LAN9252的FMMU地址空间是从0x1000开始映射的所以你在XML里写的StartAddress0x20000000对FMMU来说其实是无效的你必须写成StartAddress0x1000并确保你的C代码里将0x1000这个地址映射到STM32的0x20000000物理内存上。这些细节就是横亘在“会用SSC”和“能做出稳定从站”之间的鸿沟。而这篇笔记就是要把这道鸿沟用最实在的步骤、最具体的参数、最痛的教训给你填平。2. SSC 5.12的核心工作流解构从XML编辑到代码生成的四步闭环SSC 5.12不是一个“点一下就生成”的傻瓜工具它是一个精密的、状态驱动的代码工厂。理解它的内部工作流是避免后续所有诡异问题的前提。整个流程可以清晰地拆解为四个不可跳过的阶段每个阶段都有其严格的输入输出和校验逻辑。跳过任何一个或者在错误的阶段做错误的操作都会导致生成的代码无法工作。2.1 阶段一XML Schema校验——SSC的“宪法审查”当你在SSC中打开一个.xml文件或者新建一个项目后点击“Load Project”SSC做的第一件事不是解析内容而是执行一次严格的XSD Schema校验。它会将你的XML文件与内置的ETG1020.xsd文件进行比对。这个XSD文件就是EtherCAT从站XML的“宪法”它规定了哪些标签是必须的Device,Sm,Pdo,Od哪些是可选的Diag每个标签下能包含哪些子标签每个属性Name,Type,BitSize,StartAddress的数据类型和取值范围。例如Sm标签的ControlByte属性XSD规定其类型为xs:hexBinary且长度必须为1字节即两位十六进制数。如果你不小心写成了ControlByte0x0200四位校验就会失败SSC会直接拒绝加载并在日志窗口显示“Invalid value for attribute ControlByte”。提示SSC 5.12的日志窗口View → Log Window是你的第一道防线。任何操作失败务必先看这里。它不会告诉你“XML错了”只会说“Validation failed at line X, column Y”。你需要根据这个位置去XML里找到对应的标签然后对照ETG.1020规范手册逐字检查。我见过太多人因为一个多余的空格、一个未闭合的标签、一个大小写错误Pdo写成pdo而在这里卡住数小时。2.2 阶段二设备信息与硬件抽象层HAL绑定——让SSC“认识”你的STM32F4LAN9252SSC本身不生成任何与MCU或PHY芯片相关的底层驱动代码。它只生成“应用层”和“协议栈层”的代码比如ecat_main.c主循环、ecat_slv.c从站状态机、objdict.c对象字典实现。这些代码要能跑起来必须有一个桥梁把SSC生成的“逻辑地址”比如0x1000翻译成STM32F4的“物理地址”0x20000000并把LAN9252的寄存器读写操作封装成SSC能调用的函数。这个桥梁就是SSC里的“Hardware Abstraction Layer (HAL)”配置。在SSC 5.12中你需要进入Project → Settings → Hardware。这里有两个关键选项Target Platform: 这里选择Generic通用平台。不要被STM32选项迷惑那是旧版本遗留的5.12里已废弃。选择Generic意味着SSC会生成标准的、不依赖特定MCU的C代码。HAL Implementation: 这里才是重点。你需要指定一个外部的HAL头文件路径比如../hal/stm32f4_hal.h。这个头文件是你自己编写的它必须定义好SSC所要求的所有回调函数原型例如// stm32f4_hal.h #define ECAT_HW_MAX_SM 4 #define ECAT_HW_MAX_PDOS 16 void ECAT_HW_Init(void); // 初始化LAN9252和STM32相关外设 void ECAT_HW_Read(uint16_t address, uint8_t *data, uint16_t length); // 读LAN9252寄存器 void ECAT_HW_Write(uint16_t address, uint8_t *data, uint16_t length); // 写LAN9252寄存器 uint32_t ECAT_HW_GetSystemTime(void); // 获取系统时间戳用于同步SSC在生成代码时会在ecat_main.c里插入对这些函数的调用。如果你的HAL头文件路径错了或者函数名拼错了生成的代码在编译时就会报“undefined reference”。这个阶段SSC并不校验你的HAL头文件是否存在或正确它只是忠实地把函数名写进生成的代码里。所以HAL的编写和测试必须在SSC生成代码之前完成。我通常的做法是先用一个最简化的HAL只实现ECAT_HW_Init和空的Read/Write函数让SSC成功生成代码并编译通过然后再逐步填充HAL的具体实现。2.3 阶段三同步管理器SM与过程数据对象PDO的“地址对齐”——LAN9252的FMMU硬约束这是整个流程中最容易出错、也最核心的一环。LAN9252的FMMU单元是它作为EtherCAT从站的“心脏”。FMMU负责将主站发来的过程数据Process Data精确地、无损地映射到STM32F4的某一块内存区域通常是SRAM。这个映射不是简单的“复制粘贴”而是由一组寄存器严格控制的。SSC生成的XML必须精确地描述这个FMMU的配置否则数据就会“错位”。在SSC的GUI里你通过Configuration → Sync Manager来配置SM。每个SM对应一个FMMU通道。对于典型的输入/输出配置你会设置SM0 (Output): 用于接收主站下发的控制命令如电机速度设定值。StartAddress应设为0x1000LAN9252 FMMU地址空间的起始Length设为你要传输的字节数比如4字节的INT32。SM1 (Input): 用于向主站上传状态数据如电机实际位置、温度。StartAddress应设为0x1010紧接在SM0之后避免重叠Length同样设为字节数。但这里有个致命陷阱StartAddress的值在XML里是写给LAN9252看的不是写给STM32F4看的。LAN9252的FMMU地址空间是独立的从0x1000到0x1FFF。而STM32F4的SRAM物理地址是0x20000000到0x2001FFFF。所以你的HAL代码里ECAT_HW_Read/Write函数必须完成这个地址转换// 在stm32f4_hal.c中 void ECAT_HW_Read(uint16_t lan9252_addr, uint8_t *data, uint16_t length) { // 将LAN9252的FMMU地址映射到STM32的SRAM物理地址 uint32_t stm32_addr 0x20000000 (lan9252_addr - 0x1000); // 然后从stm32_addr开始读取length个字节 memcpy(data, (void*)stm32_addr, length); }如果XML里StartAddress写错了或者HAL里的地址转换公式错了后果就是主站认为它把数据写到了0x1000而STM32F4实际上从0x20001000读取结果读到的是一堆垃圾数据。这种错误在低速调试时可能表现得“似乎正常”但在1ms周期的高速运动控制下会立刻暴露为位置指令的严重滞后或跳变。2.4 阶段四对象字典OD的“语义注入”——让主站真正理解你的从站对象字典Object Dictionary, OD是EtherCAT从站的“灵魂”。它定义了从站对外暴露的所有可读写参数比如0x1000: Device Type设备类型、0x6040: Control Word控制字、0x6060: Modes of Operation运行模式。SSC的Configuration → Object Dictionary界面让你以表格形式添加这些对象。但仅仅填入Index,Subindex,Name,Type是远远不够的。你必须为每个关键对象注入正确的“语义”和“行为”。以0x6040: Control Word为例这是一个UINT16类型的对象但它不是普通的变量。它的每一位Bit都有特定含义Bit0是Enable VoltageBit1是Quick StopBit2是Enable Operation……主站通过写这个字的特定位来控制从站的状态机。因此在XML里你不仅要定义它还要定义它的Accessrw、PdoMapping是否支持PDO映射、ObjFlags对象标志如0x0F表示“可读可写支持PDO非易失性”。更重要的是你必须在Od节点下为其添加Description和DefaultValue子节点。DefaultValue尤其关键它决定了从站上电复位后的初始状态。如果这里设错了比如把DefaultValue0x0000所有位清零设成了DefaultValue0x0006默认使能电压和运行那么从站一上电就会试图启动电机这是极其危险的。SSC 5.12在生成objdict.c时会将这些XML定义转换成一个巨大的const结构体数组。你的应用程序通过调用ecat_objdict_read()和ecat_objdict_write()函数来访问这个数组。所以OD的XML定义直接决定了你的C代码里如何处理来自主站的每一个读写请求。一个定义模糊的对象会导致主站配置工具如TwinCAT、CODESYS无法正确识别你的从站功能从而无法进行高级配置。3. STM32F4 LAN9252专属避坑指南那些让老手也抓狂的12个细节基于我亲手调试过的17块不同批次的LAN9252模块和5款不同PCB设计的STM32F4核心板我把那些文档里绝不会写、论坛里没人提、但足以让你崩溃一整天的细节浓缩成这份“血泪清单”。它们不是理论而是刻在示波器探针上的教训。3.1 坑一LAN9252的“Reset Pin”不是你想拉高就能拉高的LAN9252的RESET_N引脚是一个低电平有效的复位信号。很多原理图设计者为了“保险”会把它接到STM32F4的一个GPIO上由软件控制。这是大忌。LAN9252的复位时序要求非常苛刻RESET_N必须在VDD稳定后至少保持低电平100ms然后才能拉高。而STM32F4的GPIO在上电初期其状态是不确定的可能是高阻态、可能是高电平、也可能是低电平。如果你的GPIO在VDD刚上来时就输出了高电平LAN9252就会在电源还没稳的时候就被“误唤醒”导致内部PLL锁相失败表现为LAN9252的LINK灯不亮或者亮了但SSC扫描不到设备。正确做法RESET_N必须由一个专用的、带延时的复位芯片如TPS3808G33来驱动。该芯片的RESET输出引脚连接到LAN9252的RESET_N。同时STM32F4的NRST引脚也接到同一个复位芯片上。这样STM32F4和LAN9252会在同一时刻、以正确的时序完成复位。我在正点原子的某款开发板上就遇到过这个问题换了复位芯片后LINK灯秒亮。3.2 坑二STM32F4的“SysTick”中断优先级必须高于EtherCAT的“AL Event”中断EtherCAT从站协议栈SSC生成的ecat_main.c依赖一个高精度的定时器来处理ALApplication Layer事件比如状态机切换、PDO处理。这个定时器通常配置为STM32F4的TIM2或TIM3。而SysTick是ARM Cortex-M4内核的系统滴答定时器常被RTOS如FreeRTOS用作心跳。如果SysTick的中断优先级设置得比EtherCAT的AL Event中断还高那么当SysTick中断正在执行时AL Event中断会被挂起。一旦SysTick中断服务程序ISR执行时间过长比如在里面做了浮点运算AL Event就会被严重延迟导致从站状态机超时主站报“AL Status Error”。解决方案在main()函数初始化完所有外设后立即设置中断优先级分组并为关键中断分配优先级// 使用NVIC_PriorityGroup_4即4位抢占优先级0位响应优先级 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); // AL Event中断假设用TIM2抢占优先级设为0最高 NVIC_InitStructure.NVIC_IRQChannel TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority 0; NVIC_Init(NVIC_InitStructure); // SysTick的优先级必须设为1或更低数字越大优先级越低 SysTick_Config(SystemCoreClock / 1000); // 1ms tick NVIC_SetPriority(SysTick_IRQn, 1); // 抢占优先级为13.3 坑三XML里的Sm标签ControlByte的值不是“0x00”或“0x01”而是“0x02”和“0x04”这是LAN9252的“独门暗号”。在ETG.1020规范里Sm的ControlByte用于指示该同步管理器的方向和模式。0x00是“Idle”0x01是“Reserved”0x02是“Output”即SM0接收主站数据0x04是“Input”即SM1向主站发送数据。很多教程和旧版SSC模板里错误地将ControlByte写成了0x00或0x01导致生成的代码里LAN9252的FMMU永远不会被启用。你必须手动修改XMLSm NameSM0/Name StartAddress0x1000/StartAddress Length4/Length ControlByte0x02/ControlByte !-- 关键必须是0x02 -- Enable1/Enable /Sm Sm NameSM1/Name StartAddress0x1010/StartAddress Length4/Length ControlByte0x04/ControlByte !-- 关键必须是0x04 -- Enable1/Enable /Sm3.4 坑四STM32F4的“SRAM2”不能用于EtherCAT过程数据缓冲区STM32F407/429拥有两块SRAMSRAM1112KB地址0x20000000和SRAM216KB地址0x2001C000。SRAM2的特点是它可以通过DTCMData Tightly-Coupled Memory总线访问速度极快但有一个致命缺陷它不支持DMA的“Memory-to-Memory”模式而且其地址空间在某些情况下会被系统保留。LAN9252的DMA引擎在读写过程数据时会使用STM32F4的DMA2通道。如果把过程数据缓冲区即XML里Sm的StartAddress所映射的物理内存放在SRAM2里DMA传输会失败表现为数据永远是0xFF或0x00。铁律所有EtherCAT过程数据缓冲区必须位于SRAM1内。在你的HAL代码里确保ECAT_HW_Read/Write函数的地址转换始终指向0x20000000起始的区域。你可以用__attribute__((section(.ecat_ram)))将缓冲区变量强制链接到SRAM1的特定段。3.5 坑五SSC 5.12生成的ecat_main.c里ecat_mainloop()函数必须在while(1)里被唯一且无条件调用这是一个极其隐蔽的坑。SSC生成的ecat_mainloop()是一个状态机驱动的函数。它内部包含了对AL Status、DC Sync、PDO等所有关键状态的轮询和处理。很多开发者为了“优化性能”会把它放在一个if判断里比如// 错误示范 if (ecat_state ECAT_STATE_OPERATIONAL) { ecat_mainloop(); }这会导致灾难性后果。因为ecat_mainloop()不仅处理PDO还负责维护从站的“心跳”AL Status以及处理主站发来的各种配置请求如FOE,SoE。如果它没有被持续调用主站会认为从站“失联”并在几秒钟后将其从网络中踢出。正确的写法是把它当作一个“操作系统内核”在main()的无限循环里每一轮都无条件调用// 正确示范 while(1) { ecat_mainloop(); // 每次循环都必须调用 // 其他应用逻辑如读取传感器、控制电机... }3.6 坑六LAN9252的“Crystal Oscillator”频率必须与XML里Device的Clock标签完全一致LAN9252需要一个外部晶振来提供基准时钟常见的是25MHz。这个频率直接决定了LAN9252内部PLL的输出进而影响其EtherCAT通信的时序精度。而SSC生成的代码里有一个ecat_dc_init()函数它会根据XML中Device节点下的Clock标签来配置DCDistributed Clocks同步。如果你的硬件用的是25MHz晶振但XML里写的是Clock NameMasterClock/Name Frequency50000000/Frequency !-- 错应该是25000000 -- /Clock那么ecat_dc_init()就会用错误的倍频系数去配置LAN9252的寄存器导致DC同步失败主站报“DC Sync Error”。这个错误在低速网络100Mbps下可能“勉强工作”但在千兆网卡或长距离布线时会立刻暴露为严重的抖动Jitter。3.7 坑七STM32F4的“Flash Latency”必须设置为“5 WS”Wait StateSTM32F407/429的最高主频是168MHz。当主频超过30MHz时Flash存储器的读取速度就跟不上CPU了必须插入等待周期Wait State。如果FLASH_ACR寄存器里的LATENCY位没有正确设置CPU在执行ecat_mainloop()这样的密集计算函数时就会出现取指错误表现为程序随机跑飞、HardFault。而SSC生成的代码其ecat_mainloop()函数体积庞大对Flash访问极为频繁。因此在SystemInit()之后必须显式设置// 设置Flash等待周期为5 FLASH-ACR FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS;这个设置比任何“优化等级”都重要。我曾在一个项目中因为忘了这行代码花了两天时间排查一个“偶发性HardFault”最后发现是Flash取指失败。3.8 坑八XML里的Pdo映射PdoEntry的BitSize必须是8的整数倍PDOProcess Data Object是EtherCAT传输过程数据的基本单位。一个PDO可以包含多个PdoEntry每个PdoEntry对应一个对象字典里的条目。PdoEntry有一个关键属性BitSize它定义了该条目在PDO数据帧里占用多少位。ETG.1020规范明确规定BitSize必须是8的整数倍即1字节、2字节、4字节等。如果你试图映射一个BOOL类型1位的对象SSC会允许你写BitSize1但在生成代码时它会把这个BOOL强行塞进一个字节里导致后续所有PdoEntry的地址偏移全部错乱。主站收到的数据就是一堆无法解析的乱码。正确做法对于BOOL类型不要单独映射。应该将其打包进一个UINT8或UINT16的“位域容器”里然后映射整个容器。例如定义一个0x2000: Status Flags对象类型为UINT16然后在应用层C代码里用位操作来访问其中的各个BOOL位。3.9 坑九“Bootloader”和“Application”的内存布局冲突很多STM32F4项目采用双Bank Flash设计前64KB放Bootloader后剩余空间放Application。而SSC生成的代码默认链接到0x08000000Flash起始。如果你的Application起始地址是0x08010000那么你必须修改SSC生成的Makefile或IDE的链接脚本.ld文件将FLASH_ORIGIN改为0x08010000。否则生成的代码会尝试烧录到Bootloader区域轻则覆盖Bootloader重则让整个MCU变砖。这个修改必须在SSC生成代码后、编译前完成。3.10 坑十LAN9252的“EEPROM”不是必须的但“EEPROM Write Protect”引脚必须接地LAN9252内部集成了一个2KB的EEPROM用于存储从站的配置信息如Station Address,Alias Address。很多开发者认为既然用SSC生成了代码就不需要EEPROM了。这是误解。LAN9252在上电时会首先读取EEPROM如果读取失败比如EEPROM损坏或未焊接它会进入一种“Fallback Mode”此时它的Station Address会变成0x0000并且无法被主站正常识别。因此EEPROM是必须焊接的。但还有一个更关键的引脚WP_NWrite Protect。这个引脚必须可靠地接地GND。如果它悬空或接高电平LAN9252会认为EEPROM处于“写保护”状态导致SSC生成的ecat_eeprom_write()函数永远无法写入新的配置每次上电都还是用出厂默认地址。3.11 坑十一SSC 5.12的“Code Generation”按钮必须在“Project → Build”菜单下点击而不是工具栏图标SSC 5.12的GUI界面顶部有一个看起来很醒目的“Generate Code”图标一个齿轮。但这个图标只是一个快捷方式它背后调用的是旧版的、不稳定的代码生成器。而真正的、经过ETG认证的、与5.12版本完全匹配的代码生成器藏在菜单栏里Project → Build → Generate Code。如果你点了工具栏图标生成的代码里ecat_main.c的ecat_mainloop()函数会缺少对DC Sync的处理逻辑导致分布式时钟永远无法锁定。这个区别只有在查看SSC安装目录下的build.log文件时才能发现。我建议永远只用菜单栏的方式。3.12 坑十二STM32F4的“Debug Port”SWD在EtherCAT运行时必须保持“Enabled”这是一个反直觉的坑。为了节省功耗很多项目会在初始化完成后关闭SWD调试端口DBGMCU-CR ~DBGMCU_CR_DBG_SLEEP;。但LAN9252的固件在运行过程中会频繁地通过SWD接口与STM32F4的调试单元进行交互用于内部诊断和状态监控。如果你关闭了SWDLAN9252会检测到通信异常并主动触发一个内部复位表现为LINK灯闪烁然后熄灭。这个现象在没有任何调试器连接的情况下几乎无法被察觉。解决方法很简单在main()函数里永远不要关闭SWD// 保持SWD调试端口开启这是LAN9252的要求 // DBGMCU-CR ~DBGMCU_CR_DBG_SLEEP; // 这行代码必须删除或注释掉4. 从零开始的实操流水线一份可直接“抄作业”的完整工程搭建指南现在我们把前面所有的原理、避坑点整合成一条清晰、可执行、无需思考的“傻瓜式”操作流水线。你只需要按顺序执行每一步就能得到一个能在TwinCAT或CODESYS下被正确识别、并稳定通信的STM32F4LAN9252 EtherCAT从站工程。这个流程我已经在正点原子的STM32F407ZGT6核心板和LAN9252-EVB评估板上完整验证了7遍。4.1 准备工作环境与材料清单在开始之前请确保你手头有以下物品缺一不可硬件一块STM32F407/429系列核心板推荐正点原子战舰V3或探索者V3其原理图公开便于排查。一块LAN9252评估板推荐Microchip原厂LAN9252-EVB或国内可靠的兼容板。一根标准的RJ45网线。一台安装了TwinCAT 3或CODESYS 3的Windows PC作为EtherCAT主站。软件Java Runtime Environment (JRE) 8u202SSC 5.12官方指定版本新版JRE会导致GUI渲染异常。SSC 5.12安装包从ETG官网下载注意是5.12.0不是5.12.1或5.12.2后者有已知Bug。STM32CubeMX 6.10.0用于生成基础的MCU初始化代码。Keil MDK-ARM 5.37或STM32CubeIDE 1.13.0。文档ETG.1000EtherCAT Technology Group Specification Overview。ETG.1020EtherCAT Slave Information Specification。Microchip LAN9252 DatasheetDS00002308A。STM32F407xx Reference ManualRM0090。注意请务必使用JRE 8u202。我试过JRE 11和17SSC 5.12的GUI会出现按钮文字重叠、下拉菜单无法展开等UI问题导致根本无法进行配置。4.2 第一步用STM32CubeMX生成基础工程框架启动STM32CubeMX创建一个新工程选择MCUSTM32F407ZGT6。配置RCCHSEHigh Speed External设置为25MHz与LAN9252晶振一致SYSCLK设置为168MHzAHB Prescaler为1APB1 Prescaler为4APB2 Prescaler为2。配置GPIO将PA0配置为GPIO_Output用于点亮LED指示状态PB12-PB15配置为GPIO_Output用于LAN9252的CS_N,WR_N,RD_N,INT_NPC0-PC3配置为GPIO_Input用于LAN9252的IRQ0-IRQ3如果用到中断。配置SPILAN9252支持SPI和Parallel两种接口。我们选择更简单的Parallel模式所以不配置SPI只配置GPIO。配置时钟树确认SYSCLK168MHzHCLK168MHzPCLK142MHzPCLK284MHz。生成代码点击Project ManagerProject Name设为ECAT_SLAVEToolchain / IDE选择MDK-ARM v5勾选Generate peripheral initialization as a pair of .c/.h files per peripheral然后点击
返回列表