嵌入桌面 13口有线无线充电站, 1 个15W无线充, 2个65w USB type-C , 1个 5V3A type-C ,1个65w USB type-a , 9 个 普通 usb A

我将为您详细介绍并设计一个可靠、高效、可扩展的嵌入式系统平台,用于实现这款13口有线无线桌面充电站。整个设计过程将涵盖从需求分析到系统实现,再到测试验证和维护升级的完整流程,并提供超过3000行的C代码示例。

关注微信公众号,提前获取相关推文
在这里插入图片描述

1. 需求分析与系统架构设计

1.1 需求分析

  • 功能需求:

    • 多端口充电: 支持1个15W无线充电, 2个65W USB Type-C PD快充, 1个5V3A USB Type-C, 1个65W USB Type-A QC快充, 9个普通USB Type-A充电口。共计13个充电端口。
    • 功率管理: 智能分配总功率,确保所有端口在安全和效率范围内工作。需要考虑总功率限制,避免过载。
    • 充电协议支持: 支持USB PD (Power Delivery) 协议和QC (Quick Charge) 协议,以实现快速充电。同时兼容普通USB充电协议。
    • 状态指示: 通过LED指示灯或其他方式显示每个端口的充电状态 (充电中、已充满、空闲、故障)。
    • 保护机制: 具备过流保护、过压保护、过温保护、短路保护等安全机制,确保设备和被充电设备的安全性。
    • 散热设计: 考虑设备长时间工作时的散热问题,可能需要风扇或其他散热方案。
    • 用户交互: 简洁的用户界面,例如LED指示灯,方便用户了解充电状态。 (更高级的设计可以考虑增加显示屏或App控制,但此处主要考虑嵌入式系统本身的功能实现)。
    • 固件升级: 支持固件在线升级,方便后期功能扩展和bug修复。
  • 非功能需求:

    • 可靠性: 系统必须稳定可靠,长时间运行不崩溃。
    • 高效性: 功率转换效率高,减少能量损耗。充电速度快。
    • 可扩展性: 系统架构应易于扩展,方便未来增加新的功能或端口类型。
    • 实时性: 实时监控电压、电流、温度等参数,及时响应异常情况。
    • 低功耗 (待机状态): 在没有设备充电时,系统应尽可能降低功耗。
    • 易维护性: 代码结构清晰,模块化设计,方便后期维护和升级。

1.2 系统架构设计

为了满足上述需求,我们采用分层架构模块化设计。这种架构具有良好的可扩展性、可维护性和可靠性。

系统架构主要分为以下几个层次:

  1. 硬件层 (Hardware Layer):

    • 主控芯片 (MCU): 负责整个系统的控制和管理,例如STM32系列高性能MCU。
    • 电源管理芯片 (PMIC): 负责电压转换、功率分配、电池充电管理等,例如TI的TPS6598x系列PD控制器或Richtek的RT7736C等QC/PD协议芯片。
    • USB 端口控制器: 负责USB接口的物理层和协议层,例如USB集线器芯片。
    • 无线充电发射器: 负责无线充电功能的硬件模块,例如IDT P9235A。
    • 电流/电压传感器: 用于实时监测各端口的电流和电压。
    • 温度传感器: 用于监测系统温度,实现过温保护。
    • LED指示灯: 用于显示充电状态。
    • 散热系统 (风扇/散热片): 根据功率需求选择合适的散热方案。
    • 电源输入接口: 连接外部电源适配器。
  2. 硬件抽象层 (HAL - Hardware Abstraction Layer):

    • HAL层提供对硬件层的抽象接口,向上层屏蔽硬件差异。例如,提供统一的GPIO控制接口、ADC读取接口、I2C/SPI通信接口等。这使得上层代码可以独立于具体的硬件平台进行开发和移植。
  3. 驱动层 (Driver Layer):

    • 驱动层建立在HAL层之上,为上层提供更高级别的硬件驱动服务。例如,PMIC驱动、USB PD协议驱动、QC协议驱动、无线充电驱动、传感器驱动、LED驱动等。 驱动层负责初始化硬件模块,并提供操作硬件模块的API。
  4. 核心服务层 (Core Service Layer):

    • 电源管理服务 (Power Management Service): 核心模块,负责功率分配、端口管理、充电协议协商、保护机制实现等。根据系统总功率限制和各端口的需求,智能分配功率。
    • 充电协议管理服务 (Charging Protocol Service): 处理USB PD和QC协议的协商和通信,根据设备需求选择合适的充电电压和电流。
    • 状态监控服务 (Status Monitoring Service): 定期读取传感器数据,监控电压、电流、温度等参数,检测异常情况并触发保护机制。
    • LED控制服务 (LED Control Service): 控制LED指示灯的显示,反映端口状态。
    • 固件升级服务 (Firmware Update Service): 实现固件在线升级功能。
  5. 应用层 (Application Layer):

    • 应用层是最高层,负责系统初始化、任务调度、用户交互 (如果需要,例如更高级的UI) 和系统监控等。在本项目中,应用层主要负责初始化各个服务模块,并根据状态监控服务的结果,更新LED指示灯状态。

