当前位置: 首页 > news >正文

蓝牙开发那些事儿12——(记一颗BLE芯片BringUp折腾过程)

1.背景

蓝牙这个系列已经很久很久没有更新了,感慨良多。

现在写这篇文章主要是BringUp一颗蓝牙芯片的过程中遇到了一些奇怪的问题,想了一些办法,一一克服了,看看对其他做蓝牙的同学有没有启发。

同时也安利一个叫做HACKRF的设备。借助于目前软件定义无线电的飞速发展,在定位射频类问题的时候,真的已经比以前什么手段都没有的时候快多了也方便多了,一个HACKRF的设备大概也就700多元,最后解决了困扰我数周的问题。

目前这家公司是做BLE芯片的,用的CEVA的蓝牙5.2的IP核,在我来这家公司之前,蓝牙的协议栈和软件部分由深圳团队负责,但是大半年时间了,一直也没有把蓝牙功能跑起来。

因为一些历史的原因,芯片在FPGA阶段并没有经过严格的验证,资料也极度缺乏,蓝牙协议栈的代码最后到我手上也是几经坎坷,没办法,这就是内耗。

拿到代码后,先移植到芯片的sdk上跑起来,(之前的软件团队居然连这一步移植协议栈的工作都没做好,也是醉了),第一步任务是先跑通蓝牙协议栈,结果折腾了很久,连最基本的BLE的广播包能不能发出来;从软件层面上看应该已经发出来了,但是sniffer却死活收不到。
 

2.调试过程

既然从软件层面上看adv包已经发出来了,但是sniffer收不到,那么要么是基带有问题要么是RF有问题。基带是CEVA的核,虽然之前验得不充分,但是出问题的概率较小(我也只能姑且这么认为),而RF模块是自己另外加的,所以有可能问题出在RF这儿。

于是借了一个手持式的频谱仪,发现在广播包的频段上(蓝牙协议规定的BLE三个广播channel是37、38、39,对应频率为2402Mhz,2426Mhz,2480Mhz),是时不时有信号发出来的。

一开始猜测的是是不是RF的功率太小了,改动PA部分的电路等等,后来发现没啥效果(其实功率关系不大,后来调通以后,哪怕不接天线,近距离的情况下信号也挺强的),从频谱仪上看,不改动电路的情况下,发送功率可以到接近0dbm左右的 。

2.1 DTM

由于之前据说这颗芯片拿回来后是跑通过DTM测试的(DTM(Direct Test Mode)直接测试模式,是SIG联盟在蓝牙核心规范中制定的一种用于蓝牙射频性能测试的模式。),因为dtm测试最简单,只需要配一些寄存器,让芯片进入test mode,就可以进行tx、rx的测试,配合一台测试仪(例如8852等等),看看频谱、数据等等对不对就可以初步判定这颗ble芯片的RF是否正常。

问题是,当我向之前做DTM测试的同事要求拿DTM测试报告的时候,居然得到了“没有”的回答。

于是dtm测试在我这里也打上了问号,我必须重新来做一下DTM测试了。

DTM测试是需要8852这样的设备的,由于无锡这边没有,只能先借了一台频谱仪,频谱仪不能解析payload,但是大概看一下频谱,还是可以的。

DTM的代码也费了一些周折拿到了,跑起来后发现不太稳定,修复后,得到了如下的频谱图

一开始看到这里的结果是大喜的,因为蓝牙规定频偏是150khz以内,这里偏了178khz,问题就大了。和负责rf的工程师沟通后,修改了一些寄存器后,频偏修复了,当时为了看这个频偏的问题,怕手持式频谱仪不靠谱,还去借了一个高级的频谱仪:

这次看上去频偏正常了,赶紧再去跑跑正常的协议栈看看,结果是令人沮丧的,广播包依然没有发出来,问题依旧。

2.2 MT8852

