STM32F407ZGT6引脚功能和定义

CAN:PA11,PA12
RS485:PC12,PD2
串口:PA9,PA10
网口:PC4,PC5,PA1,PG13,PG14,PG11,PD3,PC1,PA2,PA7;
LED心跳:PF9,PF10

W25Q64:PG15,PB4,PA5,PB5

IO输入:PE2,PE3,PF6,PF7,PF8,PE4,PC13,PF11

IO输出:TIM5_CH4:PA3,TIM1_CH1:PA8,TIM9_CH1:PE5,TIM9_CH2:PE6,TIM10_CH1:PB8,TIM11_CH1:PB9,TIM12_CH1:PB14,TIM12_CH2:PB15

                                    3个编码器接口所占用资源
作用编码器2编码器3编码器1计算编码器速度
定时器TIM2TIM3TIM4TIM6
IO口PA0,PB3PA6,PC7PB6,PB7

步进电机接口:

PUL引脚:定时器8的通道1,3,4;

DIR1:PC11,EN1:PG8,PUL1:PC6;
DIR2:PC10,EN2:PG7,PUL2:PC8;
DIR3:PA15,EN3:PG6,PUL3:PC9;

SRAM:

  • 地址线(A0 - A17):A0(SRAM_PF4)、A1(SRAM_PF0)、A2(SRAM_PF1)、A3(SRAM_PF2)、A4(SRAM_PF3)、A5(SRAM_PD17)、A6(SRAM_PD16)、A7(SRAM_PD10)、A8(SRAM_PD9)、A9(SRAM_PD8)、A10(SRAM_PD7)、A11(SRAM_PD6)、A12(SRAM_PD5)、A13(SRAM_PD4)、A14(SRAM_PD3)、A15(SRAM_PD2)、A16(SRAM_PD1)、A17(SRAM_PD0)

  • 数据线(D0 - D15):D0(SRAM_PD15)、D1(SRAM_PD14)、D2(SRAM_PD13)、D3(SRAM_PD12)、D4(SRAM_PE15)、D5(SRAM_PE14)、D6(SRAM_PE13)、D7(SRAM_PE12)、D8(SRAM_PE11)、D9(SRAM_PE10)、D10(SRAM_PE9)、D11(SRAM_PE8)、D12(SRAM_PE7)、D13(SRAM_PE6)、D14(SRAM_PE5)、D15(SRAM_PE4)

  • 控制信号线:OEn(SRAM_PC1)、WE(SRAM_PC0)、BHEn(SRAM_PE1)、BLEn(SRAM_PE0)、CEn(SRAM_PD11)


程序思路:

系统分层架构

🧩 一、启动层(Startup Layer)

📁 典型目录:Startup/

作用

  • 负责系统最底层的初始化,是程序运行的起点。

  • 设置堆栈、向量表、中断入口地址。

  • 跳转到 main()

主要内容

  • startup_stm32f407xx.s(汇编启动文件)

  • _vector_table 中断向量表定义

👉 一句话总结:上电后 CPU 从这里开始跑,最终跳到 main()


⚙️ 二、系统层(System Layer)

📁 典型目录:Drivers/SYSTEM/

作用

  • 提供系统级初始化和公共基础功能。

  • 给驱动层和应用层提供通用支持。