系统架构图:

+---------------------+   +---------------------+   +---------------------+   +---------------------+
|    应用层 (Application Layer)    |---|    核心服务层 (Core Service Layer)   |---|     驱动层 (Driver Layer)      |---|    硬件层 (Hardware Layer)     |
+---------------------+   +---------------------+   +---------------------+   +---------------------+
        |                       |                       |                       |
        |  系统初始化、任务调度、用户交互 (可选) |  电源管理服务、充电协议服务、状态监控服务、LED控制服务、固件升级服务 | PMIC驱动、USB PD驱动、QC驱动、无线充电驱动、传感器驱动、LED驱动 |  MCU, PMIC, USB控制器, 无线充电, 传感器, LED, 散热系统, 电源接口 |
        |                       |                       |                       |
        +---------------------+   +---------------------+   +---------------------+   +---------------------+

1.3 模块划分

根据系统架构,我们将系统划分为以下模块:

  • HAL模块 (HAL): 包含GPIO, ADC, I2C, SPI, Timer等HAL驱动。
  • PMIC驱动模块 (PMIC_Driver): 负责PMIC芯片的初始化和控制。
  • USB PD驱动模块 (USB_PD_Driver): 实现USB PD协议栈。
  • QC驱动模块 (QC_Driver): 实现QC协议栈。
  • 无线充电驱动模块 (Wireless_Charger_Driver): 负责无线充电芯片的控制。
  • 传感器驱动模块 (Sensor_Driver): 负责电流、电压、温度传感器的驱动。
  • LED驱动模块 (LED_Driver): 负责LED灯的控制。
  • 电源管理模块 (Power_Manager): 核心模块,实现功率分配和保护逻辑。
  • 状态监控模块 (Status_Monitor): 负责监控系统状态和异常检测。
  • 固件升级模块 (Firmware_Update): 实现固件升级功能。
  • 应用模块 (Application): 系统初始化和任务调度。

2. 代码设计与C代码实现

接下来,我们将详细介绍每个模块的代码设计,并提供C代码示例。由于代码量较大,我们将重点展示关键模块的代码框架和核心功能实现,并给出详细的注释。为了达到3000行代码的要求,我们将尽可能详细地展开每个模块的实现,包括数据结构定义、函数原型、函数实现、错误处理、配置选项等。

2.1 HAL模块 (HAL)

hal.h

#ifndef HAL_H
#define HAL_H

#include <stdint.h>
#include <stdbool.h>

// GPIO 定义
typedef enum {
   
    GPIO_PIN_0,
    GPIO_PIN_1,
    GPIO_PIN_2,
    // ... 更多GPIO引脚定义
    GPIO_PIN_MAX
} GPIO_PinTypeDef;

typedef enum {
   
    GPIO_MODE_INPUT,
    GPIO_MODE_OUTPUT,
    // ... 更多GPIO模式
} GPIO_ModeTypeDef;

typedef enum {
   
    GPIO_OUTPUT_PP, // 推挽输出
    GPIO_OUTPUT_OD, // 开漏输出
} GPIO_OutputTypeDef;

typedef enum {
   
    GPIO_PULL_NONE,
    GPIO_PULL_UP,
    GPIO_PULL_DOWN,
} GPIO_PullTypeDef;

typedef struct {
   
    GPIO_PinTypeDef Pin;
    GPIO_ModeTypeDef Mode;
    GPIO_OutputTypeDef OutputType;
    GPIO_PullTypeDef Pull;
} GPIO_InitTypeDef;