现在问题又回到了原点,RF的频谱是正常的,不能证明说RF就没问题。频谱只能证明说载波的频点是对的,并不能说调制解调没有问题,BLE的调制方式GFSK(不绝对,蓝牙5.2支持1M、2M和coded三种调制方式,我们现在调试最基本的legacy adv包,是属于1M phy,GFSK的调制)是否有问题,还需要能看到payload才行,而频谱仪是无法解析payload的。

于是我们搞到了专业的设备MT8852。之前并不了解这个设备是否可以解析payload,为了验证这个问题,我得先试试,先找了上一代芯片(上一代芯片是可以正常发出广播包的)。

先试了一下上一代芯片的DTM测试,这个时候,设备不需要做什么设置,就可以解析payload,如下图所示

那么广播包是否可以解析呢:

一开始我以为是不可以的,因为抓到的广播包是下图这种:

但是后来我发现是可以的,只要设置对了access code的话,如下图(因为test mode和广播包的access code是不同的),下图中的packet contents是通过点击"show packet details"按钮打开的,但是要注意,这个show packet details要提前打开才可以解析,应该是软件bug。另外,从这个payload上看,应该是蓝牙地址的第一个字节01被吃掉了,最后又多了一个00,这个应该是解析错误,从上面的波形上看,是对的,有01 的。

然后赶紧试下我们现在的芯片,先试试dtm,抓到了:

再试试广播包,抓到这个,很奇怪,是全黑的,无法解析,肉眼解析的话,从access code 也完全看不出正常广播包的access code ——0x8e89bed6。

当时我其实没想明白这个事儿,总以为是自己对8852不太了解造成的,直到下一节的实验过后......

2.3 HACKRF

从频谱仪上看,在广播的频段(2402Mhz、2426Mhz、2480Mhz)有数据发出,只是无法解析其中的数据是否符合蓝牙协议。

市面上的sniffer,通常只能解读符合蓝牙协议的数据包,如果不符合蓝牙协议,比如说收到一个GFSK的数据包,解析后发现其中的preamble是错的,或者access code是错的,或者crc是错的,都会直接丢掉,我们就无法分析到底发生了什么。

最好有一款设备,只做GFSK解调,解出来的数据,不管黑猫白猫,统统给我们显示出来,由我们来分析问题到底出在哪里。

这样的设备前几年还没有,现在还真有了。

就是一款叫做HackRF one的设备,这个设备是软件定义无线电的产品。

‌HackRF‌是一款由Great Scott Gadgets公司推出的开源软件无线电(SDR)平台。它具有广泛的频率覆盖范围,从1 MHz到6 GHz,支持大部分常见的无线通信频段。HackRF采用软件定义无线电技术,提供了自定义和控制无线信号处理的能力,包括接收、发送、解码和干扰等功能‌12。

主要功能和应用场景

‌接收和解码无线信号‌:HackRF可以接收并解码各种无线信号,如无线电广播、无线电通信、无线电定位等。用户可以使用HackRF来监听和分析无线信号,了解无线通信的工作原理‌1。

‌发送和模拟无线信号‌:HackRF可以生成和发送各种无线信号,用于无线通信实验、无线信号干扰测试等。用户可以通过HackRF进行无线通信实验和信号干扰测试‌1。

‌破解和分析无线协议‌:HackRF可以用于破解和分析各种无线协议,如无线门禁系统、汽车遥控器、无线键盘鼠标等。通过分析无线协议的加密算法和通信流程,可以进行安全评估和漏洞分析‌1。

‌定位和跟踪无线信号‌:HackRF可以用于定位和跟踪无线信号的发射源,适用于无线摄像头、无线麦克风等的定位和监控‌1。

技术规格和硬件配置

HackRF One是一款基于FPGA和ARM的软件定义无线电外设,具有以下主要技术规格:

‌工作频率‌:1 MHz至6 GHz

‌采样速率‌:每秒高达2000万次

‌采样精度‌:8位正交采样(8-bit I 和 8-bit Q)

‌兼容性‌:与GNU RadioSDR#

‌控制接口‌:支持USBSD卡接口LPC_JTAG接口I2SSPII2CUART协议接口等‌3。

