驱动、BSP、HAL三者的区别和联系

别再傻傻分不清了!嵌入式开发中BSP和驱动的区别,用树莓派和ESP32举个例子 本文深入解析嵌入式开发中BSP(板级支持包)与驱动的本质区别,通过树莓派和ESP32的实战案例,详细阐述BSP的硬件初始化、内存配置等基础任务,以及驱动实现外设功能的核心作用。文章还提供了跨平台驱动开发的关键技巧和调试工具,帮助开发者高效解决BSP与驱动的协同问题。 阅读详情
AI摘要

本文解析了驱动、BSP和HAL的概念及职责,阐述了它们在嵌入式系统中的作用与相互关系,强调了三者如何协同工作以实现软硬件的无缝连接。

目录

引言

一、驱动(Driver)

二、板级支持包(BSP, Board Support Package)

三、硬件抽象层(HAL, Hardware Abstraction Layer)

四、区别与联系

五、总结


🌈你好呀!我是 程序猿

🌌 2024感谢你的陪伴与支持 ~

🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!


引言

        驱动(Driver)、板级支持包(BSP, Board Support Package)和硬件抽象层(HAL, Hardware Abstraction Layer)是嵌入式系统开发中常见的概念,它们各自有不同的职责,但往往紧密相关,协同工作以实现硬件与软件之间的无缝连接。

一、驱动(Driver)

定义: 驱动程序是直接与硬件设备交互的软件组件。它们为操作系统或应用程序提供控制硬件的接口。

职责:

  • 控制和管理硬件设备。
  • 处理设备特定的操作,例如初始化、读写数据、中断处理等。
  • 提供标准化的接口,使得上层应用无需关心硬件的具体实现细节。

示例:

  • I2C驱动、SPI驱动、UART驱动、GPIO驱动等。

二、板级支持包(BSP, Board Support Package)

定义: BSP是用于特定硬件平台的一组软件组件,通常包括启动代码、驱动程序和其他与硬件相关的软件库。

职责:

  • 提供对特定硬件平台的支持,使操作系统能够在该平台上运行。
  • 包含初始化代码(如启动代码和引导加载程序)和硬件抽象层(HAL)。
  • 集成各种驱动程序,确保操作系统能够正确识别和使用硬件功能。

组成:

  • 启动代码:负责系统上电后的硬件初始化,如设置时钟、初始化存储器等。
  • 硬件抽象层(HAL):提供硬件接口的抽象层。
  • 设备驱动:针对特定硬件的驱动程序。

示例:

  • 用于特定单片机或开发板的BSP,如STM32的BSP包,包含启动代码、时钟配置、外设驱动等。

三、硬件抽象层(HAL, Hardware Abstraction Layer)

定义: HAL是介于底层硬件和上层软件之间的一层抽象层,用于隐藏硬件的具体实现细节,提供统一的接口。

职责:

  • 抽象硬件细节,提供易于使用的API。
  • 提高代码的可移植性,使得上层应用和中间件无需关心底层硬件的具体实现。
  • 通常由硬件厂商提供,帮助开发者快速开发和移植应用。

组成:

  • 各种外设的抽象层接口函数,例如GPIO、UART、I2C、SPI等。

示例:

  • STM32 HAL库,提供了对STM32系列微控制器外设的抽象和访问。

四、区别与联系

  • 区别:

    • 驱动: 专注于与特定硬件设备的直接交互,实现设备的操作功能。
    • BSP: 针对特定硬件平台,包含启动代码、HAL以及驱动等,是使操作系统能运行在特定硬件上的一整套方案。
    • HAL: 提供硬件的抽象接口,隐藏具体硬件实现细节,提高代码的可移植性。
  • 联系:

    • 驱动与BSP: BSP包含了驱动程序,驱动是BSP中的一部分,通过BSP,操作系统可以调用驱动程序来控制硬件。
    • 驱动与HAL: HAL可以调用底层驱动程序实现硬件操作,驱动实现硬件的具体操作,HAL则提供更高层次的抽象接口。
    • BSP与HAL: BSP包含HAL,HAL是BSP的一部分,提供硬件访问的抽象接口。

五、总结

        驱动、BSP和HAL在嵌入式系统中分别扮演着不同但互补的角色。驱动程序直接与硬件交互,BSP提供特定硬件平台的全面支持,而HAL则通过抽象硬件细节来提高代码可移植性。这三者的协同工作是实现嵌入式系统软硬件结合的关键。