void HAL_GPIO_Init(GPIO_InitTypeDef *GPIO_Init);
void HAL_GPIO_WritePin(GPIO_PinTypeDef Pin, bool PinState);
bool HAL_GPIO_ReadPin(GPIO_PinTypeDef Pin);

// ADC 定义
typedef enum {
   
    ADC_CHANNEL_0,
    ADC_CHANNEL_1,
    // ... 更多ADC通道定义
    ADC_CHANNEL_MAX
} ADC_ChannelTypeDef;

void HAL_ADC_Init();
uint16_t HAL_ADC_GetValue(ADC_ChannelTypeDef Channel);

// I2C 定义 (简略示例,实际I2C HAL会更复杂)
typedef enum {
   
    I2C_SPEED_STANDARD,
    I2C_SPEED_FAST,
} I2C_SpeedTypeDef;

void HAL_I2C_Init(I2C_SpeedTypeDef Speed);
bool HAL_I2C_Master_Transmit(uint8_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
bool HAL_I2C_Master_Receive(uint8_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);

// SPI 定义 (简略示例)
typedef enum {
   
    SPI_SPEED_LOW,
    SPI_SPEED_MEDIUM,
    SPI_SPEED_HIGH,
} SPI_SpeedTypeDef;

void HAL_SPI_Init(SPI_SpeedTypeDef Speed);
bool HAL_SPI_TransmitReceive(uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);

// Timer 定义 (简略示例)
typedef void (*TimerCallbackTypeDef)(void);

void HAL_Timer_Init(uint32_t Period_ms, TimerCallbackTypeDef Callback);
void HAL_Timer_Start();
void HAL_Timer_Stop();

#endif // HAL_H

hal_gpio.c (示例,假设使用STM32 HAL库风格)

#include "hal.h"
#include "stm32xxx_hal.h" // 假设使用STM32 HAL库

void HAL_GPIO_Init(GPIO_InitTypeDef *GPIO_Init) {
   
    GPIO_InitTypeDefTypeDef GPIO_InitStruct_LL; // STM32 LL库的GPIO结构体

    // 将HAL层结构体转换为LL库结构体 (简化示例)
    GPIO_InitStruct_LL.Pin = (1 << GPIO_Init->Pin); // 假设 Pin 是枚举值,需要转换为位掩码
    if (GPIO_Init->Mode == GPIO_MODE_OUTPUT) {
   
        GPIO_InitStruct_LL.Mode = LL_GPIO_MODE_OUTPUT;
        if (GPIO_Init->OutputType == GPIO_OUTPUT_PP) {
   
            GPIO_InitStruct_LL.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
        } else {
   
            GPIO_InitStruct_LL.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
        }
    } else if (GPIO_Init->Mode == GPIO_MODE_INPUT) {
   
        GPIO_InitStruct_LL.Mode = LL_GPIO_MODE_INPUT;
    }
    // ... 根据 GPIO_Init->Pull 设置上拉/下拉

    LL_GPIO_Init(GPIOA, &GPIO_InitStruct_LL); // 假设使用GPIOA,实际需要根据具体硬件配置
    // ... 使能 GPIO 时钟 (需要在实际的 STM32 代码中添加)
}

void HAL_GPIO_WritePin(GPIO_PinTypeDef Pin, bool PinState) {
   
    if (PinState) {
   
        LL_GPIO_SetOutputPin(GPIOA, (1 << Pin)); // 设置高电平
    } else {
   
        LL_GPIO_ResetOutputPin(GPIOA, (1 << Pin)); // 设置低电平
    }
}

bool HAL_GPIO_ReadPin(GPIO_PinTypeDef Pin) {
   
    return LL_GPIO_IsInputPinSet(GPIOA, (1 << Pin));
}

hal_adc.c (示例)

#include "hal.h"
#include "stm32xxx_hal.h" // 假设使用STM32 HAL库

void HAL_ADC_Init() {
   
    // 初始化 ADC 外设,例如使能时钟,配置采样时间,分辨率等
    // ... 使用 STM32 LL 库进行 ADC 初始化
    LL_ADC_InitTypeDef ADC_InitStruct_LL;
    LL_ADC_REG_InitTypeDef ADC_REG_InitStruct_LL;

    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1); // 使能 ADC1 时钟

    ADC_InitStruct_LL.ClockPrescaler = LL_ADC_CLOCK_SYNC_PCLK_DIV4; // 假设时钟预分频
    ADC_InitStruct_LL.Resolution = LL_ADC_RESOLUTION_12B;
    ADC_InitStruct_LL.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
    ADC_InitStruct_LL.SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE; // 禁用扫描模式
    LL_ADC_Init(ADC1, &ADC_InitStruct_LL);

    ADC_REG_InitStruct_LL.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE; // 软件触发
    ADC_REG_InitStruct_LL.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE; // 禁用序列扫描
    ADC_REG_InitStruct_LL.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE; // 禁用不连续模式
    ADC_REG_InitStruct_LL.ContinuousMode = LL_ADC_REG_CONV_SINGLE; // 单次转换模式
    ADC_REG_InitStruct_LL.DMATransfer = LL_ADC_REG_DMA_DISABLE; // 禁用 DMA
    LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct_LL);

    LL_ADC_Enable(ADC1); // 使能 ADC1
    LL_ADC_REG_StartConversionSWStart(ADC1); // 启动软件转换
}

