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

1130 lines
30 KiB
Markdown
Raw Permalink Normal View History

# 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 | 系统滴答定时器 |
---
**文档结束**