# STM32硬件配置对比分析报告 ## 文档信息 - **版本**: v1.0 - **日期**: 2026-03-25 - **项目**: E32-433TBH-SC - **MCU**: STM32F103C8T6 --- ## 1. 配置对比总览 ### 1.1 当前配置(去UI化后) | 功能模块 | 引脚 | 配置 | 说明 | |---------|------|------|------| | **LED指示灯** | | | | | LED_TX | PA15 | GPIO_Output, SET | 发送指示灯 | | LED_RX | PB6 | GPIO_Output, SET | 接收指示灯 | | **433模块控制** | | | | | RESET | PA3 | GPIO_Output, SET | 433模块复位 | | M0 | PA7 | GPIO_Output, SET | 模式选择0 | | M1 | PB0 | GPIO_Output, SET | 模式选择1 | | AUX | PB1 | GPIO_Input, PULLUP | 辅助信号 | | **433模块UART** | | | | | UART1_TX | PA9 | USART1_TX | 433模块发送 | | UART1_RX | PA10 | USART1_RX | 433模块接收 | | **其他功能(已废弃)** | | | | | BUZZER_PWM | PB3 | TIM2_CH2 PWM | 蜂鸣器(已删除) | | KEY_UP | PB4 | GPIO_Input | 按键上(已删除) | | USB_CTRL | PB5 | GPIO_Output | USB控制(已删除) | | KEY_ENTER | PB7 | GPIO_Input | 按键确认(已删除) | | KEY_DOWN | PB9 | GPIO_Input | 按键下(已删除) | | **I2C(已废弃)** | | | | | I2C2_SCL | PB10 | I2C_SCL | OLED时钟(已删除) | | I2C2_SDA | PB11 | I2C_SDA | OLED数据(已删除) | | **USB(已废弃)** | | | | | USB_DM | PA11 | USB_DM | USB数据负(已删除) | | USB_DP | PA12 | USB_DP | USB数据正(已删除) | | **定时器(已废弃)** | | | | | TIM2_CH2 | PB3 | PWM Generation | 蜂鸣器PWM(已删除) | ### 1.2 新配置需求 | 功能模块 | 引脚 | 配置 | 说明 | |---------|------|------|------| | **LED指示灯** | | | | | LED_TX | PB9 | GPIO_Output | 发送指示灯 | | LED_RX | PB3 | GPIO_Output | 接收指示灯 | | **开关信号输入** | | | | | MCU_DI1 | PB4 | GPIO_Input | 开关输入1 | | MCU_DI2 | PB5 | GPIO_Input | 开关输入2 | | MCU_DI3 | PB6 | GPIO_Input | 开关输入3 | | MCU_DI4 | PB7 | GPIO_Input | 开关输入4 | | **继电器控制** | | | | | RL_Control | PA15 | GPIO_Output | 继电器控制输出 | | **433模块控制** | | | | | M0 | PA7 | GPIO_Output | 模式选择0 | | M1 | PB0 | GPIO_Output | 模式选择1 | | AUX | PB1 | GPIO_Input, PULLUP | 辅助信号 | | RESET | PB2 | GPIO_Output | 433模块复位 | | **433模块UART** | | | | | UART1_TX | PA9 | USART1_TX | 433模块发送 | | UART1_RX | PA10 | USART1_RX | 433模块接收 | | **485通信** | | | | | UART3_TX | PB10 | USART3_TX | 485发送 | | UART3_RX | PB11 | USART3_RX | 485接收 | | **W5500模块** | | | | | W5500_RESET | PA8 | GPIO_Output | W5500复位 | | W5500_MOSI | PB15 | SPI_MOSI | SPI数据输出 | | W5500_MISO | PB14 | SPI_MISO | SPI数据输入 | | W5500_SCLK | PB13 | SPI_SCK | SPI时钟 | | W5500_CS | PB12 | SPI_CS | SPI片选 | | **调试串口** | | | | | UART2_TX | PA2 | USART2_TX | 调试发送 | | UART2_RX | PA3 | USART2_RX | 调试接收 | --- ## 2. 配置差异分析 ### 2.1 需要修改的配置 #### 2.1.1 LED指示灯引脚变更 | 信号 | 原引脚 | 新引脚 | 变更类型 | |------|--------|--------|----------| | LED_TX | PA15 | PB9 | 引脚变更 | | LED_RX | PB6 | PB3 | 引脚变更 | **影响范围**: - `Core/Inc/main.h`: LED引脚宏定义 - `Core/Src/gpio.c`: LED引脚初始化 - `Core/Src/gpio.c`: LED控制函数(`gpio_led_tx_on/off`, `gpio_led_rx_on/off`) **注意事项**: - LED控制函数使用宏定义,只需更新宏定义即可,函数代码无需修改 - 确保新引脚未被其他功能占用 #### 2.1.2 433模块RESET引脚变更 | 信号 | 原引脚 | 新引脚 | 变更类型 | |------|--------|--------|----------| | RESET | PA3 | PB2 | 引脚变更 | **影响范围**: - `Core/Inc/main.h`: RESET引脚宏定义 - `Core/Src/gpio.c`: RESET引脚初始化 - `Driver_RF433/Src/rf433_hal.c`: RESET控制逻辑 **注意事项**: - PA3原为RESET,现改为UART2_RX(调试串口) - 需要确保RESET控制逻辑正确更新 #### 2.1.3 删除的功能模块 | 功能模块 | 原引脚 | 删除原因 | |---------|--------|----------| | BUZZER_PWM | PB3 | 蜂鸣器功能已废弃 | | KEY_UP | PB4 | 按键功能已废弃 | | USB_CTRL | PB5 | USB功能已废弃 | | KEY_ENTER | PB7 | 按键功能已废弃 | | KEY_DOWN | PB9 | 按键功能已废弃 | | I2C2_SCL | PB10 | OLED显示已废弃 | | I2C2_SDA | PB11 | OLED显示已废弃 | | USB_DM | PA11 | USB功能已废弃 | | USB_DP | PA12 | USB功能已废弃 | | TIM2_CH2 | PB3 | 蜂鸣器PWM已废弃 | **影响范围**: - `project.ioc`: 删除相关外设配置 - `Core/Inc/main.h`: 删除相关引脚宏定义 - `Core/Src/gpio.c`: 删除相关引脚初始化 - `Core/Src/tim.c`: 删除TIM2配置 - `Core/Src/stm32f1xx_it.c`: 删除相关中断处理 **注意事项**: - 这些功能已在去UI化过程中删除,无需额外处理 - 确保相关代码已完全清理 ### 2.2 新增的配置 #### 2.2.1 开关信号输入 | 信号 | 引脚 | 配置 | 说明 | |------|------|------|------| | MCU_DI1 | PB4 | GPIO_Input | 开关输入1 | | MCU_DI2 | PB5 | GPIO_Input | 开关输入2 | | MCU_DI3 | PB6 | GPIO_Input | 开关输入3 | | MCU_DI4 | PB7 | GPIO_Input | 开关输入4 | **影响范围**: - `project.ioc`: 新增GPIO输入配置 - `Core/Inc/main.h`: 新增引脚宏定义 - `Core/Src/gpio.c`: 新增引脚初始化 **注意事项**: - 需要确定是否需要上拉/下拉电阻 - 需要确定是否需要中断功能 - 建议创建独立的GPIO控制模块 #### 2.2.2 继电器控制 | 信号 | 引脚 | 配置 | 说明 | |------|------|------|------| | RL_Control | PA15 | GPIO_Output | 继电器控制输出 | **影响范围**: - `project.ioc`: 新增GPIO输出配置 - `Core/Inc/main.h`: 新增引脚宏定义 - `Core/Src/gpio.c`: 新增引脚初始化 **注意事项**: - PA15原为LED_TX,现改为继电器控制 - 需要创建继电器控制函数 - 建议创建独立的GPIO控制模块 #### 2.2.3 485通信(UART3) | 信号 | 引脚 | 配置 | 说明 | |------|------|------|------| | UART3_TX | PB10 | USART3_TX | 485发送 | | UART3_RX | PB11 | USART3_RX | 485接收 | **影响范围**: - `project.ioc`: 新增UART3配置 - `Core/Inc/usart.h`: 新增UART3句柄声明 - `Core/Src/usart.c`: 新增UART3初始化和MSP配置 - `Core/Src/stm32f1xx_it.c`: 新增UART3中断处理 **注意事项**: - PB10/PB11原为I2C2_SCL/SDA,现改为UART3 - 需要创建独立的485通信模块 - 需要考虑485收发控制引脚(如果需要) - 建议参考UART1的实现方式 #### 2.2.4 W5500模块(SPI) | 信号 | 引脚 | 配置 | 说明 | |------|------|------|------| | W5500_RESET | PA8 | GPIO_Output | W5500复位 | | W5500_MOSI | PB15 | SPI_MOSI | SPI数据输出 | | W5500_MISO | PB14 | SPI_MISO | SPI数据输入 | | W5500_SCLK | PB13 | SPI_SCK | SPI时钟 | | W5500_CS | PB12 | SPI_CS | SPI片选 | **影响范围**: - `project.ioc`: 新增SPI配置 - `Core/Inc/main.h`: 新增引脚宏定义 - `Core/Src/gpio.c`: 新增RESET引脚初始化 - 新增SPI驱动文件(`spi.c/h`) - 新增W5500驱动模块 **注意事项**: - PA12原为USB_DP,现改为SPI_CS - 需要创建独立的W5500驱动模块 - 需要考虑SPI通信参数(时钟频率、模式等) - 建议参考STM32 HAL库的SPI示例 #### 2.2.5 调试串口(UART2) | 信号 | 引脚 | 配置 | 说明 | |------|------|------|------| | UART2_TX | PA2 | USART2_TX | 调试发送 | | UART2_RX | PA3 | USART2_RX | 调试接收 | **影响范围**: - `project.ioc`: 新增UART2配置 - `Core/Inc/usart.h`: 新增UART2句柄声明 - `Core/Src/usart.c`: 新增UART2初始化和MSP配置 - `Core/Src/stm32f1xx_it.c`: 新增UART2中断处理 **注意事项**: - PA3原为RESET,现改为UART2_RX - 需要创建独立的调试串口模块 - 建议使用printf重定向实现调试输出 - 建议参考UART1的实现方式 --- ## 3. 引脚冲突分析 ### 3.1 引脚使用冲突表 | 引脚 | 原功能 | 新功能 | 冲突状态 | 处理方式 | |------|--------|--------|----------|----------| | PA2 | 未使用 | UART2_TX | 无冲突 | 新增 | | PA3 | RESET | UART2_RX | 冲突 | RESET迁移到PB2 | | PA7 | M0 | M0 | 无冲突 | 保持不变 | | PA8 | 未使用 | W5500_RESET | 无冲突 | 新增 | | PA9 | UART1_TX | UART1_TX | 无冲突 | 保持不变 | | PA10 | UART1_RX | UART1_RX | 无冲突 | 保持不变 | | PA11 | USB_DM | 未使用 | 冲突 | USB功能删除 | | PA12 | USB_DP | 未使用 | 冲突 | USB功能删除 | | PA15 | LED_TX | RL_Control | 冲突 | LED_TX迁移到PB9 | | PB0 | M1 | M1 | 无冲突 | 保持不变 | | PB1 | AUX | AUX | 无冲突 | 保持不变 | | PB2 | 未使用 | RESET | 无冲突 | 新增 | | PB3 | BUZZER_PWM | LED_RX | 冲突 | 蜂鸣器功能删除 | | PB4 | KEY_UP | MCU_DI1 | 冲突 | 按键功能删除 | | PB5 | USB_CTRL | MCU_DI2 | 冲突 | USB功能删除 | | PB6 | LED_RX | MCU_DI3 | 冲突 | LED_RX迁移到PB3 | | PB7 | KEY_ENTER | MCU_DI4 | 冲突 | 按键功能删除 | | PB9 | KEY_DOWN | LED_TX | 冲突 | 按键功能删除 | | PB10 | I2C2_SCL | UART3_TX | 冲突 | I2C2功能删除 | | PB11 | I2C2_SDA | UART3_RX | 冲突 | I2C2功能删除 | | PB13 | 未使用 | W5500_SCLK | 无冲突 | 新增 | | PB14 | 未使用 | W5500_MISO | 无冲突 | 新增 | | PB15 | 未使用 | W5500_MOSI | 无冲突 | 新增 | ### 3.2 冲突处理总结 1. **已删除的功能**: USB、I2C2、按键、蜂鸣器等已在去UI化过程中删除,无需额外处理 2. **引脚迁移**: - LED_TX: PA15 → PB9 - LED_RX: PB6 → PB3 - RESET: PA3 → PB2 3. **新增功能**: UART2、UART3、SPI、开关输入、继电器控制等需要新增配置 --- ## 4. CubeMX配置修改指南 ### 4.1 需要删除的配置 #### 4.1.1 删除外设 1. **USB**: - 删除USB外设 - 删除USB_DEVICE中间件 - 删除USB相关中断 2. **I2C2**: - 删除I2C2外设 - 删除I2C2相关引脚配置 3. **TIM2**: - 删除TIM2外设 - 删除TIM2相关引脚配置 #### 4.1.2 删除引脚配置 删除以下引脚的GPIO配置: - PB3: BUZZER_PWM - PB4: KEY_UP - PB5: USB_CTRL - PB7: KEY_ENTER - PB9: KEY_DOWN - PB10: I2C2_SCL - PB11: I2C2_SDA - PA11: USB_DM - PA12: USB_DP ### 4.2 需要修改的配置 #### 4.2.1 修改LED引脚 1. **LED_TX**: - 原配置: PA15, GPIO_Output, GPIO_PIN_SET - 新配置: PB9, GPIO_Output, GPIO_PIN_SET 2. **LED_RX**: - 原配置: PB6, GPIO_Output, GPIO_PIN_SET - 新配置: PB3, GPIO_Output, GPIO_PIN_SET #### 4.2.2 修改RESET引脚 1. **RESET**: - 原配置: PA3, GPIO_Output, GPIO_PIN_SET - 新配置: PB2, GPIO_Output, GPIO_PIN_SET ### 4.3 需要新增的配置 #### 4.3.1 新增GPIO输入(开关信号) 1. **MCU_DI1**: PB4, GPIO_Input 2. **MCU_DI2**: PB5, GPIO_Input 3. **MCU_DI3**: PB6, GPIO_Input 4. **MCU_DI4**: PB7, GPIO_Input **配置建议**: - 根据硬件设计选择上拉或下拉 - 如果需要中断检测,配置为EXTI模式 #### 4.3.2 新增GPIO输出(继电器控制) 1. **RL_Control**: PA15, GPIO_Output, GPIO_PIN_RESET **配置建议**: - 初始状态根据硬件设计确定 - 建议使用GPIO_SPEED_FREQ_LOW #### 4.3.3 新增UART2(调试串口) 1. **外设配置**: - UART2 - 波特率: 115200(建议) - 数据位: 8 - 停止位: 1 - 校验位: None 2. **引脚配置**: - PA2: USART2_TX - PA3: USART2_RX 3. **中断配置**: - 启用UART2全局中断 - 优先级: 根据需求设置 #### 4.3.4 新增UART3(485通信) 1. **外设配置**: - UART3 - 波特率: 根据485设备要求设置 - 数据位: 8 - 停止位: 1 - 校验位: 根据需求设置 2. **引脚配置**: - PB10: USART3_TX - PB11: USART3_RX 3. **中断配置**: - 启用UART3全局中断 - 优先级: 根据需求设置 **注意事项**: - 如果需要485收发控制,需要额外配置一个GPIO引脚 - 建议参考UART1的实现方式 #### 4.3.5 新增SPI(W5500模块) 1. **外设配置**: - SPI2(建议使用SPI2,因为SPI1的引脚可能与其他功能冲突) - 模式: Mode 0或Mode 3(根据W5500要求) - 数据大小: 8 Bits - 时钟极性: Low/High - 时钟相位: 1 Edge/2 Edge - 波特率: 根据W5500要求设置(建议18MHz或更低) 2. **引脚配置**: - PB13: SPI2_SCK - PB14: SPI2_MISO - PB15: SPI2_MOSI - PA12: GPIO_Output(片选) 3. **中断配置**: - 根据需求启用SPI中断 **注意事项**: - W5500的片选建议使用软件控制,不使用硬件NSS - 需要额外配置RESET引脚(PA8) --- ## 5. 代码修改指南 ### 5.1 保持代码结构不变的设计原则 为了确保引脚更换时驱动或应用层代码不需要修改,需要遵循以下设计原则: #### 5.1.1 使用宏定义抽象硬件层 **原则**: 所有硬件相关的引脚、外设句柄等都应该使用宏定义,在应用层和驱动层只使用宏名称,不直接使用具体的引脚或外设名称。 **示例**: ```c // main.h - 硬件抽象层 #define LED_TX_Pin GPIO_PIN_9 #define LED_TX_GPIO_Port GPIOB #define LED_RX_Pin GPIO_PIN_3 #define LED_RX_GPIO_Port GPIOB #define RESET_Pin GPIO_PIN_2 #define RESET_GPIO_Port GPIOB // 应用层代码 void gpio_led_tx_on(void) { HAL_GPIO_WritePin(LED_TX_GPIO_Port, LED_TX_Pin, GPIO_PIN_RESET); } ``` **优点**: - 更改引脚时只需修改宏定义 - 应用层代码无需修改 - 提高代码可移植性 #### 5.1.2 创建独立的硬件抽象层(HAL) **原则**: 为每个功能模块创建独立的硬件抽象层,将硬件相关的操作封装在独立的模块中。 **示例**: ```c // gpio_hal.h - GPIO硬件抽象层 #ifndef __GPIO_HAL_H__ #define __GPIO_HAL_H__ #include "main.h" // LED控制 void gpio_hal_led_tx_init(void); void gpio_hal_led_tx_on(void); void gpio_hal_led_tx_off(void); void gpio_hal_led_rx_init(void); void gpio_hal_led_rx_on(void); void gpio_hal_led_rx_off(void); // 继电器控制 void gpio_hal_relay_init(void); void gpio_hal_relay_on(void); void gpio_hal_relay_off(void); // 开关输入 void gpio_hal_digital_input_init(void); uint8_t gpio_hal_digital_input_read(uint8_t channel); #endif ``` **优点**: - 硬件相关操作集中管理 - 更改硬件时只需修改HAL层 - 应用层代码与硬件解耦 #### 5.1.3 使用回调函数机制 **原则**: 对于需要处理硬件事件的功能(如UART接收、GPIO中断等),使用回调函数机制,将硬件事件处理与业务逻辑分离。 **示例**: ```c // uart_hal.h - UART硬件抽象层 #ifndef __UART_HAL_H__ #define __UART_HAL_H__ #include "main.h" #include // UART接收回调函数类型 typedef void (*uart_rx_callback_t)(uint8_t *data, uint16_t length); // UART初始化 void uart_hal_init(void); // UART发送 void uart_hal_send(uint8_t *data, uint16_t length); // 注册接收回调函数 void uart_hal_register_rx_callback(uart_rx_callback_t callback); #endif ``` **优点**: - 硬件事件处理与业务逻辑分离 - 更改硬件时只需修改HAL层 - 提高代码可维护性 ### 5.2 需要修改的代码文件 #### 5.2.1 Core/Inc/main.h **修改内容**: ```c // 删除旧的引脚定义 // #define RESET_Pin GPIO_PIN_3 // #define RESET_GPIO_Port GPIOA // #define LED_TX_Pin GPIO_PIN_15 // #define LED_TX_GPIO_Port GPIOA // #define LED_RX_Pin GPIO_PIN_6 // #define LED_RX_GPIO_Port GPIOB // 新增/修改引脚定义 #define RESET_Pin GPIO_PIN_2 #define RESET_GPIO_Port GPIOB #define LED_TX_Pin GPIO_PIN_9 #define LED_TX_GPIO_Port GPIOB #define LED_RX_Pin GPIO_PIN_3 #define LED_RX_GPIO_Port GPIOB // 新增开关输入引脚定义 #define MCU_DI1_Pin GPIO_PIN_4 #define MCU_DI1_GPIO_Port GPIOB #define MCU_DI2_Pin GPIO_PIN_5 #define MCU_DI2_GPIO_Port GPIOB #define MCU_DI3_Pin GPIO_PIN_6 #define MCU_DI3_GPIO_Port GPIOB #define MCU_DI4_Pin GPIO_PIN_7 #define MCU_DI4_GPIO_Port GPIOB // 新增继电器控制引脚定义 #define RL_Control_Pin GPIO_PIN_15 #define RL_Control_GPIO_Port GPIOA // 新增W5500相关引脚定义 #define W5500_RESET_Pin GPIO_PIN_8 #define W5500_RESET_GPIO_Port GPIOA #define W5500_CS_Pin GPIO_PIN_12 #define W5500_CS_GPIO_Port GPIOB ``` **注意事项**: - 使用宏定义,确保应用层代码无需修改 - 保持宏命名风格一致 #### 5.2.2 Core/Src/gpio.c **修改内容**: ```c void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, RESET_Pin|M1_Pin|LED_TX_Pin|RL_Control_Pin|W5500_CS_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, M0_Pin|LED_RX_Pin|W5500_RESET_Pin, GPIO_PIN_SET); /*Configure GPIO pins : RESET_Pin M1_Pin LED_TX_Pin RL_Control_Pin W5500_CS_Pin */ GPIO_InitStruct.Pin = RESET_Pin|M1_Pin|LED_TX_Pin|RL_Control_Pin|W5500_CS_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pins : M0_Pin LED_RX_Pin W5500_RESET_Pin */ GPIO_InitStruct.Pin = M0_Pin|LED_RX_Pin|W5500_RESET_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pin : AUX_Pin */ GPIO_InitStruct.Pin = AUX_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(AUX_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : MCU_DI1_Pin MCU_DI2_Pin MCU_DI3_Pin MCU_DI4_Pin */ GPIO_InitStruct.Pin = MCU_DI1_Pin|MCU_DI2_Pin|MCU_DI3_Pin|MCU_DI4_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; // 根据硬件设计调整 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` **注意事项**: - 使用宏定义,确保代码可读性 - 根据硬件设计调整上拉/下拉配置 #### 5.2.3 Core/Inc/usart.h **修改内容**: ```c extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart2; // 新增 extern UART_HandleTypeDef huart3; // 新增 void MX_USART1_UART_Init(void); void MX_USART2_UART_Init(void); // 新增 void MX_USART3_UART_Init(void); // 新增 ``` #### 5.2.4 Core/Src/usart.c **修改内容**: 新增UART2和UART3的初始化函数和MSP配置函数,参考UART1的实现方式。 ```c void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } void MX_USART3_UART_Init(void) { huart3.Instance = USART3; huart3.Init.BaudRate = 9600; // 根据485设备要求调整 huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart3) != HAL_OK) { Error_Handler(); } } ``` #### 5.2.5 Driver_RF433/Src/rf433_hal.c **修改内容**: 由于RESET引脚从PA3改为PB2,需要确保RESET控制逻辑使用正确的宏定义。 ```c // 确保使用宏定义 HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_RESET); ``` **注意事项**: - 如果代码中直接使用了PA3,需要改为使用宏定义RESET_Pin - 确保RESET控制逻辑正确 ### 5.3 需要新增的代码文件 #### 5.3.1 新增SPI驱动文件 创建`Core/Inc/spi.h`和`Core/Src/spi.c`,用于W5500模块的SPI通信。 **spi.h**: ```c #ifndef __SPI_H__ #define __SPI_H__ #ifdef __cplusplus extern "C" { #endif #include "main.h" extern SPI_HandleTypeDef hspi2; void MX_SPI2_Init(void); #ifdef __cplusplus } #endif #endif /* __SPI_H__ */ ``` **spi.c**: ```c #include "spi.h" SPI_HandleTypeDef hspi2; void MX_SPI2_Init(void) { hspi2.Instance = SPI2; hspi2.Init.Mode = SPI_MODE_MASTER; hspi2.Init.Direction = SPI_DIRECTION_2LINES; hspi2.Init.DataSize = SPI_DATASIZE_8BIT; hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; // 根据W5500要求调整 hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; // 根据W5500要求调整 hspi2.Init.NSS = SPI_NSS_SOFT; hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 根据W5500要求调整 hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi2.Init.CRCPolynomial = 10; if (HAL_SPI_Init(&hspi2) != HAL_OK) { Error_Handler(); } } ``` #### 5.3.2 新增W5500驱动模块 建议创建独立的W5500驱动模块,例如`Driver_W5500`目录,包含W5500的驱动代码。 #### 5.3.3 新增485通信模块 建议创建独立的485通信模块,例如`Driver_RS485`目录,包含485通信的驱动代码。 #### 5.3.4 新增GPIO控制模块 建议创建独立的GPIO控制模块,例如`Driver_GPIO`目录,包含开关输入和继电器控制的代码。 --- ## 6. CubeMX配置步骤 ### 6.1 删除旧配置 1. 打开`project.ioc`文件 2. 删除以下外设: - USB - USB_DEVICE - I2C2 - TIM2 3. 删除以下引脚配置: - PB3: BUZZER_PWM - PB4: KEY_UP - PB5: USB_CTRL - PB7: KEY_ENTER - PB9: KEY_DOWN - PB10: I2C2_SCL - PB11: I2C2_SDA - PA11: USB_DM - PA12: USB_DP ### 6.2 修改现有配置 1. **修改LED_TX引脚**: - 删除PA15的LED_TX配置 - 配置PB9为GPIO_Output,命名为LED_TX 2. **修改LED_RX引脚**: - 删除PB6的LED_RX配置 - 配置PB3为GPIO_Output,命名为LED_RX 3. **修改RESET引脚**: - 删除PA3的RESET配置 - 配置PB2为GPIO_Output,命名为RESET ### 6.3 新增配置 1. **新增开关输入引脚**: - 配置PB4为GPIO_Input,命名为MCU_DI1 - 配置PB5为GPIO_Input,命名为MCU_DI2 - 配置PB6为GPIO_Input,命名为MCU_DI3 - 配置PB7为GPIO_Input,命名为MCU_DI4 2. **新增继电器控制引脚**: - 配置PA15为GPIO_Output,命名为RL_Control 3. **新增UART2(调试串口)**: - 启用USART2 - 配置PA2为USART2_TX - 配置PA3为USART2_RX - 设置波特率为115200 - 启用UART2全局中断 4. **新增UART3(485通信)**: - 启用USART3 - 配置PB10为USART3_TX - 配置PB11为USART3_RX - 设置波特率(根据485设备要求) - 启用UART3全局中断 5. **新增SPI2(W5500模块)**: - 启用SPI2 - 配置PB13为SPI2_SCK - 配置PB14为SPI2_MISO - 配置PB15为SPI2_MOSI - 配置PA12为GPIO_Output,命名为W5500_CS - 配置PA8为GPIO_Output,命名为W5500_RESET - 设置SPI参数(根据W5500要求) ### 6.4 生成代码 1. 点击"GENERATE CODE"按钮 2. 等待代码生成完成 3. 检查生成的代码是否正确 --- ## 7. 代码修改步骤 ### 7.1 修改main.h 1. 打开`Core/Inc/main.h` 2. 删除旧的引脚定义 3. 新增/修改引脚定义 4. 保存文件 ### 7.2 修改gpio.c 1. 打开`Core/Src/gpio.c` 2. 修改`MX_GPIO_Init()`函数 3. 更新LED控制函数(如果需要) 4. 保存文件 ### 7.3 修改usart.h和usart.c 1. 打开`Core/Inc/usart.h` 2. 新增UART2和UART3的句柄声明 3. 新增UART2和UART3的初始化函数声明 4. 保存文件 5. 打开`Core/Src/usart.c` 6. 新增UART2和UART3的初始化函数 7. 新增UART2和UART3的MSP配置函数 8. 保存文件 ### 7.4 修改rf433_hal.c 1. 打开`Driver_RF433/Src/rf433_hal.c` 2. 检查RESET控制逻辑 3. 确保使用宏定义而不是直接使用引脚 4. 保存文件 ### 7.5 新增SPI驱动文件 1. 创建`Core/Inc/spi.h` 2. 创建`Core/Src/spi.c` 3. 实现SPI2初始化函数 4. 实现SPI2的MSP配置函数 5. 保存文件 ### 7.6 新增W5500驱动模块 1. 创建`Driver_W5500`目录 2. 创建W5500驱动文件 3. 实现W5500初始化和通信函数 4. 保存文件 ### 7.7 新增485通信模块 1. 创建`Driver_RS485`目录 2. 创建485通信驱动文件 3. 实现485通信函数 4. 保存文件 ### 7.8 新增GPIO控制模块 1. 创建`Driver_GPIO`目录 2. 创建GPIO控制驱动文件 3. 实现开关输入和继电器控制函数 4. 保存文件 --- ## 8. 编译和测试 ### 8.1 编译项目 1. 打开项目 2. 清理项目(Clean) 3. 编译项目(Build) 4. 检查编译错误和警告 ### 8.2 功能测试 1. **LED指示灯测试**: - 测试LED_TX和LED_RX是否正常工作 - 检查引脚电平是否正确 2. **433模块测试**: - 测试433模块的发送和接收功能 - 检查RESET、M0、M1、AUX引脚是否正常工作 3. **开关输入测试**: - 测试MCU_DI1~MCU_DI4是否正常读取 - 检查引脚电平是否正确 4. **继电器控制测试**: - 测试继电器控制是否正常工作 - 检查引脚电平是否正确 5. **485通信测试**: - 测试UART3的发送和接收功能 - 检查通信是否正常 6. **W5500模块测试**: - 测试W5500模块的初始化和通信功能 - 检查SPI通信是否正常 7. **调试串口测试**: - 测试UART2的发送和接收功能 - 检查调试输出是否正常 --- ## 9. 注意事项 ### 9.1 硬件设计注意事项 1. **引脚冲突**: - 确保所有引脚没有冲突 - 检查引脚是否被多个功能占用 2. **电气特性**: - 确保引脚的电气特性符合要求 - 检查上拉/下拉电阻是否正确配置 3. **时钟配置**: - 确保所有外设的时钟已正确配置 - 检查时钟频率是否符合要求 4. **中断优先级**: - 合理设置中断优先级 - 避免中断优先级冲突 ### 9.2 软件设计注意事项 1. **代码结构**: - 保持代码结构清晰 - 使用模块化设计 2. **宏定义**: - 使用宏定义抽象硬件层 - 避免在应用层直接使用硬件相关代码 3. **错误处理**: - 添加适当的错误处理 - 确保系统稳定性 4. **代码复用**: - 尽量复用现有代码 - 避免重复代码 ### 9.3 测试注意事项 1. **功能测试**: - 测试所有功能是否正常工作 - 检查边界条件 2. **性能测试**: - 测试系统性能是否满足要求 - 检查资源使用情况 3. **稳定性测试**: - 进行长时间运行测试 - 检查系统稳定性 --- ## 10. 总结 ### 10.1 配置变更总结 | 变更类型 | 数量 | 说明 | |---------|------|------| | 删除的配置 | 11 | USB、I2C2、TIM2、按键、蜂鸣器等 | | 修改的配置 | 3 | LED_TX、LED_RX、RESET引脚 | | 新增的配置 | 15 | UART2、UART3、SPI2、开关输入、继电器控制等 | ### 10.2 代码修改总结 | 修改类型 | 文件数量 | 说明 | |---------|---------|------| | 修改的文件 | 4 | main.h、gpio.c、usart.h、usart.c、rf433_hal.c | | 新增的文件 | 多个 | spi.h/c、W5500驱动、485驱动、GPIO驱动等 | ### 10.3 关键要点 1. **使用宏定义**: 所有硬件相关的引脚、外设句柄等都应该使用宏定义 2. **创建硬件抽象层**: 为每个功能模块创建独立的硬件抽象层 3. **使用回调函数**: 对于需要处理硬件事件的功能,使用回调函数机制 4. **保持代码结构**: 保持代码结构清晰,使用模块化设计 5. **充分测试**: 进行充分的功能测试、性能测试和稳定性测试 ### 10.4 后续工作 1. 完成CubeMX配置 2. 完成代码修改 3. 完成新驱动模块的开发 4. 进行功能测试 5. 进行性能测试 6. 进行稳定性测试 7. 编写使用文档 --- ## 附录A: 引脚分配表 ### A.1 完整引脚分配表 | 引脚 | 功能 | 配置 | 说明 | |------|------|------|------| | PA2 | UART2_TX | USART2_TX | 调试串口发送 | | PA3 | UART2_RX | USART2_RX | 调试串口接收 | | PA7 | M0 | GPIO_Output | 433模块模式选择0 | | PA8 | W5500_RESET | GPIO_Output | W5500复位 | | PA9 | UART1_TX | USART1_TX | 433模块发送 | | PA10 | UART1_RX | USART1_RX | 433模块接收 | | PB12 | W5500_CS | GPIO_Output | W5500片选 | | PA15 | RL_Control | GPIO_Output | 继电器控制 | | PB0 | M1 | GPIO_Output | 433模块模式选择1 | | PB1 | AUX | GPIO_Input, PULLUP | 433模块辅助信号 | | PB2 | RESET | GPIO_Output | 433模块复位 | | PB3 | LED_RX | GPIO_Output | 接收指示灯 | | PB4 | MCU_DI1 | GPIO_Input | 开关输入1 | | PB5 | MCU_DI2 | GPIO_Input | 开关输入2 | | PB6 | MCU_DI3 | GPIO_Input | 开关输入3 | | PB7 | MCU_DI4 | GPIO_Input | 开关输入4 | | PB9 | LED_TX | GPIO_Output | 发送指示灯 | | PB10 | UART3_TX | USART3_TX | 485发送 | | PB11 | UART3_RX | USART3_RX | 485接收 | | PB13 | W5500_SCLK | SPI2_SCK | W5500时钟 | | PB14 | W5500_MISO | SPI2_MISO | W5500数据输入 | | PB15 | W5500_MOSI | SPI2_MOSI | W5500数据输出 | ### A.2 未使用的引脚 | 引脚 | 说明 | |------|------| | PC14-OSC32_IN | 32.768kHz晶振输入 | | PC15-OSC32_OUT | 32.768kHz晶振输出 | | PD0-OSC_IN | 主晶振输入 | | PD1-OSC_OUT | 主晶振输出 | | PA13 | SWDIO(调试接口) | | PA14 | SWCLK(调试接口) | --- ## 附录B: 外设配置表 ### B.1 UART配置表 | 外设 | 引脚 | 波特率 | 数据位 | 停止位 | 校验位 | 用途 | |------|------|--------|--------|--------|--------|------| | UART1 | PA9/PA10 | 9600 | 8 | 1 | None | 433模块通信 | | UART2 | PA2/PA3 | 115200 | 8 | 1 | None | 调试串口 | | UART3 | PB10/PB11 | 9600 | 8 | 1 | None | 485通信 | ### B.2 SPI配置表 | 外设 | 引脚 | 模式 | 数据大小 | 时钟极性 | 时钟相位 | 波特率 | 用途 | |------|------|------|----------|----------|----------|--------|------| | SPI2 | PB13/PB14/PB15/PB12 | Master | 8 Bits | Low | 1 Edge | 18 MHz | W5500模块 | ### B.3 GPIO配置表 | 引脚 | 模式 | 上拉/下拉 | 初始状态 | 用途 | |------|------|-----------|----------|------| | PB2 | Output | None | SET | 433模块复位 | | PB3 | Output | None | SET | 接收指示灯 | | PB4 | Input | None | - | 开关输入1 | | PB5 | Input | None | - | 开关输入2 | | PB6 | Input | None | - | 开关输入3 | | PB7 | Input | None | - | 开关输入4 | | PB9 | Output | None | SET | 发送指示灯 | | PA8 | Output | None | SET | W5500复位 | | PB12 | Output | None | SET | W5500片选 | | PA15 | Output | None | RESET | 继电器控制 | --- ## 附录C: 中断配置表 | 中断 | 优先级 | 用途 | |------|--------|------| | USART1_IRQn | 0 | 433模块UART接收 | | USART2_IRQn | 1 | 调试串口接收 | | USART3_IRQn | 2 | 485通信接收 | | SysTick_IRQn | 15 | 系统滴答定时器 | --- **文档结束**