从原理上看,可以用来嗅探蓝牙数据包,因为Hackrf支持的软件比较多,比如像Gnuradio这样的图形化的开源软件,也可以用来进行编程。

hackrf设备如下图:

将hackrf作为蓝牙嗅探器的代码网上还挺多的,最后我找了一个写得比较好的:

GitHub - JiaoXianjun/BTLE: Bluetooth Low Energy (BLE) packet sniffer and transmitter for both standard and non standard (raw bit) based on Software Defined Radio (SDR).

抓到了

比较下我们的数据和其他数据,可以看到,我们的数据看着反而是正常的,人家的数据看着倒像是错的,联想到之前8852测试的结果,我一下子想明白了,蓝牙收发包过程,有个scramble又叫whitening的工序,目的是避免长时间全零的数据影响射频特性,我们的芯片,应该是没做这个scramble。为了验证这个想法,就很简单了,hackrf是可以编程的,对收到的raw data进行dewhitening,这一次,人家的数据是对的,而我们的数据是不对的。

于是,到协议栈的代码里找到相关寄存器,发现果然是代码问题,谁把我们芯片的scramble关掉了。

如下图:

注意红框说明,为了测试的目的,关闭了whitening,这个东西,本来应该是dtm测试的时候关掉,而在正常跑协议的时候打开,现在居然改到了全局,显然就是不对了。

坑,又填了一个。

相关文章:

蓝牙开发那些事儿12——(记一颗BLE芯片BringUp折腾过程)

1.背景 蓝牙这个系列已经很久很久没有更新了,感慨良多。 现在写这篇文章主要是BringUp一颗蓝牙芯片的过程中遇到了一些奇怪的问题,想了一些办法,一一克服了,看看对其他做蓝牙的同学有没有启发。 同时也安利一个叫做HACKRF的设备…...

从零构建 Vue3 登录页:结合 Vant 组件与 Axios 实现完整登录功能

在 Web 开发的世界里,登录页是用户与应用交互的第一道门槛,它的体验好坏直接影响着用户对整个应用的印象。本文将详细记录如何使用 Vue3、Vant 组件库和 Axios 构建一个兼具美观与实用的登录页面,并实现完整的登录逻辑与数据验证,…...

AutoSAR从概念到实践系列之MCAL篇(一)——MCAL架构及其模块详解

欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 老规矩,…...

多线程编程的简单案例——单例模式[多线程编程篇(3)]

目录 前言 1.wati() 和 notify() wait() 和 notify() 的产生原因 如何使用wait()和notify()? 案例一:单例模式 饿汉式写法: 懒汉式写法 对于它的优化 再次优化 结尾 前言 如何简单的去使用jconsloe 查看线程 (多线程编程篇1)_eclipse查看线程-CSDN博客 浅谈Thread类…...

万物互联时代,AWS IoT Core如何构建企业级物联网中枢平台?

在智能制造、智慧城市、车联网等场景爆发的今天,全球物联网设备数量已突破150亿台。企业如何高效管理海量设备并挖掘数据价值?AWS IoT Core作为亚马逊云科技推出的全托管物联网平台,正在为数千家企业提供设备连接、数据采集、实时分析的一站式…...

论文阅读:2023 arxiv Safe RLHF: Safe Reinforcement Learning from Human Feedback

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Safe RLHF: Safe Reinforcement Learning from Human Feedback https://arxiv.org/pdf/2310.12773 https://github.com/PKU-Alignment/safe-rlhf 速览 研究动机&#xff…...

链表相关算法题

小细节 初始化问题 我们这样子new一个ListNode 它里面的默认值是0,所以我们不能这样 如果我们为空,我们要返回null 节点结束条件判断(多创建节点问题) 参考示例3217 解析: 我的答案是多了一个无用节点 这是因为我每…...

招商信诺原点安全:一体化数据安全管理解决方案荣获“鑫智奖”!