主要内容

  • 系统时钟配置(system_clock.c

  • 中断优先级管理

  • 延时函数、SysTick管理

  • printf重定向、调试输出

  • 任务调度基础接口(如果FreeRTOS集成)

👉 一句话总结:负责 MCU “环境搭好”,时钟、调试、中断都在这里准备好。


🔧 三、驱动层(Driver Layer)

📁 典型目录:Drivers/BSP/Drivers/STM32F4xx_HAL_Driver/

作用

  • 封装对硬件的直接操作(即驱动层 = HAL + BSP)。

  • 为上层提供统一的硬件访问接口。

划分两部分

层次内容
HAL 驱动(底层)ST 官方库,直接操作寄存器。
BSP 驱动(板级)封装 HAL,针对你的板子功能,比如 LED、CAN、IO、步进电机、编码器、RS485、Flash。

例子

  • bsp_led.c → 控制LED

  • bsp_motor.c → 控制步进电机

  • bsp_encoder.c → 编码器读取

  • bsp_can.c → CAN收发封装

  • bsp_w25q64.c → SPI Flash驱动

👉 一句话总结:屏蔽底层差异,上层只管调用函数比如 LED_Toggle()Motor_Run()


🧠 四、中间层(Middleware Layer)

📁 典型目录:Middlewares/

作用

  • 提供通用的协议栈、内核、内存管理等功能。

  • 它是驱动和应用之间的“协议/系统中间件”。

主要内容

  • FreeRTOS/ :实时系统内核(任务、信号量、队列)

  • lwIP/ :TCP/IP 协议栈

  • MALLOC/ :内存管理

  • USMART/ :调试命令接口

  • (你后期可以加)ModbusTCP/ :协议解析任务

👉 一句话总结:相当于操作系统和通信协议的“软件中间件”。


🚀 五、应用层(Application Layer)

📁 典型目录:User/(可以再细分出 App/

作用

  • 实现系统的业务逻辑和控制策略。

  • 创建任务、管理场景、执行功能。

建议结构

子模块说明
main.c系统入口,启动 FreeRTOS、创建任务
app_task.c各种任务函数(通信、控制、监测)
scene_manager.c场景切换逻辑(对应你的场景1~11)
modbus_parser.cTCP指令解析
io_control.cIO输入检测与报警输出
motor_ctrl.c步进电机控制(调用 BSP 层)

👉 一句话总结:这是整个系统“思考和决策”的层,调用下层实现所有功能。


📘 总结一句话版

层级职责举例
启动层上电启动、跳转到mainstartup_stm32f407xx.s
系统层时钟、中断、延时、系统基础system_init.c
驱动层封装硬件接口、屏蔽底层差异bsp_led.c, bsp_motor.c
中间层操作系统与协议栈支持FreeRTOS, lwIP, ModbusTCP
应用层实现具体业务逻辑和场景控制main.c, app_task.c

1,急停按钮,1个输入io(PE7使用外部中断)
2,限位接口,4个输入io,还剩余3个()
3,报警灯接口,6个输出io口,还剩余2个
DB15思路:电机口:12个;io输入口,8个,io输出口8个,编码器接口:12个
4个DB15接口
那么急停按钮怎么快速响应呢?有按钮按下立即执行电机停止,限位接收到信号,电机向反方向进行运行;

IO触发场景:当8路输入io来信号时,通过tcp主动发送指令给上位机,接受上位机信号控制8路输出io。

场景三:上位机通过指令,通过网口tcp进行读取编码器脉冲数和速度;

场景四:上位机通过指令,通过网口tcp进行控制步进电机直线插补或圆弧插补,当触发限位信号时,停止运动;

场景五:通过上位机指令进行控制一个步进电机,向一个方向运行,当触发限位信号向反方向运行,两个限位信号,刚好在里面来回运动;

场景六:当控制4轴步进电机时,可以通过CAN进行模块连接通信,然后实现4轴的控制,可以对四轴进行电机正翻转,速度控制,配合编码器进行闭环控制;控制电机到达指定位置;可以通过急停按钮进行暂停保护;

场景七:当要实现多组io接受时,主动发送给上位机时,io口不够用,可以通过RS485进行IO扩展

,读取信号,主动发送给上位机状态

场景八:当要实现多路io输出,可以通过rs485进行扩展输出,通过上位机指令进行io输出控制;

扩展:

场景九:可以控制有刷电机闭环控制,控制速度和运行到指定位置;

场景十:可以进行无刷电机的闭环控制;

场景十一:进行FOC控制

功能设想:板子作为服务端,连上串口LED0闪烁,可以进行串口调试,板子默认远程地址:192.168.1.30;本地地址:192.168.1.33;如果跟其他设备有冲突,可以通过串口进行更改远程地址和本地地址,也可以进行场景功能切换;然后当连上tcp通信时,LED1闪烁可以通过tcp进行模式的指令的接收,可以切换场景模式,以及设备发送给上位机的指令,和上位机发给下位机其他操作指令,通过modbus tcp协议;使用modbustcp进行控制,定义一下八种模式的切换对应modbustcp指令,

在freertos中创建一个任务进行modbustcp的解析,通过解析得到的数据进行场景任务切换。

例如模式切换完之后,要保存到W25Q64当中,当设备断电时,不用重新配置,直接读取W25Q64当中的内容,进行模式的切换;

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