Files
433_STM32/docs/STM32硬件配置对比分析报告_v1.0.md

1130 lines
30 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 新增UART3485通信
1. **外设配置**:
- UART3
- 波特率: 根据485设备要求设置
- 数据位: 8
- 停止位: 1
- 校验位: 根据需求设置
2. **引脚配置**:
- PB10: USART3_TX
- PB11: USART3_RX
3. **中断配置**:
- 启用UART3全局中断
- 优先级: 根据需求设置
**注意事项**:
- 如果需要485收发控制需要额外配置一个GPIO引脚
- 建议参考UART1的实现方式
#### 4.3.5 新增SPIW5500模块
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 <stdint.h>
// 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. **新增UART3485通信**:
- 启用USART3
- 配置PB10为USART3_TX
- 配置PB11为USART3_RX
- 设置波特率根据485设备要求
- 启用UART3全局中断
5. **新增SPI2W5500模块**:
- 启用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 | 系统滴答定时器 |
---
**文档结束**