​期待批评指正,共同进步~

嵌入式:BSP的理解 阅读详情

相关推荐

关于驱动程序与BSP的区别

BSP即Board Support Package,板级支持包。它来源于嵌入式操作系统与硬件无关的设计思想,操作系统被设计为运行在虚拟的硬件平台上。对于具体的硬件平台,与硬件相关的代码都被封装在BSP中,由BSP向上提供虚拟的硬件平台,BSP与操作系统通过定义好的接口进行交互。BSP是所有与硬件相关的代码体的集合。 BSP在嵌入式系统中的角色,很相似于在PC系统中的BIOS和驱动程序的地位。 BSP就看成BIOS+驱动或者bootloader+驱动 BSP和驱动的区别:bsp还包括了bootloader,或

qq_38769551的博客 2万+

什么是BSP?理解LINUX BSP

例如 VxWorks 的BSP 和 Linux 的 BSP 相对于某一 CPU 来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写 BSP 一定要按照该系统 BSP 的定义形式来写,这样才能与上层 OS 保持正确的接口。由于 BSP 处于在硬件和操作系统、上层应用程序之间,因此 BSP 程序员需要对硬件、软件和操作系统都要有一定的了解。

usstmiracle的博客 3万+

从零开始:如何为STM32开发板定制BSP(含HAL库实战)

本文详细介绍了如何从零开始为STM32开发板定制BSP(板级支持包),并结合HAL库进行实战开发。内容涵盖BSP与HAL库的核心概念、开发环境搭建、时钟系统配置、GPIO驱动设计、中断与DMA应用,以及外设驱动开发与集成测试,旨在帮助嵌入式开发者快速适配定制硬件,提升代码可移植性和开发效率。

tgb345678的博客 610

嵌入式驱动分层设计:BSP、HAL、Driver、Service、Application一次讲清楚

负责最终产品功能Service负责业务规则、滤波、报警和状态机Driver负责具体设备控制和数据转换BSP / HAL负责板级资源和底层硬件接口硬件负责真正的电信号、寄存器和外设动作硬件层温度传感器和I2C总线BSP/HAL层完成I2C发送、接收和延时Driver层读取温度寄存器并转换成摄氏度Service层执行滤波、阈值判断和报警策略Application层控制风扇并向上位机上报告警分层设计并不是为了把简单代码复杂化,而是为了让复杂项目保持清晰。

m0_69912407的博客 764

【软件系统架构】系列四:设备驱动与板级支持包(BSP)

核心目标: 让操作系统/应用程序能够透明地、高效地使用硬件资源。

moton2017的博客 1267

【4. BSP开发指南 - [4.3. 驱动开发指南]】

4. BSP开发指南 - [4.3. 驱动开发指南]】

Sugar_wolf的博客 1130

BSP与HAL关系

就我跟人理解而言BSP就是硬件驱动程序,它包含了操控硬件的必要函数,单片机系统使用BSP可以直接进行应用开发,这时候应用开发的hierarchy如下图所示: 但是由于日益增长的芯片种类和芯片复杂度,直接使用BSP进行应用开发将会受到巨大的挑战,因此为了程序的可阅读性以及可移植性提出了硬件抽象层HAL这...

kyo_的博客 1万+

利用python爬取东方财富网股吧评论并进行情感分析(一)

利用python爬取东方财富网股吧评论(一) python-东方财富网贴吧文本数据爬取 分享一下写论文时爬数据用到的代码,有什么问题或者改善的建议的话小伙伴们一起评论区讨论。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可以将本地的图片直

YMG521000的博客 1万+

BSP概述