近日,“鑫智奖 2025第七届金融数据智能优秀解决方案评选”榜单发布,原点安全申报的《招商信诺:数据安全一体化管理解决方案》荣获「信息安全创新优秀解决方案」。 “鑫智奖第七届金融数据智能优秀解决方案评选”活动由金科创新社主办&#x…...

实战篇|多总线网关搭建与量产验证(5000 字深度指南)

引言 1. 环境准备与硬件选型 1.1 项目需求分析 1.2 SoC 与开发板选型 1.3 物理接口与 PCB 设计 1.4 电源与供电保护 2. 软件架构与协议栈移植 2.1 分层架构详解 2.2 协议栈移植步骤 2.3 高可用驱动设计 2.4 映射逻辑与 API 定义 3. 开发流程与实践 3.1 敏捷迭代与里程碑 3.2 核…...

Jenkins 简易使用记录

一、Jenkins 核心功能与适用场景 核心功能: 持续集成(CI):自动构建代码、运行单元测试。持续交付(CD):自动化部署到测试/生产环境。任务调度:定时执行任务(如备份、清理&…...

第十四节:实战场景-何实现全局状态管理?

React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案(轻量级首选) // 创建全局 Context 对象 const GlobalContext createConte…...

启动vite项目报Unexpected “\x88“ in JSON

启动vite项目报Unexpected “\x88” in JSON 通常是文件被防火墙加密需要寻找运维解决 重启重装npm install...

Jenkins 多分支管道

如果您正在寻找一个基于拉取请求或分支的自动化 Jenkins 持续集成和交付 (CI/CD) 流水线,本指南将帮助您全面了解如何使用 Jenkins 多分支流水线实现它。 Jenkins 的多分支流水线是设计 CI/CD 工作流的最佳方式之一,因为它完全基于 git(源代…...

PHP腾讯云人脸核身获取NONCE ticket

参考腾讯云官方文档: 人脸核身 获取 NONCE ticket_腾讯云 前提条件,已经成功获取了access token。 获取参考文档: PHP腾讯云人脸核身获取Access Token-CSDN博客 public function getTxFaceNonceTicket($uid) {$access_token file_get_c…...

云计算(Cloud Computing)概述——从AWS开始

李升伟 编译 无需正式介绍亚马逊网络服务(Amazon Web Services,简称AWS)。作为行业领先的云服务提供商,AWS为全球开发者提供了超过170项随时可用的服务。 例如,Adobe能够独立于IT团队开发和更新软件。通过AWS的服务&…...

51单片机实验五:A/D和D/A转换

一、实验环境与实验器材 环境:Keli,STC-ISP烧写软件,Proteus. 器材:TX-1C单片机(STC89C52RC)、电脑。 二、 实验内容及实验步骤 1.A/D转换 概念:模数转换是将连续的模拟信号转换为离散的数字信…...

重构未来智能:Anthropic 解码Agent设计哲学三重奏

第一章 智能体进化论:从工具到自主体的认知跃迁 1.1 LLM应用范式演进图谱 阶段技术形态应用特征代表场景初级阶段单功能模型硬编码规则执行文本摘要/分类进阶阶段工作流编排多模型协同调度跨语言翻译流水线高级阶段自主智能体动态决策交互编程调试/客服对话 1.1.…...

MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构

MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构 文章目录 MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构一、MCP协议的技术演进与纳米材料研究的适配性分析1.1 MCP协议的核心架构升级1.2 纳米材料研发的核心挑战与…...

.NET Core 服务实现监控可观测性最佳实践

.NET Core 概述 .Net Core 是一个开源的、跨平台的高性能框架,由微软开发并维护,现由 .NET Foundation 提供支持。它用于构建现代化、可扩展的云端和本地应用程序,支持开发 Web 应用、微服务、API、物联网应用以及移动后端服务,是…...

ios精灵脚本辅助软件,有根和无根roothide越狱区别

最新版本的ios按键精灵app 支持到15-16系统,可以在半越狱环境下和无根越狱环境安装,对于很多用户一直不理解有根和无根之间的差别,今天简单介绍下 最高权限和部分权限的区别 1、有根越狱 – 有系统根目录读写权限(通过越狱软件可…...

ChatGPT-o3辅助学术大纲效果如何?

目录 1 引言 2 背景综述 2.1 自动驾驶雷达感知 2.2 生成模型演进:从 GAN 到 Diffusion 3 相关工作 3.1 雷达点云增强与超分辨率 3.2 扩散模型在数据增广中的应用 4 方法论 4.1 问题定义与总览 4.2 数据预处理与雷达→体素表示 4.3 潜在体素扩散网络&…...

PyCharm 2024.3.5 状态栏添加前进后退按钮

操作路径:Appearance & Behavior -> Menu and Toolbars -> Main Toolbar -> Left -> Add… 按钮位置:Main Menu -> Navigate -> OK 最终效果...

【CPP】死锁产生、排查、避免

一、死锁产生 死锁是指两个或多个线程互相等待对方释放资源,导致程序无法继续执行的现象。在多线程编程中,死锁是一种常见且严重的并发问题。死锁产生必须要四个条件同时满足才会发生: 互斥条件:某些资源只能由一个线程占用。占…...

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的,几乎维系着整个安卓程序运行的生命周期,但是这么重要的一个东西,我们真的了解它吗?下面跟随着我的脚步,慢慢揭开Hanler的神秘面纱吧! 本文将介绍Handler 的运…...

Git 进阶之路:高效协作之分支管理

🌈 个人主页:Zfox_ 🔥 系列专栏:Git 企业级应用 目录 一:🔥 分⽀管理 🦋 理解分⽀🦋 创建分⽀🦋 切换分⽀🦋 合并分⽀🦋 删除分⽀🦋 合…...

LeetCode 2364.统计坏数对的数目:反向统计

【LetMeFly】2364.统计坏数对的数目&#xff1a;反向统计 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-number-of-bad-pairs/ 给你一个下标从 0 开始的整数数组 nums 。如果 i < j 且 j - i ! nums[j] - nums[i] &#xff0c;那么我们称 (i, j) 是一个 坏…...

6.Rust+Axum:打造高效 WebSocket 实时通信聊天室

摘要 本文详细介绍 RustAxum 在 WebSocket 实时通信开发中的应用&#xff0c;包括双向通信、状态管理等&#xff0c;实践构建聊天室应用。 一、引言 在当今的 Web 应用开发中&#xff0c;实时通信变得越来越重要。WebSocket 作为一种在单个 TCP 连接上进行全双工通信的协议&…...

【硬件系统架构】冯·诺依曼架构

一、引言 在计算机科学的广袤领域中&#xff0c;冯诺依曼架构犹如一颗璀璨的恒星&#xff0c;照亮了现代计算机发展的道路。从我们日常使用的个人电脑到强大的数据中心服务器&#xff0c;几乎都基于这一架构构建。它的出现是计算机发展史上的一个重要里程碑&#xff0c;深刻地影…...

Android 13 关闭屏幕调节音量大小

一、问题描述 在Android 13系统中,通过修改frameworks/base/core/res/res/values/config.xml配置文件,实现灭屏状态下调节音量的功能。 二、修改内容 diff --git a/frameworks/base/core/res/res/values/config.xml b/frameworks/base/core/res/res/values/config.xml inde…...

[编程基础] Java · 学习手册

&#x1f525; 《Java 工程师修炼之路&#xff1a;从零构建系统化知识体系》 &#x1f525; &#x1f6e0;️ 专栏简介&#xff1a; 这是一个以工业级开发标准打造的 Java 全栈技术专栏&#xff0c;涵盖语言核心、并发编程、JVM 原理、框架源码、架构设计等全维度知识体系。专…...

探索元生代:ComfyUI 工作流与计算机视觉的奇妙邂逅

目录 一、引言 二、蓝耘元生代和 ComfyUI 工作流初印象 &#xff08;一&#xff09;蓝耘元生代平台简介 &#xff08;二&#xff09;ComfyUI 工作流创建是啥玩意儿 三、计算机视觉是个啥 &#xff08;一&#xff09;计算机视觉的基本概念 &#xff08;二&#xff09;计算…...

C++ 迭代器失效详解:如何避免 vector 操作中的陷阱

目录 1. 什么是迭代器失效&#xff1f; 2. 哪些操作会导致迭代器失效&#xff1f; 2.1 vector 的插入操作&#xff08;push_back, insert&#xff09; 示例&#xff1a;push_back 导致迭代器失效 如何避免&#xff1f; 2.2 vector 的删除操作&#xff08;erase, pop_back&…...

【fisco bcos】基于ABI调用智能合约

参考官方文档&#xff1a;https://fisco-bcos-documentation.readthedocs.io/zh-cn/latest/docs/sdk/java_sdk/assemble_transaction.html 先放一下智能合约&#xff1a; &#xff08;就是一个很简单的插入和查找嗯&#xff09; pragma solidity ^0.4.25; pragma experimental…...

【Python学习笔记】Pandas实现Excel质检记录表初审、复核及质检统计

背景&#xff1a; 我有这样一个需要审核的飞书题目表&#xff0c;按日期分成多个sheet&#xff0c;有初审——复核——质检三个环节&#xff0c;这三个环节是不同的同学在作业&#xff0c;并且领到同一个题目的人选是随机的&#xff0c;也就是说&#xff0c;完成一道题的三个人…...

Springboot 自动装配原理是什么?SPI 原理又是什么?

1. Spring Boot 自动装配原理 自动装配是 Spring Boot 简化配置的核心机制&#xff0c;其核心思想是根据类路径中的依赖自动配置 Spring 应用。 关键步骤&#xff1a; 启动注解 SpringBootApplication 该注解组合了 EnableAutoConfiguration&#xff0c;用于激活自动配置。 …...

【英语语法】基本句型

目录 前言一&#xff1a;主谓二&#xff1a;主谓宾三&#xff1a;主系表四&#xff1a;主谓双宾五&#xff1a;主谓宾补 前言 英语基本句型是语法体系的基石&#xff0c;以下是英语五大基本句型。 一&#xff1a;主谓 结构&#xff1a;主语 不及物动词 例句&#xff1a; T…...

扫雷-C语言版

C语言扫雷游戏设计&#xff08;完整版&#xff09; 游戏背景 扫雷是一款经典的益智类单人电脑游戏&#xff0c;最早出现在1960年代&#xff0c;并在1990年代随着Windows操作系统而广为人知。游戏目标是在不触发任何地雷的情况下&#xff0c;揭开所有非地雷的格子。玩家需要根…...

【C++初阶】--- list容器功能模拟实现

1.什么是list容器 在 C 标准模板库&#xff08;STL&#xff09;中&#xff0c;std::list 是一个非常有用的容器&#xff0c;它是双向链表的实现std::list 是一种序列式容器&#xff0c;它允许在序列内的任意位置进行高效的插入和删除操作。与数组和 std::vector 不同&#xff…...

gRPC 介绍及在嵌入式 Linux 下的成功编译及使用详解

gRPC 是一个高性能、开源和通用的 RPC 框架&#xff0c;由 Google 开发。它支持多种编程语言&#xff0c;并且能够运行在不同的环境中&#xff0c;包括嵌入式系统。本文将详细介绍 gRPC&#xff0c;以及如何在嵌入式 Linux 系统下成功编译 gRPC&#xff0c;并结合 protobuf 和 …...

C语言教程(十):C 语言函数详解

一、引言 在 C 语言中&#xff0c;函数是一组执行特定任务的代码块。通过将复杂的程序逻辑划分为多个函数&#xff0c;不仅能提高代码的可读性、可维护性&#xff0c;还便于代码的复用。无论是简单的数学计算&#xff0c;还是复杂的系统操作&#xff0c;函数都发挥着核心作用。…...

力扣刷题-热题100题-第35题(c++、python)

146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/lru-cache/?envTypestudy-plan-v2&envIdtop-100-liked 双向链表哈希表 内置函数 对于c有list可以充当双向链表&#xff0c;unordered_map充当哈希表&#xff1b;python有OrderedDic…...

LeetCode算法题(Go语言实现)_52

题目 给你一个下标从 0 开始的整数数组 costs &#xff0c;其中 costs[i] 是雇佣第 i 位工人的代价。 同时给你两个整数 k 和 candidates 。我们想根据以下规则恰好雇佣 k 位工人&#xff1a; 总共进行 k 轮雇佣&#xff0c;且每一轮恰好雇佣一位工人。 在每一轮雇佣中&#xf…...

基于尚硅谷FreeRTOS视频笔记——13—HAL库和RTOS时钟源问题

RTOS的时钟源就是系统定时器中断&#xff0c;通俗来说就是系统定时器每中断一次&#xff0c;就扫描一次RTOS&#xff0c;查看RTOS中有没有任务的切换。 但是&#xff0c;系统存在一个HAL_Delay()函数&#xff0c;就是使用的系统定时器中断来执行的函数。 当我们在RTOS中&…...

FPGA入门学习Day1——设计一个DDS信号发生器

目录 一、DDS简介 &#xff08;一&#xff09;基本原理 &#xff08;二&#xff09;主要优势 &#xff08;三&#xff09;与传统技术的对比 二、FPGA存储器 &#xff08;一&#xff09;ROM波形存储器 &#xff08;二&#xff09;RAM随机存取存储器 &#xff08;三&…...

JavaScript-立即执行函数(Immediately Invoked Function Expression,IIFE)

立即执行函数&#xff08;Immediately Invoked Function Expression&#xff0c;IIFE&#xff09;是 JavaScript 里一种很独特的函数&#xff0c;它在定义后会马上执行。下面会详细介绍它的语法、用途、优点以及注意事项。 一、语法 立即执行函数一般有两种常见的语法形式&am…...

【Leetcode 每日一题 - 补卡】2537. 统计好子数组的数目

问题背景 给你一个整数数组 n u m s nums nums 和一个整数 k k k&#xff0c;请你返回 n u m s nums nums 中 好 子数组的数目。 一个子数组 a r r arr arr 如果有 至少 k k k 对下标 ( i , j ) (i, j) (i,j) 满足 i < j i < j i<j 且 a r r [ i ] a r r [ …...

【工具-Krillin AI】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~

Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具&#xff0c;集音视频翻译、配音、语音克隆于一身&#xff0c;支持横竖屏格式输出&#xff0c;确保在所有主流平台&#xff08;哔哩哔哩&#xff0c;小红书&#xff0c;抖音&#xff0c;视频号&#xff0c…...

常用绑定事件方式有哪几种

绑定事件分为3种&#xff1a; 1、内联模式&#xff1a;将函数名直接作为标签属性的属性值&#xff08;注意&#xff1a;这里是带括号的,不带括号不生效&#xff0c;但是在vue中可以加括号也可以不加括号&#xff0c;如果需要穿参数就加括号&#xff0c;不需要传参数可以不加&am…...

数据结构之BFS广度优先算法(腐烂的苹果)

队列这个数据结构在很多场景下都有使用&#xff0c;比如在实现二叉树的层序遍历&#xff0c;floodfill问题(等等未完成)中&#xff0c;都需要借助队列的先进先出特性&#xff0c;下面给出这几个问题的解法 经典的二叉树的层序遍历 算法图示&#xff0c;以下图所示的二叉树为例…...

linux 学习 1.开始学习

准备学习linux记录一下学习内容&#xff0c;只会包含必要的知识&#xff0c;和部分演示 我采用的系统是Ubuntu24.04 初始掌握 学习首先需要掌握如何查看帮助手册 man man # man 加任何命令可以看具体命令的帮助手册 man mkdir进入手册按 d(down)&#xff1a;往下翻半页u(u…...