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

30 KiB
Raw Permalink Blame 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 使用宏定义抽象硬件层

原则: 所有硬件相关的引脚、外设句柄等都应该使用宏定义,在应用层和驱动层只使用宏名称,不直接使用具体的引脚或外设名称。

示例:

// 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

原则: 为每个功能模块创建独立的硬件抽象层,将硬件相关的操作封装在独立的模块中。

示例:

// 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中断等使用回调函数机制将硬件事件处理与业务逻辑分离。

示例:

// 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

修改内容:

// 删除旧的引脚定义
// #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

修改内容:

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

修改内容:

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的实现方式。

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控制逻辑使用正确的宏定义。

// 确保使用宏定义
HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_RESET);

注意事项:

  • 如果代码中直接使用了PA3需要改为使用宏定义RESET_Pin
  • 确保RESET控制逻辑正确

5.3 需要新增的代码文件

5.3.1 新增SPI驱动文件

创建Core/Inc/spi.hCore/Src/spi.c用于W5500模块的SPI通信。

spi.h:

#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:

#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 系统滴答定时器

文档结束