嵌入式计算机系统的组成: 1)硬件层 硬件层中包含嵌入式微处理器、存储器(SDRAM、ROM、Flash等)、通用设备接口和 I/O接口(A/D、D/A、I/O等)备。在一片嵌入式处理器基础上添加电源电路、时钟电路和存储器电路,就构成了一个嵌入式核心控制模块。 其中操作系统和应用程序都可以固化在ROM中。 2)中间层 硬件层与软件层之间为中间层,也称为硬件抽象层(Hardware Abstract Layer,HAL)或板级支持包(Board Support Package,BSP...

reason的博客 2万+

密码学新手必看:三大顶级会议论文下载与阅读指南(附完整资源链接)

本文为密码学新手提供了系统性的三大顶级会议(Crypto、Eurocrypt、Asiacrypt)论文学习指南。内容涵盖如何高效获取最新论文资源、结构化精读论文的方法论,以及将理论转化为代码实践的路径,旨在帮助初学者快速构建密码学知识体系并应用于研究。

weixin_29214691的博客 319

Haclon案例-找出图中面积最大的圆

自带的函数,求得圆的面积和圆心点坐标,然后,用本章所学习的选择算子和循环算子找出面积最大的圆。的图片,试着给它加上不同种类的噪声,然后找出其中面积最大的圆,并将圆的面积标注在其圆心位置。可知,除了六个圆形之外,还有一些微小的噪声点,采用了开运算和特征选择的方法去除噪声。1. 该图片为一灰度图,对其进行二值化,二值化后如图。4. 在面积最大圆的圆心坐标位置写上该圆的面积。

qq_20660115的博客 905

BSP和Driver的区别

BSP( Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。在OS上的driver一般都是可动态加载的,当然嵌入OS里头直接编进去也就行了,对于一个最小的可运行OS核心来说,BSP是必不可少的,但driver不是。2)Driver,也就是我们常说的驱动,它和你的子设备是密切相关的,相同设备在相同软件平台下驱动基本是可以通用的,和板子的关系不是很大的。

tugouxp的专栏 1万+

SpringBoot项目整合达梦数据库(MYSQL 转换 达梦数据库)

注意:当迁移过程中出现下面问题时,如有触发器或者外键,需要先关掉触发器和外键,然后进行迁移,不然会导致迁移失败。(2)dm.ini修改【#compatibility】的【COMPATIBLE_MODE】=4。3、添加用户:如果导入的DM数据库需要和MYSQL的用户一样,添加ROOT用户。方法一:服务器配置:设置系统兼容性(DM控制台工具),兼容MySQL。服务器配置又该有两种方式:①DM控制台工具修改;MYSQL的数据表转换成DM的数据表时,点击转换按钮。在这里操作:MYSQL数据库迁移至DM数据库。

m0_74824635的博客 2013

【嵌入式系统】板级支持包BSP和硬件抽象层HAL的区别和关联

就我跟人理解而言BSP就是硬件驱动程序,它包含了操控硬件的必要函数,单片机系统使用BSP可以直接进行应用开发,这时候应用开发的hierarchy如下图所示: 但是由于日益增长的芯片种类和芯片复杂度,直接使用BSP进行应用开发将会受到巨大的挑战,因此为了程序的可阅读性以及可移植性提出了硬件抽象层HAL这一个概念。 引入HAL之后操作系统将会使用相对更为统一的HAL接口来实现对硬件的操作,

欢迎光临 1万+

告别水印!Vue3项目集成Stimulsoft.Reports.js完整配置与激活指南

本文详细介绍了如何在Vue3项目中集成Stimulsoft.Reports.js,提供从授权策略到性能优化的完整解决方案。通过模块化架构设计和现代化引入方式,帮助开发者高效实现专业级报表功能,同时避免版权风险和水印问题,特别适合中小型项目需求。

weixin_33701294的博客 432

基于Simulink的无线充电系统LCC补偿网络建模与控制

本文详细介绍了基于Simulink的无线充电系统LCC补偿网络建模与控制方法。首先分析了LCC补偿网络的恒流输出、软开关实现和抗偏移能力等优势,并对比了不同补偿拓扑特性。随后分步骤讲解了Simulink建模流程,包括LCC主电路构建、关键参数设计、双闭环控制系统实现等核心环节。重点阐述了移相控制策略和软开关验证方法,提供了系统效率计算和抗偏移测试的调试技巧。最后展示了仿真结果,在耦合系数变化20%时,闭环系统仍能保持输出电压稳定在±2%波动范围内。文章还探讨了工程扩展方向,并针对常见问题给出了解决方案,为无

xiaoheshang_123的博客 540

BSP概念总结

BSP的基本概念及应用

leesan0802的专栏 2万+

3.38 工业缺陷检测实战:物体表面缺陷检测,从图像处理到深度学习

本文介绍了工业缺陷检测的完整流程,从传统图像处理到深度学习方法。首先定义了缺陷检测任务的目标和应用场景,然后详细讲解了传统图像处理方法(边缘检测、阈值分割等)和深度学习方法(分类、检测、分割模型)。文章最后总结了核心要点,提出了思考题和实践建议,建议从简单方法开始逐步优化。下一篇将介绍工业视觉基础技术——相机标定与角点检测。

yonggeit的博客 2887

Android HAL学习 及 与BSP的区别

硬件层与软件层之间为中间层,也称为硬件抽象层(Hardware Abstract Layer,HAL)或板级支持包(Board Support Package,BSP),上层通过ID,得到包含调用信息结构体的地址,然后根据偏移就可以找到封装完成的、需要调用的函数指针,以此实现库层到底层(HAL层会封装内核信息的接口)的调用。它将系统上层软件与底层硬件分离开来,使系统的底层驱动程序与硬件无关,上层软件开发人员无需关心底层硬件的具体情况,根据 BSP 层提供的接口即可进行开发。1、定义描述HAL层的结构体。

a1809032425的博客 2200

【Python爬虫(1)】专栏开篇:夯实Python基础

要想熟练掌握 Python 爬虫技术,扎实的 Python 基础是必不可少的。这就好比建造高楼大厦,Python 基础就是那稳固的基石。只有打好了这个基础,我们才能在爬虫的学习道路上稳步前行,理解并运用各种爬虫技术和框架。

邓邓子的博客 2026

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

BSP、设备树和HAL的关系:以Xilinx Zynq为例与PC BIOS的对比

在Xilinx Zynq平台上,BSP、设备树和HAL形成了一个紧密集成的软件架构,类似于PC中的BIOS/UEFI系统,但更加灵活和可定制。设备树描述了系统的硬件配置,包括PS和PL部分的所有组件,类似于PC中的ACPI表但更加灵活。HAL提供了标准化的硬件访问接口,简化了驱动开发,提高了代码可移植性,类似于BIOS/UEFI的硬件抽象但更加轻量化。BSP集成了设备树、HAL和其他必要组件,为特定硬件平台提供完整的软件支持包,类似于PC固件但更加可定制。

kanhao100的博客 1178

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

通过HAL+BSP架构,操作系统核心部分可在不同平台上复用,极大提升移植效率

四、总结: - **HAL 是“平台无关”的桥梁**,提升软件可移植性; - **驱动是“设备相关”的基础**,实现精确控制; - 在现代嵌入式开发中(如使用STM32CubeMX、Zephyr OS),HAL已成为标准组成部分,大幅降低开发门槛。 -

[Blog][Domain] programb.blog.youkuaiyun.com 2922

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MSP、CSP、BSP区别

**MSP 单片机支援包(MCU Support Package)**是单片机底层的代码,同款芯片可以共享。BSP可使用MSP的代码。 我们要初始化和MCU无关的东西:例如串口协议,波特率,奇偶校验,停止位…,这些设置和使用什么样的MCU没有任何关系。所以就把串口抽像成为一个“串口”。 有了抽像的串口,这个“串口”就要在MCU上进行承载,例如用STM32进行承载,PA9为发送,PA10为接收,MSP就是要初始化PA9和PA10,配置这两个引脚。所以HAL驱动 方式的初始化流程就是:HAL_USART_Ini

1万+

STM32F103 BSP学习指南

此博客为一份详细的STM32F103系列 BSP学习指南

h050210的博客 3114

板级支持包BSP和硬件抽象层HAL的区别和关联

原博:https://blog.youkuaiyun.com/tq384998430/article/details/53484512 就我跟人理解而言BSP就是硬件驱动程序,它包含了操控硬件的必要函数,单片机系统使用BSP可以直接进行应用开发,这时候应用开发的hierarchy如下图所示: 但是由于日益增长的芯片种类和芯片复杂度,直接使用BSP进行应用开发将会受到巨大的挑战,因此为了程序的可阅读性以...

weixin_39549829的博客 1531

嵌入式开始中得 BSP 和 SDK 各自指什么

BSP 是介于嵌入式硬件(如MCU、外设)和操作系统(如Linux、RTOS)之间的软件层,主要目的是。裸机开发可能直接使用BSP(如STM32 HAL库),或简化版SDK(如寄存器操作库)。:为特定操作系统(如FreeRTOS、Zephyr)提供硬件抽象层(HAL)。:集成协议栈(如TCP/IP、MQTT)、RTOS(如FreeRTOS)。:提供板载外设(如UART、I2C、LCD、以太网PHY)的驱动程序。:编译器(如GCC)、调试工具(如J-Link脚本)、烧录工具。

wuxiaobingandbob的专栏 3629
上一篇: 《如何使用C语言去下三子棋?》
下一篇: 并行与串行的区别及并行通信的系统同步方式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

程序猿!=程序员

感谢来过,感谢有你!

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

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

打赏作者

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

抵扣说明:

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

余额充值