自研开发板与BSP开发全流程

张开发
2026/4/18 10:28:57 15 分钟阅读

分享文章

自研开发板与BSP开发全流程
设计开发板并自行开发BSP是一个系统性的工程涉及硬件选型、电路设计、固件开发等多个环节。以下是详细的设计与开发步骤结合具体示例进行说明。一、 开发板硬件设计硬件设计是基础需要根据目标应用明确需求。设计阶段核心任务关键考虑与示例1. 需求分析与方案制定确定开发板的核心功能、性能指标、目标应用场景和成本预算。例如设计一个用于物联网边缘计算的开发板核心需求可能包括低功耗、支持Wi-Fi/蓝牙、具备一定的算力进行传感器数据预处理。因此主控可选用集成无线功能的MCU如ESP32系列或“MCU无线模组”的组合。2. 核心器件选型选择主控制器CPU/MCU、内存、存储、电源管理芯片等。主控根据性能需求选择如STM32系列Cortex-M、i.MX RT系列Cortex-M7、全志/瑞芯微的ARM Cortex-A系列应用处理器。内存为Cortex-A处理器搭配DDR SDRAM如DDR3L为Cortex-M处理器搭配SRAM或SDRAM。存储使用SPI NOR Flash存储Bootloader使用eMMC或SD NAND存储系统镜像和数据。3. 外围电路与接口设计设计电源电路、时钟电路、复位电路、调试接口及各种功能外设接口。电源设计多路电源轨如将12V输入转换为5V、3.3V、1.8V、1.2V等需考虑纹波和负载能力。调试接口必须包含JTAG/SWD接口用于调试和烧录。外设接口根据需求添加USB、Ethernet、LCD、Camera、音频Codec、传感器I2C/SPI接口等电路的原理图设计。4. PCB设计与打样使用EDA工具如Altium Designer, KiCad进行PCB布局布线并制板。布局高速信号如DDR、USB需考虑阻抗控制和等长布线模拟与数字部分应隔离晶振靠近主控。打样与焊接发出Gerber文件给PCB工厂制板随后进行元器件贴装。二、 BSP开发流程BSP板级支持包是位于硬件与操作系统之间的软件层主要职责是初始化硬件、提供设备驱动为操作系统运行提供基础环境。1. 开发环境搭建首先为目标操作系统搭建交叉编译工具链和开发环境。# 示例为ARM Cortex-A处理器下载Linaro GCC交叉编译工具链 wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz tar -xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz export PATH$PATH:/path/to/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin2. Bootloader开发与移植Bootloader是硬件上电后运行的第一段代码负责初始化最基本的环境如CPU、内存并加载操作系统。选择Bootloader常用U-Boot其支持多种架构可移植性强。移植关键步骤创建板级目录在board/下为你开发板创建新目录如board/mycompany/myboard。编写板级初始化文件创建myboard.c实现关键的板级初始化函数如board_init()在其中配置时钟、GPIO、串口等。// board/mycompany/myboard/myboard.c 示例片段 #include common.h int board_init(void) { /* 1. 系统时钟初始化 */ clock_init(); /* 2. 串口初始化用于后续调试输出 */ uart_init(CONFIG_BAUDRATE); /* 3. 关键GPIO初始化如LED、复位引脚等 */ gpio_init(); /* 4. DDR SDRAM初始化 - 这是最关键的一步决定了系统可用内存 */ ddr_init(); gd-bd-bi_boot_params PHYS_SDRAM_1 0x100; // 设置内核启动参数地址 return 0; }配置DDR初始化这是难点需要根据板载DDR芯片的型号和布线配置正确的时序参数。通常参考芯片手册和参考设计修改drivers/ddr/下对应控制器如fsl的代码或头文件中的时序结构体。添加设备树描述在arch/arm/dts/目录下创建设备树源文件myboard.dts描述CPU、内存、外设等硬件信息。// arch/arm/dts/myboard.dts 示例片段 /dts-v1/; #include soc_specific.dtsi // 包含SoC公共定义 / { model MyCompany MyBoard; compatible mycompany,myboard, vendor,soc; // 兼容性字符串用于驱动匹配 memory80000000 { device_type memory; reg 0x80000000 0x20000000; // 定义内存起始地址和大小 (512MB) }; chosen { stdout-path uart1; // 指定标准输出串口 }; leds { compatible gpio-leds; status-led { gpios gpio2 15 GPIO_ACTIVE_LOW; // 定义一个LED default-state off; }; }; };编译与烧录配置、编译U-Boot并通过JTAG或SD卡烧录到开发板的Flash中。3. 操作系统内核移植与驱动开发以Linux为例BSP开发的核心是内核移植和设备驱动开发。内核配置与编译获取Linux内核源码为其配置适合目标处理器架构的默认配置如make ARCHarm multi_v7_defconfig然后进行详细配置。设备树Device Tree完善设备树是描述硬件拓扑结构的数据结构已取代了传统的硬编码board file。需要完善在U-Boot阶段创建的.dts文件为所有外设如网卡、USB、I2C设备添加节点描述。内核驱动通过compatible属性与设备树节点匹配。// 在myboard.dts中继续添加一个I2C接口的传感器 i2c1 { // 引用SoC定义的i2c1控制器节点 pinctrl-names default; pinctrl-0 pinctrl_i2c1; clock-frequency 100000; status okay; temperature_sensor: lm7548 { compatible national,lm75; reg 0x48; // I2C设备地址 }; };设备驱动开发对于设备树中描述的外设内核可能已有通用驱动。若无则需要开发新的驱动。一个最简单的字符设备驱动框架如下// 示例一个简单的平台设备驱动匹配设备树节点 #include linux/module.h #include linux/platform_device.h #include linux/of.h static int mydevice_probe(struct platform_device *pdev) { struct device_node *np pdev-dev.of_node; const char *str; pr_info(MyDevice Probe Function Called);// 从设备树中读取属性if (!of_property_read_string(np, custom-property, str))pr_info(Custom property value: %s, str);// ... 初始化硬件注册字符设备等操作return 0;}static const struct of_device_id mydevice_of_match[] { { .compatible mycompany,mydevice }, // 与设备树中的compatible匹配 { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, mydevice_of_match); static struct platform_driver mydevice_driver { .probe mydevice_probe, .driver { .name mydevice-driver, .of_match_table mydevice_of_match, }, }; module_platform_driver(mydevice_driver); 根文件系统构建使用BusyBox或Buildroot/Yocto Project构建一个包含基本命令和库的根文件系统并挂载到内核。4. 系统集成与调试启动流程验证上电后通过串口观察U-Boot启动日志检查CPU、DDR初始化是否成功确认能正确加载内核和设备树。内核与驱动调试使用printk输出内核日志利用proc、sys文件系统或调试器如KGDB排查驱动问题。外设功能测试编写用户空间测试程序通过系统调用或访问/sys、/dev下的节点测试各外设GPIO、I2C、SPI等功能是否正常。三、 关键挑战与建议硬件依赖性强BSP与具体硬件紧密耦合任何硬件改动如更换DDR型号、调整引脚复用都可能需要同步修改BSP代码。启动序列是核心特别是Bootloader阶段的低级硬件初始化如关闭看门狗、设置时钟、初始化DDR必须严格按照芯片手册的时序要求进行这是系统能正常启动的前提。善用参考设计芯片厂商通常会提供评估板EVB的完整硬件设计文件和BSP源码。这是最重要的参考资料可以大幅降低开发难度。应从参考设计出发逐步修改适配自己的板卡。模块化与分层思想将BSP代码按功能模块时钟、电源、存储、外设组织并与操作系统核心代码保持清晰边界。硬件抽象层HAL的设计理念有助于提升代码的可移植性和可维护性。参考来源vxWorks下BSP及其开发关于驱动程序与BSP的区别BSP概念总结嵌入式BSP的理解什么是BSP理解LINUX BSPBSP

更多文章