uint16_t HAL_ADC_GetValue(ADC_ChannelTypeDef Channel) {
   
    uint32_t adc_channel_ll;
    switch (Channel) {
   
        case ADC_CHANNEL_0: adc_channel_ll = LL_ADC_CHANNEL_0; break;
        case ADC_CHANNEL_1: adc_channel_ll = LL_ADC_CHANNEL_1; break;
        // ... 更多通道映射
        default: return 0; // 错误处理
    }

    LL_ADC_REG_SetSequencerChannels(ADC1, adc_channel_ll); // 设置 ADC 通道
    LL_ADC_REG_StartConversionSWStart(ADC1); // 启动转换
    while (!LL_ADC_IsActiveFlag_EOCS(ADC1)) {
   } // 等待转换完成
    return LL_ADC_REG_ReadConversionData12(ADC1); // 读取 ADC 值
}

hal_i2c.chal_spi.c 以及 hal_timer.c 的实现方式类似,需要根据具体的硬件平台和外设库进行编写。此处为了简洁,不再详细展开。

2.2 PMIC驱动模块 (PMIC_Driver)

假设我们使用 TI 的 TPS65987D PD 控制器。驱动模块需要实现对该芯片的初始化、配置和控制。

pmic_driver.h

#ifndef PMIC_DRIVER_H
#define PMIC_DRIVER_H

#include <stdint.h>
#include <stdbool.h>

typedef enum {
   
    PMIC_PORT_TYPE_C1 = 0, // Type-C Port 1 (例如 65W PD)
    PMIC_PORT_TYPE_C2,     // Type-C Port 2 (例如 65W PD)
    PMIC_PORT_TYPE_C3,     // Type-C Port 3 (例如 5V3A)
    PMIC_PORT_TYPE_A1,     // Type-A Port 1 (例如 65W QC)
    // ... 可以根据实际 PMIC 支持的端口定义更多类型
    PMIC_PORT_MAX
} PMIC_PortTypeDef;

typedef enum {
   
    PMIC_POWER_ROLE_SOURCE,
    PMIC_POWER_ROLE_SINK,
    PMIC_POWER_ROLE_DUAL, // 可作为 Source 或 Sink
} PMIC_PowerRoleTypeDef;

typedef struct {
   
    PMIC_PortTypeDef Port;
    PMIC_PowerRoleTypeDef PowerRole;
    // ... 其他配置参数,例如默认电压、电流限制等
} PMIC_PortConfigTypeDef;

bool PMIC_Init();
bool PMIC_Port_Configure(PMIC_PortConfigTypeDef *config);
bool PMIC_Port_EnablePower(PMIC_PortTypeDef Port, bool enable);
bool PMIC_Port_GetStatus(PMIC_PortTypeDef Port, uint32_t *status); // 返回端口状态信息
bool PMIC_Port_SetVoltage(PMIC_PortTypeDef Port, uint32_t voltage_mv);
bool PMIC_Port_SetCurre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式程序员小刘

很高兴文章有帮助到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值