<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://docs.bouffalolab.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%E6%AD%A6%E6%A5%B7%E8%BD%A9</id>
	<title>Bouffalo Lab Docs - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.bouffalolab.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%E6%AD%A6%E6%A5%B7%E8%BD%A9"/>
	<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/%E6%AD%A6%E6%A5%B7%E8%BD%A9"/>
	<updated>2026-04-14T06:26:54Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=149</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=149"/>
		<updated>2025-08-11T09:39:37Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;源码部分输出：&#039;&#039;&#039;&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）支持 A/B 双分区设计，实现无缝固件更新和回滚处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：该程序会根据分区表加载固件到内存支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;   多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：OTA 更新：将新固件从临时分区复制到主分区防回滚（Anti-Rollback）：防止降级到不安全版本支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：SHA-256 校验 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Demo：mbedtls ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这段代码对tls中的加密功能进行了全面的自检测，保证mbedtls库可以正常在平台上运行。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的  bouffalo_sdk/examples/mbedtls&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ECDH测试&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdh_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ECDSA测试&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdsa_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：生成 ECDSA 密钥对。使用私钥对哈希值进行签名，生成签名。使用公钥验证签名的正确性。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;涉及的算法&#039;&#039;&#039;：ECDSA数字签名；哈希算法：SHA-256。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AES测试&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_aes_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SHA测试&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_sha_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算，输出哈希值&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
  SHA-1 test #1: passed&lt;br /&gt;
  SHA-1 test #2: passed&lt;br /&gt;
  SHA-1 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-224 test #1: passed&lt;br /&gt;
  SHA-224 test #2: passed&lt;br /&gt;
  SHA-224 test #3: passed&lt;br /&gt;
  SHA-256 test #1: passed&lt;br /&gt;
  SHA-256 test #2: passed&lt;br /&gt;
  SHA-256 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-384 test #1: passed&lt;br /&gt;
  SHA-384 test #2: passed&lt;br /&gt;
  SHA-384 test #3: passed&lt;br /&gt;
  SHA-512 test #1: passed&lt;br /&gt;
  SHA-512 test #2: passed&lt;br /&gt;
  SHA-512 test #3: passed&lt;br /&gt;
=========== ecdh test ================&lt;br /&gt;
setup rng ... ok&lt;br /&gt;
select ecp group SECP256R1 ... ok&lt;br /&gt;
Get public key time=33ms&lt;br /&gt;
1. ecdh client generate public parameter:&lt;br /&gt;
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED&lt;br /&gt;
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1&lt;br /&gt;
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22&lt;br /&gt;
     63 E3 AC 81 91&lt;br /&gt;
     &lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
aes ctr 192 block:1000 enc cost time:331 us&lt;br /&gt;
aes ctr 192 block:1000 dec cost time:329 us&lt;br /&gt;
test aes ctr 256 &lt;br /&gt;
aes ctr 256 block:1000 enc cost time:354 us&lt;br /&gt;
aes ctr 256 block:1000 dec cost time:354 us&lt;br /&gt;
&lt;br /&gt;
=========== sha test ================&lt;br /&gt;
sha1 block:1000 cost time:415 us&lt;br /&gt;
sha256 block:1000 cost time:268 us&lt;br /&gt;
sha512 block:1000 cost time:236 us&lt;br /&gt;
mbedtls test success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:memheap ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试申请和释放 内存memory 的功能是否正常。在当前代码下，程序会不断申请释放 无休止直到将内存消耗殆尽。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/memheap&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411520 byte&lt;br /&gt;
free memory :411520 byte&lt;br /&gt;
remain 25244 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411648 byte&lt;br /&gt;
free memory :411648 byte&lt;br /&gt;
remain 25116 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411776 byte&lt;br /&gt;
free memory :411776 byte&lt;br /&gt;
remain 24988 byte&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :433920 byte&lt;br /&gt;
free memory :433920 byte&lt;br /&gt;
remain 2844 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :434048 byte&lt;br /&gt;
free memory :434048 byte&lt;br /&gt;
tlsf malloc 434176 bytes failed at function bflb_malloc using heap base:0x62fc5554&lt;br /&gt;
remain 436900 byte&lt;br /&gt;
try to get 434176 byte memory failed!&lt;br /&gt;
memheap test fail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:partition ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试分区表获取和输出。所以这里主要要烧录whole bin,否则没有烧录分区表会导致失败。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
======= PtTable_Config @0x62fc3cc8=======&lt;br /&gt;
magicCode 0x54504642; version 0x0000; entryCnt 8; age 0; crc32 0xE38928F3&lt;br /&gt;
idx  type device active_index     name   Address[0]  Address[1]  Length[0]   Length[1]   age&lt;br /&gt;
[00]  16     0         0        Boot2  0x00000000  0x00000000  0x0000e000  0x00000000  0&lt;br /&gt;
[01]  00     0         0           FW  0x00010000  0x00210000  0x00200000  0x00168000  0&lt;br /&gt;
[02]  10     0         0          mfg  0x00210000  0x00000000  0x00168000  0x00000000  0&lt;br /&gt;
[03]  02     0         0        media  0x00378000  0x00000000  0x00071000  0x00000000  0&lt;br /&gt;
[04]  03     0         0          PSM  0x003e9000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
[05]  04     0         0          KEY  0x003f1000  0x00000000  0x00002000  0x00000000  0&lt;br /&gt;
[06]  05     0         0         DATA  0x003f3000  0x00000000  0x00005000  0x00000000  0&lt;br /&gt;
[07]  06     0         0      factory  0x003f8000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中： 索引的 0 和 1 分别代表不同的区，一个是活跃的当前正在使用的，另一个是备份的用于当升级失败回滚的。&lt;br /&gt;
&lt;br /&gt;
== Demo:efuse_trim ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该Demo主要用于验证efuse中储存的修剪数值是否正确，这些修剪值用于矫正一些模块。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下 ： bouffalo_sdk/examples/peripherals/efuse/efuse_trim&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;初始化和设备获取&#039;&#039;&#039;：&lt;br /&gt;
#* 调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。&lt;br /&gt;
#* 使用 &amp;lt;code&amp;gt;bflb_device_get_by_name(&amp;quot;ef_ctrl&amp;quot;)&amp;lt;/code&amp;gt; 获取 eFuse 控制设备的句柄。&lt;br /&gt;
# &#039;&#039;&#039;修剪值读取和验证&#039;&#039;&#039;：&lt;br /&gt;
#* 定义了一个数组 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，然后遍历 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，调用 &amp;lt;code&amp;gt;bflb_ef_ctrl_read_common_trim&amp;lt;/code&amp;gt; 读取每个修剪值。&lt;br /&gt;
#* 如果修剪值有效，则进一步验证其奇偶校验。如果校验通过，打印修剪值；否则提示校验错误。&lt;br /&gt;
#* 如果修剪值无效，提示未找到。&lt;br /&gt;
&#039;&#039;&#039;示例输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
eFuse read trim value case!&lt;br /&gt;
trim rc32m value=108!&lt;br /&gt;
trim rc32k value=273!&lt;br /&gt;
trim tsen value=2149!&lt;br /&gt;
case finished!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:i2s_es8311 ==&lt;br /&gt;
该Demo的主要用途是实现音频数据采集和播放。主要功能是初始化并配置 I2S 接口和 ES8311 音频编解码器，以实现音频数据的传输和处理。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/peripherals/i2s/i2s_es8311&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;硬件初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。初始化 GPIO 引脚&amp;lt;code&amp;gt;i2s_gpio_init()&amp;lt;/code&amp;gt;，为 I2S 和 I2C 接口分配功能引脚。&lt;br /&gt;
# &#039;&#039;&#039;主时钟输出&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;mclk_out_init()&amp;lt;/code&amp;gt; 配置 I2S 的主时钟输出，为外部音频设备ES8311提供时钟信号。&lt;br /&gt;
# &#039;&#039;&#039;ES8311 音频编解码器初始化&#039;&#039;&#039;：配置 ES8311 的工作模式。调用 &amp;lt;code&amp;gt;es8311_init()&amp;lt;/code&amp;gt; 初始化 ES8311，并设置音量。启动 ES8311 的 ADC 和 DAC 模块。&lt;br /&gt;
# &#039;&#039;&#039;I2S 和 DMA 初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;i2s_dma_init()&amp;lt;/code&amp;gt; 初始化 I2S 接口和 DMA 通道。配置 DMA 通道，启动 DMA 通道，开始音频数据的传输和接收。&lt;br /&gt;
&#039;&#039;&#039;示例输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
es8311 init&lt;br /&gt;
read chip id failed!&lt;br /&gt;
SET: volume:70%&lt;br /&gt;
i2s init&lt;br /&gt;
dma init&lt;br /&gt;
dma lli init&lt;br /&gt;
tx dma lli num: 2 &lt;br /&gt;
rx dma lli num: 2 &lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:printf ==&lt;br /&gt;
该demo主要测试基本printf功能是否完整，正常。&lt;br /&gt;
&lt;br /&gt;
保存在SDK 下：bouffalo_sdk/examples/printf&lt;br /&gt;
&lt;br /&gt;
=== 测试的主要功能包括： ===&lt;br /&gt;
&lt;br /&gt;
# 格式化标志(Flags)测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_space_flag&amp;lt;/code&amp;gt;: 测试空格标志( )的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_plus_flag&amp;lt;/code&amp;gt;: 测试加号标志(&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_zero_flag&amp;lt;/code&amp;gt;: 测试零填充标志(&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_minus_flag&amp;lt;/code&amp;gt;: 测试左对齐标志(&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_sharp_flag&amp;lt;/code&amp;gt;: 测试井号标志(&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
&lt;br /&gt;
# 宽度和精度测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_width&amp;lt;/code&amp;gt;: 测试基本宽度指定&lt;br /&gt;
* &amp;lt;code&amp;gt;test_width_20&amp;lt;/code&amp;gt;: 测试20字符宽度的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_padding_20&amp;lt;/code&amp;gt;: 测试20字符填充&lt;br /&gt;
* &amp;lt;code&amp;gt;test_padding_dot_20&amp;lt;/code&amp;gt;: 测试带小数点的20字符填充&lt;br /&gt;
&lt;br /&gt;
# 数值类型测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_integer_types&amp;lt;/code&amp;gt;: 测试各种整数类型(int, long, long long等)&lt;br /&gt;
* &amp;lt;code&amp;gt;test_floating_point_specifiers_precision_and_flags&amp;lt;/code&amp;gt;: 测试浮点数的精度和标志&lt;br /&gt;
* &amp;lt;code&amp;gt;test_pointer&amp;lt;/code&amp;gt;: 测试指针类型的打印&lt;br /&gt;
&lt;br /&gt;
# 特殊情况测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_infinity_and_not_a_number_values&amp;lt;/code&amp;gt;: 测试无穷大和NaN值的打印&lt;br /&gt;
* &amp;lt;code&amp;gt;test_tiny_floating_point_values&amp;lt;/code&amp;gt;: 测试极小浮点数的打印&lt;br /&gt;
&lt;br /&gt;
# 字符串相关测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_string_length&amp;lt;/code&amp;gt;: 测试字符串长度限制打印&lt;br /&gt;
&#039;&#039;&#039;示例输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
test 26 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
53000atest-20 bit&lt;br /&gt;
53000atest-20 bit&lt;br /&gt;
0.33&lt;br /&gt;
0.33&lt;br /&gt;
1&lt;br /&gt;
1&lt;br /&gt;
foo&lt;br /&gt;
foo&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     00004&lt;br /&gt;
     00004&lt;br /&gt;
hi x&lt;br /&gt;
hi x&lt;br /&gt;
00123               &lt;br /&gt;
00123               &lt;br /&gt;
-67224.546875000000000000&lt;br /&gt;
-67224.546875000000000000&lt;br /&gt;
0.33&lt;br /&gt;
0.33&lt;br /&gt;
3.33e-01&lt;br /&gt;
3.33e-01&lt;br /&gt;
0.000000e+00&lt;br /&gt;
0.000000e+00&lt;br /&gt;
-0.000000e+00&lt;br /&gt;
-0.000000e+00&lt;br /&gt;
test 26 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test 27 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
test 27 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test 28 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 -9223372036854775807&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
test 28 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo Shell： ==&lt;br /&gt;
该部分代码测试了在 裸机 和 带&#039;&#039;&#039;freertos&#039;&#039;&#039;操作系统两种情况下串口的终端功能测试。&lt;br /&gt;
&lt;br /&gt;
这部分代码存放在SDK的 bouffalo_sdk/examples/shell 路径下。&lt;br /&gt;
&lt;br /&gt;
=== Demo:shell_os ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;help&lt;br /&gt;
shell commands list:&lt;br /&gt;
test&lt;br /&gt;
free&lt;br /&gt;
memtrace&lt;br /&gt;
help&lt;br /&gt;
mfg&lt;br /&gt;
reboot&lt;br /&gt;
sysver&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Demo:shell_no_os ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;help&lt;br /&gt;
shell commands list:&lt;br /&gt;
test&lt;br /&gt;
free&lt;br /&gt;
memtrace&lt;br /&gt;
help&lt;br /&gt;
ps&lt;br /&gt;
mfg&lt;br /&gt;
reboot&lt;br /&gt;
sysver&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:pmu ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这部分Demo主要测试了开发板的两种休眠模式。Hibernation 休眠模式 和 Power down sleep 深度休眠模式，其中，HBN 是更深层次的休眠每次唤醒都从头执行，除了SRAM保持区其余都不储存。 适合长时间关机，实时性低。&lt;br /&gt;
&lt;br /&gt;
而 PDS 是中层次的休眠，唤醒从断线执行，而且保留寄存器，SRAM 和 部分外设的信息。 适合段是关机，比如每秒唤醒一次，实时性更高。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/pmu/xxxx/其中 xxxx 是开发板对应的型号。&lt;br /&gt;
&lt;br /&gt;
=== Demo:hbn_rtc: ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
qe write len     0x02&lt;br /&gt;
cread support    0x01&lt;br /&gt;
cread code       0x20&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
enter hbn mode&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Demo:pds_rtc: ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ead reg cmd1    0x35&lt;br /&gt;
write reg cmd0   0x01&lt;br /&gt;
write reg cmd1   0x01&lt;br /&gt;
qe write len     0x02&lt;br /&gt;
cread support    0x01&lt;br /&gt;
cread code       0x20&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
enter pds mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;这两个Demo 中有配有RTC,会不断的唤醒和睡眠。&lt;br /&gt;
&lt;br /&gt;
== Demo:wo ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
保存在SDK 下：bouffalo_sdk/examples/peripherals/wo/wo_int&lt;br /&gt;
&lt;br /&gt;
该Demo测试了博流Bouffalo芯片中WO(Waveform Output)外设的中断功能。&lt;br /&gt;
&lt;br /&gt;
测试包括：&lt;br /&gt;
&lt;br /&gt;
# WO外设的三种中断类型的触发和处理&lt;br /&gt;
# WO外设的配置参数设置&lt;br /&gt;
# 不同数据量下的FIFO操作&lt;br /&gt;
# 中断屏蔽和解除屏蔽功能&lt;br /&gt;
# WO外设的使能和禁用功能&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
interrupt end!&lt;br /&gt;
interrupt fifo!&lt;br /&gt;
interrupt fifo!&lt;br /&gt;
interrupt fer!&lt;br /&gt;
interrupt fer!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:wdg ==&lt;br /&gt;
该Demo 主要测试watch dog 看门狗外设的基本功能。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下： bouffalo_sdk/examples/peripherals/wdg/wdg_int &lt;br /&gt;
测试的主要功能点：&lt;br /&gt;
&lt;br /&gt;
# 看门狗定时功能：验证在配置的时间范围内是否正确触发中断  验证计数器复位功能是否正常工作&lt;br /&gt;
# 中断处理机制：中断触发的及时性  中断清除功能  中断标志的正确设置&lt;br /&gt;
# 时间控制精度：1秒内不触发中断的准确性 2秒时正确触发中断的准确性&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
Watchdog interrupt test&lt;br /&gt;
Delay 1s, wdg interrupt not arrive, pass&lt;br /&gt;
Delay 2s, wdg interrupt arrived, pass&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=148</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=148"/>
		<updated>2025-08-11T09:30:47Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;源码部分输出：&#039;&#039;&#039;&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）支持 A/B 双分区设计，实现无缝固件更新和回滚处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：该程序会根据分区表加载固件到内存支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;   多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：OTA 更新：将新固件从临时分区复制到主分区防回滚（Anti-Rollback）：防止降级到不安全版本支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：SHA-256 校验 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Demo：mbedtls ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这段代码对tls中的加密功能进行了全面的自检测，保证mbedtls库可以正常在平台上运行。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的  bouffalo_sdk/examples/mbedtls&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ECDH测试&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdh_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ECDSA测试&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdsa_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：生成 ECDSA 密钥对。使用私钥对哈希值进行签名，生成签名。使用公钥验证签名的正确性。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;涉及的算法&#039;&#039;&#039;：ECDSA数字签名；哈希算法：SHA-256。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AES测试&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_aes_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SHA测试&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_sha_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算，输出哈希值&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
  SHA-1 test #1: passed&lt;br /&gt;
  SHA-1 test #2: passed&lt;br /&gt;
  SHA-1 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-224 test #1: passed&lt;br /&gt;
  SHA-224 test #2: passed&lt;br /&gt;
  SHA-224 test #3: passed&lt;br /&gt;
  SHA-256 test #1: passed&lt;br /&gt;
  SHA-256 test #2: passed&lt;br /&gt;
  SHA-256 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-384 test #1: passed&lt;br /&gt;
  SHA-384 test #2: passed&lt;br /&gt;
  SHA-384 test #3: passed&lt;br /&gt;
  SHA-512 test #1: passed&lt;br /&gt;
  SHA-512 test #2: passed&lt;br /&gt;
  SHA-512 test #3: passed&lt;br /&gt;
=========== ecdh test ================&lt;br /&gt;
setup rng ... ok&lt;br /&gt;
select ecp group SECP256R1 ... ok&lt;br /&gt;
Get public key time=33ms&lt;br /&gt;
1. ecdh client generate public parameter:&lt;br /&gt;
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED&lt;br /&gt;
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1&lt;br /&gt;
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22&lt;br /&gt;
     63 E3 AC 81 91&lt;br /&gt;
     &lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
aes ctr 192 block:1000 enc cost time:331 us&lt;br /&gt;
aes ctr 192 block:1000 dec cost time:329 us&lt;br /&gt;
test aes ctr 256 &lt;br /&gt;
aes ctr 256 block:1000 enc cost time:354 us&lt;br /&gt;
aes ctr 256 block:1000 dec cost time:354 us&lt;br /&gt;
&lt;br /&gt;
=========== sha test ================&lt;br /&gt;
sha1 block:1000 cost time:415 us&lt;br /&gt;
sha256 block:1000 cost time:268 us&lt;br /&gt;
sha512 block:1000 cost time:236 us&lt;br /&gt;
mbedtls test success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:memheap ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试申请和释放 内存memory 的功能是否正常。在当前代码下，程序会不断申请释放 无休止直到将内存消耗殆尽。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/memheap&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411520 byte&lt;br /&gt;
free memory :411520 byte&lt;br /&gt;
remain 25244 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411648 byte&lt;br /&gt;
free memory :411648 byte&lt;br /&gt;
remain 25116 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411776 byte&lt;br /&gt;
free memory :411776 byte&lt;br /&gt;
remain 24988 byte&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :433920 byte&lt;br /&gt;
free memory :433920 byte&lt;br /&gt;
remain 2844 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :434048 byte&lt;br /&gt;
free memory :434048 byte&lt;br /&gt;
tlsf malloc 434176 bytes failed at function bflb_malloc using heap base:0x62fc5554&lt;br /&gt;
remain 436900 byte&lt;br /&gt;
try to get 434176 byte memory failed!&lt;br /&gt;
memheap test fail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:partition ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试分区表获取和输出。所以这里主要要烧录whole bin,否则没有烧录分区表会导致失败。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
======= PtTable_Config @0x62fc3cc8=======&lt;br /&gt;
magicCode 0x54504642; version 0x0000; entryCnt 8; age 0; crc32 0xE38928F3&lt;br /&gt;
idx  type device active_index     name   Address[0]  Address[1]  Length[0]   Length[1]   age&lt;br /&gt;
[00]  16     0         0        Boot2  0x00000000  0x00000000  0x0000e000  0x00000000  0&lt;br /&gt;
[01]  00     0         0           FW  0x00010000  0x00210000  0x00200000  0x00168000  0&lt;br /&gt;
[02]  10     0         0          mfg  0x00210000  0x00000000  0x00168000  0x00000000  0&lt;br /&gt;
[03]  02     0         0        media  0x00378000  0x00000000  0x00071000  0x00000000  0&lt;br /&gt;
[04]  03     0         0          PSM  0x003e9000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
[05]  04     0         0          KEY  0x003f1000  0x00000000  0x00002000  0x00000000  0&lt;br /&gt;
[06]  05     0         0         DATA  0x003f3000  0x00000000  0x00005000  0x00000000  0&lt;br /&gt;
[07]  06     0         0      factory  0x003f8000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中： 索引的 0 和 1 分别代表不同的区，一个是活跃的当前正在使用的，另一个是备份的用于当升级失败回滚的。&lt;br /&gt;
&lt;br /&gt;
== Demo:efuse_trim ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该Demo主要用于验证efuse中储存的修剪数值是否正确，这些修剪值用于矫正一些模块。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下 ： bouffalo_sdk/examples/peripherals/efuse/efuse_trim&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;初始化和设备获取&#039;&#039;&#039;：&lt;br /&gt;
#* 调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。&lt;br /&gt;
#* 使用 &amp;lt;code&amp;gt;bflb_device_get_by_name(&amp;quot;ef_ctrl&amp;quot;)&amp;lt;/code&amp;gt; 获取 eFuse 控制设备的句柄。&lt;br /&gt;
# &#039;&#039;&#039;修剪值读取和验证&#039;&#039;&#039;：&lt;br /&gt;
#* 定义了一个数组 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，然后遍历 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，调用 &amp;lt;code&amp;gt;bflb_ef_ctrl_read_common_trim&amp;lt;/code&amp;gt; 读取每个修剪值。&lt;br /&gt;
#* 如果修剪值有效，则进一步验证其奇偶校验。如果校验通过，打印修剪值；否则提示校验错误。&lt;br /&gt;
#* 如果修剪值无效，提示未找到。&lt;br /&gt;
&#039;&#039;&#039;示例输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
eFuse read trim value case!&lt;br /&gt;
trim rc32m value=108!&lt;br /&gt;
trim rc32k value=273!&lt;br /&gt;
trim tsen value=2149!&lt;br /&gt;
case finished!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:i2s_es8311 ==&lt;br /&gt;
该Demo的主要用途是实现音频数据采集和播放。主要功能是初始化并配置 I2S 接口和 ES8311 音频编解码器，以实现音频数据的传输和处理。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/peripherals/i2s/i2s_es8311&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;硬件初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。初始化 GPIO 引脚&amp;lt;code&amp;gt;i2s_gpio_init()&amp;lt;/code&amp;gt;，为 I2S 和 I2C 接口分配功能引脚。&lt;br /&gt;
# &#039;&#039;&#039;主时钟输出&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;mclk_out_init()&amp;lt;/code&amp;gt; 配置 I2S 的主时钟输出，为外部音频设备ES8311提供时钟信号。&lt;br /&gt;
# &#039;&#039;&#039;ES8311 音频编解码器初始化&#039;&#039;&#039;：配置 ES8311 的工作模式。调用 &amp;lt;code&amp;gt;es8311_init()&amp;lt;/code&amp;gt; 初始化 ES8311，并设置音量。启动 ES8311 的 ADC 和 DAC 模块。&lt;br /&gt;
# &#039;&#039;&#039;I2S 和 DMA 初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;i2s_dma_init()&amp;lt;/code&amp;gt; 初始化 I2S 接口和 DMA 通道。配置 DMA 通道，启动 DMA 通道，开始音频数据的传输和接收。&lt;br /&gt;
&#039;&#039;&#039;示例输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
es8311 init&lt;br /&gt;
read chip id failed!&lt;br /&gt;
SET: volume:70%&lt;br /&gt;
i2s init&lt;br /&gt;
dma init&lt;br /&gt;
dma lli init&lt;br /&gt;
tx dma lli num: 2 &lt;br /&gt;
rx dma lli num: 2 &lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:printf ==&lt;br /&gt;
该demo主要测试基本printf功能是否完整，正常。&lt;br /&gt;
&lt;br /&gt;
保存在SDK 下：bouffalo_sdk/examples/printf&lt;br /&gt;
&lt;br /&gt;
=== 测试的主要功能包括： ===&lt;br /&gt;
&lt;br /&gt;
# 格式化标志(Flags)测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_space_flag&amp;lt;/code&amp;gt;: 测试空格标志( )的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_plus_flag&amp;lt;/code&amp;gt;: 测试加号标志(&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_zero_flag&amp;lt;/code&amp;gt;: 测试零填充标志(&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_minus_flag&amp;lt;/code&amp;gt;: 测试左对齐标志(&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_sharp_flag&amp;lt;/code&amp;gt;: 测试井号标志(&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
&lt;br /&gt;
# 宽度和精度测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_width&amp;lt;/code&amp;gt;: 测试基本宽度指定&lt;br /&gt;
* &amp;lt;code&amp;gt;test_width_20&amp;lt;/code&amp;gt;: 测试20字符宽度的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_padding_20&amp;lt;/code&amp;gt;: 测试20字符填充&lt;br /&gt;
* &amp;lt;code&amp;gt;test_padding_dot_20&amp;lt;/code&amp;gt;: 测试带小数点的20字符填充&lt;br /&gt;
&lt;br /&gt;
# 数值类型测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_integer_types&amp;lt;/code&amp;gt;: 测试各种整数类型(int, long, long long等)&lt;br /&gt;
* &amp;lt;code&amp;gt;test_floating_point_specifiers_precision_and_flags&amp;lt;/code&amp;gt;: 测试浮点数的精度和标志&lt;br /&gt;
* &amp;lt;code&amp;gt;test_pointer&amp;lt;/code&amp;gt;: 测试指针类型的打印&lt;br /&gt;
&lt;br /&gt;
# 特殊情况测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_infinity_and_not_a_number_values&amp;lt;/code&amp;gt;: 测试无穷大和NaN值的打印&lt;br /&gt;
* &amp;lt;code&amp;gt;test_tiny_floating_point_values&amp;lt;/code&amp;gt;: 测试极小浮点数的打印&lt;br /&gt;
&lt;br /&gt;
# 字符串相关测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_string_length&amp;lt;/code&amp;gt;: 测试字符串长度限制打印&lt;br /&gt;
&#039;&#039;&#039;示例输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
test 26 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
53000atest-20 bit&lt;br /&gt;
53000atest-20 bit&lt;br /&gt;
0.33&lt;br /&gt;
0.33&lt;br /&gt;
1&lt;br /&gt;
1&lt;br /&gt;
foo&lt;br /&gt;
foo&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     00004&lt;br /&gt;
     00004&lt;br /&gt;
hi x&lt;br /&gt;
hi x&lt;br /&gt;
00123               &lt;br /&gt;
00123               &lt;br /&gt;
-67224.546875000000000000&lt;br /&gt;
-67224.546875000000000000&lt;br /&gt;
0.33&lt;br /&gt;
0.33&lt;br /&gt;
3.33e-01&lt;br /&gt;
3.33e-01&lt;br /&gt;
0.000000e+00&lt;br /&gt;
0.000000e+00&lt;br /&gt;
-0.000000e+00&lt;br /&gt;
-0.000000e+00&lt;br /&gt;
test 26 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test 27 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
test 27 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test 28 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 -9223372036854775807&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
test 28 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo Shell： ==&lt;br /&gt;
该部分代码测试了在 裸机 和 带&#039;&#039;&#039;freertos&#039;&#039;&#039;操作系统两种情况下串口的终端功能测试。&lt;br /&gt;
&lt;br /&gt;
这部分代码存放在SDK的 bouffalo_sdk/examples/shell 路径下。&lt;br /&gt;
&lt;br /&gt;
=== Demo:shell_os ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;help&lt;br /&gt;
shell commands list:&lt;br /&gt;
test&lt;br /&gt;
free&lt;br /&gt;
memtrace&lt;br /&gt;
help&lt;br /&gt;
mfg&lt;br /&gt;
reboot&lt;br /&gt;
sysver&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Demo:shell_no_os ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;help&lt;br /&gt;
shell commands list:&lt;br /&gt;
test&lt;br /&gt;
free&lt;br /&gt;
memtrace&lt;br /&gt;
help&lt;br /&gt;
ps&lt;br /&gt;
mfg&lt;br /&gt;
reboot&lt;br /&gt;
sysver&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:pmu ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这部分Demo主要测试了开发板的两种休眠模式。Hibernation 休眠模式 和 Power down sleep 深度休眠模式，其中，HBN 是更深层次的休眠每次唤醒都从头执行，除了SRAM保持区其余都不储存。 适合长时间关机，实时性低。&lt;br /&gt;
&lt;br /&gt;
而 PDS 是中层次的休眠，唤醒从断线执行，而且保留寄存器，SRAM 和 部分外设的信息。 适合段是关机，比如每秒唤醒一次，实时性更高。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/pmu/xxxx/其中 xxxx 是开发板对应的型号。&lt;br /&gt;
&lt;br /&gt;
=== Demo:hbn_rtc: ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
qe write len     0x02&lt;br /&gt;
cread support    0x01&lt;br /&gt;
cread code       0x20&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
enter hbn mode&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Demo:pds_rtc: ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ead reg cmd1    0x35&lt;br /&gt;
write reg cmd0   0x01&lt;br /&gt;
write reg cmd1   0x01&lt;br /&gt;
qe write len     0x02&lt;br /&gt;
cread support    0x01&lt;br /&gt;
cread code       0x20&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
enter pds mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;这两个Demo 中有配有RTC,会不断的唤醒和睡眠。&lt;br /&gt;
&lt;br /&gt;
== Demo:wo ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
保存在SDK 下：bouffalo_sdk/examples/peripherals/wo/wo_int&lt;br /&gt;
&lt;br /&gt;
该Demo测试了博流Bouffalo芯片中WO(Waveform Output)外设的中断功能。&lt;br /&gt;
&lt;br /&gt;
测试包括：&lt;br /&gt;
&lt;br /&gt;
# WO外设的三种中断类型的触发和处理&lt;br /&gt;
# WO外设的配置参数设置&lt;br /&gt;
# 不同数据量下的FIFO操作&lt;br /&gt;
# 中断屏蔽和解除屏蔽功能&lt;br /&gt;
# WO外设的使能和禁用功能&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
interrupt end!&lt;br /&gt;
interrupt fifo!&lt;br /&gt;
interrupt fifo!&lt;br /&gt;
interrupt fer!&lt;br /&gt;
interrupt fer!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=147</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=147"/>
		<updated>2025-08-11T09:28:50Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）支持 A/B 双分区设计，实现无缝固件更新和回滚处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：该程序会根据分区表加载固件到内存支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;   多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：OTA 更新：将新固件从临时分区复制到主分区防回滚（Anti-Rollback）：防止降级到不安全版本支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：SHA-256 校验 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Demo：mbedtls ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这段代码对tls中的加密功能进行了全面的自检测，保证mbedtls库可以正常在平台上运行。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的  bouffalo_sdk/examples/mbedtls&lt;br /&gt;
&lt;br /&gt;
=== ECDH测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdh_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致&lt;br /&gt;
&lt;br /&gt;
=== ECDSA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdsa_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：生成 ECDSA 密钥对。使用私钥对哈希值进行签名，生成签名。使用公钥验证签名的正确性。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;涉及的算法&#039;&#039;&#039;：ECDSA数字签名；哈希算法：SHA-256。&lt;br /&gt;
&lt;br /&gt;
=== AES测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_aes_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。&lt;br /&gt;
&lt;br /&gt;
=== SHA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_sha_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算，输出哈希值&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
  SHA-1 test #1: passed&lt;br /&gt;
  SHA-1 test #2: passed&lt;br /&gt;
  SHA-1 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-224 test #1: passed&lt;br /&gt;
  SHA-224 test #2: passed&lt;br /&gt;
  SHA-224 test #3: passed&lt;br /&gt;
  SHA-256 test #1: passed&lt;br /&gt;
  SHA-256 test #2: passed&lt;br /&gt;
  SHA-256 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-384 test #1: passed&lt;br /&gt;
  SHA-384 test #2: passed&lt;br /&gt;
  SHA-384 test #3: passed&lt;br /&gt;
  SHA-512 test #1: passed&lt;br /&gt;
  SHA-512 test #2: passed&lt;br /&gt;
  SHA-512 test #3: passed&lt;br /&gt;
=========== ecdh test ================&lt;br /&gt;
setup rng ... ok&lt;br /&gt;
select ecp group SECP256R1 ... ok&lt;br /&gt;
Get public key time=33ms&lt;br /&gt;
1. ecdh client generate public parameter:&lt;br /&gt;
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED&lt;br /&gt;
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1&lt;br /&gt;
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22&lt;br /&gt;
     63 E3 AC 81 91&lt;br /&gt;
     &lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
aes ctr 192 block:1000 enc cost time:331 us&lt;br /&gt;
aes ctr 192 block:1000 dec cost time:329 us&lt;br /&gt;
test aes ctr 256 &lt;br /&gt;
aes ctr 256 block:1000 enc cost time:354 us&lt;br /&gt;
aes ctr 256 block:1000 dec cost time:354 us&lt;br /&gt;
&lt;br /&gt;
=========== sha test ================&lt;br /&gt;
sha1 block:1000 cost time:415 us&lt;br /&gt;
sha256 block:1000 cost time:268 us&lt;br /&gt;
sha512 block:1000 cost time:236 us&lt;br /&gt;
mbedtls test success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:memheap ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试申请和释放 内存memory 的功能是否正常。在当前代码下，程序会不断申请释放 无休止直到将内存消耗殆尽。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/memheap&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411520 byte&lt;br /&gt;
free memory :411520 byte&lt;br /&gt;
remain 25244 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411648 byte&lt;br /&gt;
free memory :411648 byte&lt;br /&gt;
remain 25116 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411776 byte&lt;br /&gt;
free memory :411776 byte&lt;br /&gt;
remain 24988 byte&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :433920 byte&lt;br /&gt;
free memory :433920 byte&lt;br /&gt;
remain 2844 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :434048 byte&lt;br /&gt;
free memory :434048 byte&lt;br /&gt;
tlsf malloc 434176 bytes failed at function bflb_malloc using heap base:0x62fc5554&lt;br /&gt;
remain 436900 byte&lt;br /&gt;
try to get 434176 byte memory failed!&lt;br /&gt;
memheap test fail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:partition ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试分区表获取和输出。所以这里主要要烧录whole bin,否则没有烧录分区表会导致失败。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
======= PtTable_Config @0x62fc3cc8=======&lt;br /&gt;
magicCode 0x54504642; version 0x0000; entryCnt 8; age 0; crc32 0xE38928F3&lt;br /&gt;
idx  type device active_index     name   Address[0]  Address[1]  Length[0]   Length[1]   age&lt;br /&gt;
[00]  16     0         0        Boot2  0x00000000  0x00000000  0x0000e000  0x00000000  0&lt;br /&gt;
[01]  00     0         0           FW  0x00010000  0x00210000  0x00200000  0x00168000  0&lt;br /&gt;
[02]  10     0         0          mfg  0x00210000  0x00000000  0x00168000  0x00000000  0&lt;br /&gt;
[03]  02     0         0        media  0x00378000  0x00000000  0x00071000  0x00000000  0&lt;br /&gt;
[04]  03     0         0          PSM  0x003e9000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
[05]  04     0         0          KEY  0x003f1000  0x00000000  0x00002000  0x00000000  0&lt;br /&gt;
[06]  05     0         0         DATA  0x003f3000  0x00000000  0x00005000  0x00000000  0&lt;br /&gt;
[07]  06     0         0      factory  0x003f8000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中： 索引的 0 和 1 分别代表不同的区，一个是活跃的当前正在使用的，另一个是备份的用于当升级失败回滚的。&lt;br /&gt;
&lt;br /&gt;
== Demo:efuse_trim ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该Demo主要用于验证efuse中储存的修剪数值是否正确，这些修剪值用于矫正一些模块。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下 ： bouffalo_sdk/examples/peripherals/efuse/efuse_trim&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;初始化和设备获取&#039;&#039;&#039;：&lt;br /&gt;
#* 调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。&lt;br /&gt;
#* 使用 &amp;lt;code&amp;gt;bflb_device_get_by_name(&amp;quot;ef_ctrl&amp;quot;)&amp;lt;/code&amp;gt; 获取 eFuse 控制设备的句柄。&lt;br /&gt;
# &#039;&#039;&#039;修剪值读取和验证&#039;&#039;&#039;：&lt;br /&gt;
#* 定义了一个数组 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，然后遍历 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，调用 &amp;lt;code&amp;gt;bflb_ef_ctrl_read_common_trim&amp;lt;/code&amp;gt; 读取每个修剪值。&lt;br /&gt;
#* 如果修剪值有效，则进一步验证其奇偶校验。如果校验通过，打印修剪值；否则提示校验错误。&lt;br /&gt;
#* 如果修剪值无效，提示未找到。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
eFuse read trim value case!&lt;br /&gt;
trim rc32m value=108!&lt;br /&gt;
trim rc32k value=273!&lt;br /&gt;
trim tsen value=2149!&lt;br /&gt;
case finished!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:i2s_es8311 ==&lt;br /&gt;
该Demo的主要用途是实现音频数据采集和播放。主要功能是初始化并配置 I2S 接口和 ES8311 音频编解码器，以实现音频数据的传输和处理。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/peripherals/i2s/i2s_es8311&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;硬件初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。初始化 GPIO 引脚&amp;lt;code&amp;gt;i2s_gpio_init()&amp;lt;/code&amp;gt;，为 I2S 和 I2C 接口分配功能引脚。&lt;br /&gt;
# &#039;&#039;&#039;主时钟输出&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;mclk_out_init()&amp;lt;/code&amp;gt; 配置 I2S 的主时钟输出，为外部音频设备ES8311提供时钟信号。&lt;br /&gt;
# &#039;&#039;&#039;ES8311 音频编解码器初始化&#039;&#039;&#039;：配置 ES8311 的工作模式。调用 &amp;lt;code&amp;gt;es8311_init()&amp;lt;/code&amp;gt; 初始化 ES8311，并设置音量。启动 ES8311 的 ADC 和 DAC 模块。&lt;br /&gt;
# &#039;&#039;&#039;I2S 和 DMA 初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;i2s_dma_init()&amp;lt;/code&amp;gt; 初始化 I2S 接口和 DMA 通道。配置 DMA 通道，启动 DMA 通道，开始音频数据的传输和接收。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
es8311 init&lt;br /&gt;
read chip id failed!&lt;br /&gt;
SET: volume:70%&lt;br /&gt;
i2s init&lt;br /&gt;
dma init&lt;br /&gt;
dma lli init&lt;br /&gt;
tx dma lli num: 2 &lt;br /&gt;
rx dma lli num: 2 &lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:printf ==&lt;br /&gt;
该demo主要测试基本printf功能是否完整，正常。&lt;br /&gt;
&lt;br /&gt;
保存在SDK 下：bouffalo_sdk/examples/printf&lt;br /&gt;
&lt;br /&gt;
=== 测试的主要功能包括： ===&lt;br /&gt;
&lt;br /&gt;
# 格式化标志(Flags)测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_space_flag&amp;lt;/code&amp;gt;: 测试空格标志( )的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_plus_flag&amp;lt;/code&amp;gt;: 测试加号标志(&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_zero_flag&amp;lt;/code&amp;gt;: 测试零填充标志(&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_minus_flag&amp;lt;/code&amp;gt;: 测试左对齐标志(&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_sharp_flag&amp;lt;/code&amp;gt;: 测试井号标志(&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
&lt;br /&gt;
# 宽度和精度测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_width&amp;lt;/code&amp;gt;: 测试基本宽度指定&lt;br /&gt;
* &amp;lt;code&amp;gt;test_width_20&amp;lt;/code&amp;gt;: 测试20字符宽度的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_padding_20&amp;lt;/code&amp;gt;: 测试20字符填充&lt;br /&gt;
* &amp;lt;code&amp;gt;test_padding_dot_20&amp;lt;/code&amp;gt;: 测试带小数点的20字符填充&lt;br /&gt;
&lt;br /&gt;
# 数值类型测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_integer_types&amp;lt;/code&amp;gt;: 测试各种整数类型(int, long, long long等)&lt;br /&gt;
* &amp;lt;code&amp;gt;test_floating_point_specifiers_precision_and_flags&amp;lt;/code&amp;gt;: 测试浮点数的精度和标志&lt;br /&gt;
* &amp;lt;code&amp;gt;test_pointer&amp;lt;/code&amp;gt;: 测试指针类型的打印&lt;br /&gt;
&lt;br /&gt;
# 特殊情况测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_infinity_and_not_a_number_values&amp;lt;/code&amp;gt;: 测试无穷大和NaN值的打印&lt;br /&gt;
* &amp;lt;code&amp;gt;test_tiny_floating_point_values&amp;lt;/code&amp;gt;: 测试极小浮点数的打印&lt;br /&gt;
&lt;br /&gt;
# 字符串相关测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_string_length&amp;lt;/code&amp;gt;: 测试字符串长度限制打印&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
test 26 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
53000atest-20 bit&lt;br /&gt;
53000atest-20 bit&lt;br /&gt;
0.33&lt;br /&gt;
0.33&lt;br /&gt;
1&lt;br /&gt;
1&lt;br /&gt;
foo&lt;br /&gt;
foo&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     00004&lt;br /&gt;
     00004&lt;br /&gt;
hi x&lt;br /&gt;
hi x&lt;br /&gt;
00123               &lt;br /&gt;
00123               &lt;br /&gt;
-67224.546875000000000000&lt;br /&gt;
-67224.546875000000000000&lt;br /&gt;
0.33&lt;br /&gt;
0.33&lt;br /&gt;
3.33e-01&lt;br /&gt;
3.33e-01&lt;br /&gt;
0.000000e+00&lt;br /&gt;
0.000000e+00&lt;br /&gt;
-0.000000e+00&lt;br /&gt;
-0.000000e+00&lt;br /&gt;
test 26 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test 27 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
test 27 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test 28 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 -9223372036854775807&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
test 28 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo Shell： ==&lt;br /&gt;
该部分代码测试了在 裸机 和 带&#039;&#039;&#039;freertos&#039;&#039;&#039;操作系统两种情况下串口的终端功能测试。&lt;br /&gt;
&lt;br /&gt;
这部分代码存放在SDK的 bouffalo_sdk/examples/shell 路径下。&lt;br /&gt;
&lt;br /&gt;
=== Demo:shell_os ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;help&lt;br /&gt;
shell commands list:&lt;br /&gt;
test&lt;br /&gt;
free&lt;br /&gt;
memtrace&lt;br /&gt;
help&lt;br /&gt;
mfg&lt;br /&gt;
reboot&lt;br /&gt;
sysver&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Demo:shell_no_os ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;help&lt;br /&gt;
shell commands list:&lt;br /&gt;
test&lt;br /&gt;
free&lt;br /&gt;
memtrace&lt;br /&gt;
help&lt;br /&gt;
ps&lt;br /&gt;
mfg&lt;br /&gt;
reboot&lt;br /&gt;
sysver&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:pmu ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这部分Demo主要测试了开发板的两种休眠模式。Hibernation 休眠模式 和 Power down sleep 深度休眠模式，其中，HBN 是更深层次的休眠每次唤醒都从头执行，除了SRAM保持区其余都不储存。 适合长时间关机，实时性低。&lt;br /&gt;
&lt;br /&gt;
而 PDS 是中层次的休眠，唤醒从断线执行，而且保留寄存器，SRAM 和 部分外设的信息。 适合段是关机，比如每秒唤醒一次，实时性更高。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/pmu/xxxx/其中 xxxx 是开发板对应的型号。&lt;br /&gt;
&lt;br /&gt;
=== Demo:hbn_rtc: ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
qe write len     0x02&lt;br /&gt;
cread support    0x01&lt;br /&gt;
cread code       0x20&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
enter hbn mode&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Demo:pds_rtc: ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ead reg cmd1    0x35&lt;br /&gt;
write reg cmd0   0x01&lt;br /&gt;
write reg cmd1   0x01&lt;br /&gt;
qe write len     0x02&lt;br /&gt;
cread support    0x01&lt;br /&gt;
cread code       0x20&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
enter pds mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;这两个Demo 中有配有RTC,会不断的唤醒和睡眠。&lt;br /&gt;
&lt;br /&gt;
== Demo:wo ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
保存在SDK 下：bouffalo_sdk/examples/peripherals/wo/wo_int&lt;br /&gt;
&lt;br /&gt;
该Demo测试了博流Bouffalo芯片中WO(Waveform Output)外设的中断功能。&lt;br /&gt;
&lt;br /&gt;
测试包括：&lt;br /&gt;
&lt;br /&gt;
# WO外设的三种中断类型的触发和处理&lt;br /&gt;
# WO外设的配置参数设置&lt;br /&gt;
# 不同数据量下的FIFO操作&lt;br /&gt;
# 中断屏蔽和解除屏蔽功能&lt;br /&gt;
# WO外设的使能和禁用功能&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
interrupt end!&lt;br /&gt;
interrupt fifo!&lt;br /&gt;
interrupt fifo!&lt;br /&gt;
interrupt fer!&lt;br /&gt;
interrupt fer!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=146</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=146"/>
		<updated>2025-08-11T09:16:56Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​/* Demos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Started =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/bouffalolab/bouffalo_sdk 如何获取SDK]&lt;br /&gt;
* [[如何在Ubuntu上搭建编译环境]]&lt;br /&gt;
* [[如何在Windows上搭建编译环境]]&lt;br /&gt;
* [[如何获取开发板]]&lt;br /&gt;
* [[烧录固件到开发板]]&lt;br /&gt;
&lt;br /&gt;
= Bouffalo SDK =&lt;br /&gt;
&#039;&#039;&#039;BouffaloSDK&#039;&#039;&#039; 是 Bouffalo Lab 提供的 IOT 和 MCU 软件开发包，支持博流智能所有系列芯片，也是 &#039;&#039;&#039;bl_mcu_sdk&#039;&#039;&#039; 和 &#039;&#039;&#039;bl_iot_sdk&#039;&#039;&#039; 的结合体。&lt;br /&gt;
&lt;br /&gt;
[[文件:BouffaloSDK.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
= Peripherals =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[I2S]]&lt;br /&gt;
*[[I2C]]&lt;br /&gt;
*[[CVBS]]&lt;br /&gt;
*[[Watchdog]]&lt;br /&gt;
*[[GSM/GPRS]]&lt;br /&gt;
*[[Codec]]&lt;br /&gt;
*[[PCIe]]&lt;br /&gt;
*[[GPIO]]&lt;br /&gt;
*[[eMMC]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[WiFi]]&lt;br /&gt;
*[[LED]]&lt;br /&gt;
*[[Serial port]]&lt;br /&gt;
*[[PWM]]&lt;br /&gt;
*[[SPI]]&lt;br /&gt;
*[[USB OTG]]&lt;br /&gt;
*[[LCD]]&lt;br /&gt;
*[[CPU]]&lt;br /&gt;
*[[Network]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Bluetooth]]&lt;br /&gt;
*[[HDMI]]&lt;br /&gt;
*[[Camera]]&lt;br /&gt;
*[[Memory]]&lt;br /&gt;
*[[RTC]]&lt;br /&gt;
*[[EEPROM]]&lt;br /&gt;
*[[MIPI-DSI]]&lt;br /&gt;
*[[NPU]]&lt;br /&gt;
*[[VPU]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Products =&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL602]]&lt;br /&gt;
* [[BL702]]&lt;br /&gt;
* [[BL618]]&lt;br /&gt;
* [[BL606P]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL702L]]&lt;br /&gt;
* [[BL616]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Develop Boards =&lt;br /&gt;
* BL602EVB&lt;br /&gt;
&lt;br /&gt;
= Application Notes =&lt;br /&gt;
* [[SDIOWIFI架构和开发手册]]&lt;br /&gt;
* [[BL616低功耗开发手册]]&lt;br /&gt;
* [[USB Wi-Fi用户手册]]&lt;br /&gt;
&lt;br /&gt;
= Demos =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:FreeRTOS]]&lt;br /&gt;
* [[Demo:wifi sta]]&lt;br /&gt;
* [[Demo:boot2_isp]]&lt;br /&gt;
* [[Demo:helloworld]]&lt;br /&gt;
* [[Demo:smartconfig ble]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:DMA]]&lt;br /&gt;
* [[Demo:Btble]]&lt;br /&gt;
* [[Demo:coremark]]&lt;br /&gt;
* [[Demo:littlefs]]&lt;br /&gt;
* [[Demo:posix freertos]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:Flash]]&lt;br /&gt;
* [[Demo:Basical case]]&lt;br /&gt;
* [[Demo:dsp]]&lt;br /&gt;
* [[Demo:cks]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:posix_freertos&amp;diff=145</id>
		<title>Demo:posix freertos</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:posix_freertos&amp;diff=145"/>
		<updated>2025-08-11T09:15:48Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​创建页面，内容为“=== Demo介绍： === 保存在SDK下：bouffalo_sdk/examples/posix/freertos  这段代码主要测试了两个POSIX标准接口在FreeRTOS环境下的功能实现：消息队列(Message Queue)和信号量(Semaphore)。  === Posix标准： === &amp;#039;&amp;#039;&amp;#039;这是一个接口标准&amp;#039;&amp;#039;&amp;#039;，由于Linux的各种版本发布非常非常多，导致如果没有标准，那么一个软件要适配所有发行版本的难度极高。IEEE组织设定了一个标准，这解释了…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Demo介绍： ===&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/posix/freertos&lt;br /&gt;
&lt;br /&gt;
这段代码主要测试了两个POSIX标准接口在FreeRTOS环境下的功能实现：消息队列(Message Queue)和信号量(Semaphore)。&lt;br /&gt;
&lt;br /&gt;
=== Posix标准： ===&lt;br /&gt;
&#039;&#039;&#039;这是一个接口标准&#039;&#039;&#039;，由于Linux的各种版本发布非常非常多，导致如果没有标准，那么一个软件要适配所有发行版本的难度极高。IEEE组织设定了一个标准，这解释了为什么个个Linux的命令比如ls clear cd mkdir 等基本命令可以通用。&lt;br /&gt;
&lt;br /&gt;
=== 代码分析： ===&lt;br /&gt;
&lt;br /&gt;
# 消息队列测试 (&amp;lt;code&amp;gt;mqueues_test.c&amp;lt;/code&amp;gt;):&lt;br /&gt;
#* 创建两个消息队列mq1和mq2&lt;br /&gt;
#* 创建4个线程：send1、send2和rev1、rev2&lt;br /&gt;
#* 每个发送者发送3条不同优先级的消息&lt;br /&gt;
#* 每个接收者接收3条消息&lt;br /&gt;
# 测试重点：消息队列的基本操作：&amp;lt;code&amp;gt;mq_open&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;mq_send&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;mq_receive&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;mq_close&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;mq_unlink&amp;lt;/code&amp;gt;  非阻塞模式&amp;lt;code&amp;gt;O_NONBLOCK&amp;lt;/code&amp;gt;的工作情况&lt;br /&gt;
&lt;br /&gt;
# 信号量测试 (&amp;lt;code&amp;gt;semaphores_test.c&amp;lt;/code&amp;gt;):&lt;br /&gt;
#* 实现了一个经典的生产者-消费者模型&lt;br /&gt;
#* &amp;lt;code&amp;gt;occupied&amp;lt;/code&amp;gt;: 控制缓冲区可用空间&lt;br /&gt;
#* &amp;lt;code&amp;gt;empty&amp;lt;/code&amp;gt;: 控制缓冲区已使用空间&lt;br /&gt;
#* &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;: 互斥锁保护缓冲区访问&lt;br /&gt;
# 测试重点：信号量的基本操作：&amp;lt;code&amp;gt;sem_init&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;sem_wait&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;sem_post&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;sem_destroy&amp;lt;/code&amp;gt;,多线程同步和互斥机制，生产者-消费者问题的正确处理&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
[OS] Starting proc_hellow_entry task...&lt;br /&gt;
Enter into send_1 &lt;br /&gt;
[1] send &#039;msg test 1&#039; in thread send_1. &lt;br /&gt;
[2] send &#039;msg test 2&#039; in thread send_1. &lt;br /&gt;
[3] send &#039;msg test 3&#039; in thread send_1. &lt;br /&gt;
Enter into send_2 &lt;br /&gt;
[1] send &#039;msg test 1&#039; in thread send_2. &lt;br /&gt;
[2] send &#039;msg test Enter into receive_1 &lt;br /&gt;
[1] receive &#039;msg test 1&#039; in thread receive_1. &lt;br /&gt;
[2] receive &#039;msg test 2&#039; in thread receive_1. &lt;br /&gt;
[3] receive &#039;msg test 3&#039; in thread receive_1. &lt;br /&gt;
Enter into receive_2 &lt;br /&gt;
[1] receiv2&#039; in thread send_2. &lt;br /&gt;
[3] send &#039;msg test 3&#039; in thread send_2. &lt;br /&gt;
e &#039;msg test 1&#039; in thread receive_2. &lt;br /&gt;
[2] receive &#039;msg test 2&#039; in thread receive_2. &lt;br /&gt;
[3] receive &#039;msg test 3&#039; in thread receive_2. &lt;br /&gt;
mq PASS &lt;br /&gt;
producer has added 0 to the buffer[0] &lt;br /&gt;
producer has added 100 to the buffer[1] &lt;br /&gt;
producer has added 200 to the buffer[2] &lt;br /&gt;
producer has added 300 to the buffer[3] &lt;br /&gt;
producer has added 400 to the buffer[4] &lt;br /&gt;
consumer has taken 0 from buffer[0] &lt;br /&gt;
consumer has taken 100 from buffer[1] &lt;br /&gt;
consumer has taken 200 from buffer[2] &lt;br /&gt;
consumer has taken 300 from buffer[3] &lt;br /&gt;
consumer has taken 400 from buffer[4] &lt;br /&gt;
producer has added 500 to the buffer[0] &lt;br /&gt;
producer has added 600 to the buffer[1] &lt;br /&gt;
producer has added 700 to the buffer[2] &lt;br /&gt;
producer has added 800 to the buffer[3] &lt;br /&gt;
producer has added 900 to the buffer[4] &lt;br /&gt;
consumer has taken 500 from buffer[0] &lt;br /&gt;
consumer has taken 600 from buffer[1] &lt;br /&gt;
consumer has taken 700 from buffer[2] &lt;br /&gt;
consumer has taken 800 from buffer[3] &lt;br /&gt;
consumer has taken 900 from buffer[4] &lt;br /&gt;
sema PASS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=144</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=144"/>
		<updated>2025-08-11T09:01:04Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​SHELL HBN PDS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）支持 A/B 双分区设计，实现无缝固件更新和回滚处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：该程序会根据分区表加载固件到内存支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;   多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：OTA 更新：将新固件从临时分区复制到主分区防回滚（Anti-Rollback）：防止降级到不安全版本支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：SHA-256 校验 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Demo：mbedtls ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这段代码对tls中的加密功能进行了全面的自检测，保证mbedtls库可以正常在平台上运行。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的  bouffalo_sdk/examples/mbedtls&lt;br /&gt;
&lt;br /&gt;
=== ECDH测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdh_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致&lt;br /&gt;
&lt;br /&gt;
=== ECDSA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdsa_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：生成 ECDSA 密钥对。使用私钥对哈希值进行签名，生成签名。使用公钥验证签名的正确性。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;涉及的算法&#039;&#039;&#039;：ECDSA数字签名；哈希算法：SHA-256。&lt;br /&gt;
&lt;br /&gt;
=== AES测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_aes_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。&lt;br /&gt;
&lt;br /&gt;
=== SHA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_sha_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算，输出哈希值&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
  SHA-1 test #1: passed&lt;br /&gt;
  SHA-1 test #2: passed&lt;br /&gt;
  SHA-1 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-224 test #1: passed&lt;br /&gt;
  SHA-224 test #2: passed&lt;br /&gt;
  SHA-224 test #3: passed&lt;br /&gt;
  SHA-256 test #1: passed&lt;br /&gt;
  SHA-256 test #2: passed&lt;br /&gt;
  SHA-256 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-384 test #1: passed&lt;br /&gt;
  SHA-384 test #2: passed&lt;br /&gt;
  SHA-384 test #3: passed&lt;br /&gt;
  SHA-512 test #1: passed&lt;br /&gt;
  SHA-512 test #2: passed&lt;br /&gt;
  SHA-512 test #3: passed&lt;br /&gt;
=========== ecdh test ================&lt;br /&gt;
setup rng ... ok&lt;br /&gt;
select ecp group SECP256R1 ... ok&lt;br /&gt;
Get public key time=33ms&lt;br /&gt;
1. ecdh client generate public parameter:&lt;br /&gt;
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED&lt;br /&gt;
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1&lt;br /&gt;
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22&lt;br /&gt;
     63 E3 AC 81 91&lt;br /&gt;
     &lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
aes ctr 192 block:1000 enc cost time:331 us&lt;br /&gt;
aes ctr 192 block:1000 dec cost time:329 us&lt;br /&gt;
test aes ctr 256 &lt;br /&gt;
aes ctr 256 block:1000 enc cost time:354 us&lt;br /&gt;
aes ctr 256 block:1000 dec cost time:354 us&lt;br /&gt;
&lt;br /&gt;
=========== sha test ================&lt;br /&gt;
sha1 block:1000 cost time:415 us&lt;br /&gt;
sha256 block:1000 cost time:268 us&lt;br /&gt;
sha512 block:1000 cost time:236 us&lt;br /&gt;
mbedtls test success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:memheap ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试申请和释放 内存memory 的功能是否正常。在当前代码下，程序会不断申请释放 无休止直到将内存消耗殆尽。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/memheap&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411520 byte&lt;br /&gt;
free memory :411520 byte&lt;br /&gt;
remain 25244 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411648 byte&lt;br /&gt;
free memory :411648 byte&lt;br /&gt;
remain 25116 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411776 byte&lt;br /&gt;
free memory :411776 byte&lt;br /&gt;
remain 24988 byte&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :433920 byte&lt;br /&gt;
free memory :433920 byte&lt;br /&gt;
remain 2844 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :434048 byte&lt;br /&gt;
free memory :434048 byte&lt;br /&gt;
tlsf malloc 434176 bytes failed at function bflb_malloc using heap base:0x62fc5554&lt;br /&gt;
remain 436900 byte&lt;br /&gt;
try to get 434176 byte memory failed!&lt;br /&gt;
memheap test fail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:partition ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试分区表获取和输出。所以这里主要要烧录whole bin,否则没有烧录分区表会导致失败。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
======= PtTable_Config @0x62fc3cc8=======&lt;br /&gt;
magicCode 0x54504642; version 0x0000; entryCnt 8; age 0; crc32 0xE38928F3&lt;br /&gt;
idx  type device active_index     name   Address[0]  Address[1]  Length[0]   Length[1]   age&lt;br /&gt;
[00]  16     0         0        Boot2  0x00000000  0x00000000  0x0000e000  0x00000000  0&lt;br /&gt;
[01]  00     0         0           FW  0x00010000  0x00210000  0x00200000  0x00168000  0&lt;br /&gt;
[02]  10     0         0          mfg  0x00210000  0x00000000  0x00168000  0x00000000  0&lt;br /&gt;
[03]  02     0         0        media  0x00378000  0x00000000  0x00071000  0x00000000  0&lt;br /&gt;
[04]  03     0         0          PSM  0x003e9000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
[05]  04     0         0          KEY  0x003f1000  0x00000000  0x00002000  0x00000000  0&lt;br /&gt;
[06]  05     0         0         DATA  0x003f3000  0x00000000  0x00005000  0x00000000  0&lt;br /&gt;
[07]  06     0         0      factory  0x003f8000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中： 索引的 0 和 1 分别代表不同的区，一个是活跃的当前正在使用的，另一个是备份的用于当升级失败回滚的。&lt;br /&gt;
&lt;br /&gt;
== Demo:efuse_trim ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该Demo主要用于验证efuse中储存的修剪数值是否正确，这些修剪值用于矫正一些模块。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下 ： bouffalo_sdk/examples/peripherals/efuse/efuse_trim&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;初始化和设备获取&#039;&#039;&#039;：&lt;br /&gt;
#* 调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。&lt;br /&gt;
#* 使用 &amp;lt;code&amp;gt;bflb_device_get_by_name(&amp;quot;ef_ctrl&amp;quot;)&amp;lt;/code&amp;gt; 获取 eFuse 控制设备的句柄。&lt;br /&gt;
# &#039;&#039;&#039;修剪值读取和验证&#039;&#039;&#039;：&lt;br /&gt;
#* 定义了一个数组 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，然后遍历 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，调用 &amp;lt;code&amp;gt;bflb_ef_ctrl_read_common_trim&amp;lt;/code&amp;gt; 读取每个修剪值。&lt;br /&gt;
#* 如果修剪值有效，则进一步验证其奇偶校验。如果校验通过，打印修剪值；否则提示校验错误。&lt;br /&gt;
#* 如果修剪值无效，提示未找到。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
eFuse read trim value case!&lt;br /&gt;
trim rc32m value=108!&lt;br /&gt;
trim rc32k value=273!&lt;br /&gt;
trim tsen value=2149!&lt;br /&gt;
case finished!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:i2s_es8311 ==&lt;br /&gt;
该Demo的主要用途是实现音频数据采集和播放。主要功能是初始化并配置 I2S 接口和 ES8311 音频编解码器，以实现音频数据的传输和处理。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/peripherals/i2s/i2s_es8311&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;硬件初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。初始化 GPIO 引脚&amp;lt;code&amp;gt;i2s_gpio_init()&amp;lt;/code&amp;gt;，为 I2S 和 I2C 接口分配功能引脚。&lt;br /&gt;
# &#039;&#039;&#039;主时钟输出&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;mclk_out_init()&amp;lt;/code&amp;gt; 配置 I2S 的主时钟输出，为外部音频设备ES8311提供时钟信号。&lt;br /&gt;
# &#039;&#039;&#039;ES8311 音频编解码器初始化&#039;&#039;&#039;：配置 ES8311 的工作模式。调用 &amp;lt;code&amp;gt;es8311_init()&amp;lt;/code&amp;gt; 初始化 ES8311，并设置音量。启动 ES8311 的 ADC 和 DAC 模块。&lt;br /&gt;
# &#039;&#039;&#039;I2S 和 DMA 初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;i2s_dma_init()&amp;lt;/code&amp;gt; 初始化 I2S 接口和 DMA 通道。配置 DMA 通道，启动 DMA 通道，开始音频数据的传输和接收。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
es8311 init&lt;br /&gt;
read chip id failed!&lt;br /&gt;
SET: volume:70%&lt;br /&gt;
i2s init&lt;br /&gt;
dma init&lt;br /&gt;
dma lli init&lt;br /&gt;
tx dma lli num: 2 &lt;br /&gt;
rx dma lli num: 2 &lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:printf ==&lt;br /&gt;
该demo主要测试基本printf功能是否完整，正常。&lt;br /&gt;
&lt;br /&gt;
保存在SDK 下：bouffalo_sdk/examples/printf&lt;br /&gt;
&lt;br /&gt;
=== 测试的主要功能包括： ===&lt;br /&gt;
&lt;br /&gt;
# 格式化标志(Flags)测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_space_flag&amp;lt;/code&amp;gt;: 测试空格标志( )的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_plus_flag&amp;lt;/code&amp;gt;: 测试加号标志(&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_zero_flag&amp;lt;/code&amp;gt;: 测试零填充标志(&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_minus_flag&amp;lt;/code&amp;gt;: 测试左对齐标志(&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_sharp_flag&amp;lt;/code&amp;gt;: 测试井号标志(&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
&lt;br /&gt;
# 宽度和精度测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_width&amp;lt;/code&amp;gt;: 测试基本宽度指定&lt;br /&gt;
* &amp;lt;code&amp;gt;test_width_20&amp;lt;/code&amp;gt;: 测试20字符宽度的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_padding_20&amp;lt;/code&amp;gt;: 测试20字符填充&lt;br /&gt;
* &amp;lt;code&amp;gt;test_padding_dot_20&amp;lt;/code&amp;gt;: 测试带小数点的20字符填充&lt;br /&gt;
&lt;br /&gt;
# 数值类型测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_integer_types&amp;lt;/code&amp;gt;: 测试各种整数类型(int, long, long long等)&lt;br /&gt;
* &amp;lt;code&amp;gt;test_floating_point_specifiers_precision_and_flags&amp;lt;/code&amp;gt;: 测试浮点数的精度和标志&lt;br /&gt;
* &amp;lt;code&amp;gt;test_pointer&amp;lt;/code&amp;gt;: 测试指针类型的打印&lt;br /&gt;
&lt;br /&gt;
# 特殊情况测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_infinity_and_not_a_number_values&amp;lt;/code&amp;gt;: 测试无穷大和NaN值的打印&lt;br /&gt;
* &amp;lt;code&amp;gt;test_tiny_floating_point_values&amp;lt;/code&amp;gt;: 测试极小浮点数的打印&lt;br /&gt;
&lt;br /&gt;
# 字符串相关测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_string_length&amp;lt;/code&amp;gt;: 测试字符串长度限制打印&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
test 26 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
53000atest-20 bit&lt;br /&gt;
53000atest-20 bit&lt;br /&gt;
0.33&lt;br /&gt;
0.33&lt;br /&gt;
1&lt;br /&gt;
1&lt;br /&gt;
foo&lt;br /&gt;
foo&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     00004&lt;br /&gt;
     00004&lt;br /&gt;
hi x&lt;br /&gt;
hi x&lt;br /&gt;
00123               &lt;br /&gt;
00123               &lt;br /&gt;
-67224.546875000000000000&lt;br /&gt;
-67224.546875000000000000&lt;br /&gt;
0.33&lt;br /&gt;
0.33&lt;br /&gt;
3.33e-01&lt;br /&gt;
3.33e-01&lt;br /&gt;
0.000000e+00&lt;br /&gt;
0.000000e+00&lt;br /&gt;
-0.000000e+00&lt;br /&gt;
-0.000000e+00&lt;br /&gt;
test 26 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test 27 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
test 27 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test 28 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 -9223372036854775807&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
test 28 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo Shell： ==&lt;br /&gt;
该部分代码测试了在 裸机 和 带&#039;&#039;&#039;freertos&#039;&#039;&#039;操作系统两种情况下串口的终端功能测试。&lt;br /&gt;
&lt;br /&gt;
这部分代码存放在SDK的 bouffalo_sdk/examples/shell 路径下。&lt;br /&gt;
&lt;br /&gt;
=== Demo:shell_os ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;help&lt;br /&gt;
shell commands list:&lt;br /&gt;
test&lt;br /&gt;
free&lt;br /&gt;
memtrace&lt;br /&gt;
help&lt;br /&gt;
mfg&lt;br /&gt;
reboot&lt;br /&gt;
sysver&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Demo:shell_no_os ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;help&lt;br /&gt;
shell commands list:&lt;br /&gt;
test&lt;br /&gt;
free&lt;br /&gt;
memtrace&lt;br /&gt;
help&lt;br /&gt;
ps&lt;br /&gt;
mfg&lt;br /&gt;
reboot&lt;br /&gt;
sysver&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:pmu ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这部分Demo主要测试了开发板的两种休眠模式。Hibernation 休眠模式 和 Power down sleep 深度休眠模式，其中，HBN 是更深层次的休眠每次唤醒都从头执行，除了SRAM保持区其余都不储存。 适合长时间关机，实时性低。&lt;br /&gt;
&lt;br /&gt;
而 PDS 是中层次的休眠，唤醒从断线执行，而且保留寄存器，SRAM 和 部分外设的信息。 适合段是关机，比如每秒唤醒一次，实时性更高。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/pmu/xxxx/其中 xxxx 是开发板对应的型号。&lt;br /&gt;
&lt;br /&gt;
=== Demo:hbn_rtc: ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
qe write len     0x02&lt;br /&gt;
cread support    0x01&lt;br /&gt;
cread code       0x20&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
enter hbn mode&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Demo:pds_rtc: ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ead reg cmd1    0x35&lt;br /&gt;
write reg cmd0   0x01&lt;br /&gt;
write reg cmd1   0x01&lt;br /&gt;
qe write len     0x02&lt;br /&gt;
cread support    0x01&lt;br /&gt;
cread code       0x20&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
enter pds mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;这两个Demo 中有配有RTC,会不断的唤醒和睡眠。&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=143</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=143"/>
		<updated>2025-08-11T08:29:40Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​printf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）支持 A/B 双分区设计，实现无缝固件更新和回滚处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：该程序会根据分区表加载固件到内存支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;   多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：OTA 更新：将新固件从临时分区复制到主分区防回滚（Anti-Rollback）：防止降级到不安全版本支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：SHA-256 校验 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Demo：mbedtls ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这段代码对tls中的加密功能进行了全面的自检测，保证mbedtls库可以正常在平台上运行。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的  bouffalo_sdk/examples/mbedtls&lt;br /&gt;
&lt;br /&gt;
=== ECDH测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdh_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致&lt;br /&gt;
&lt;br /&gt;
=== ECDSA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdsa_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：生成 ECDSA 密钥对。使用私钥对哈希值进行签名，生成签名。使用公钥验证签名的正确性。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;涉及的算法&#039;&#039;&#039;：ECDSA数字签名；哈希算法：SHA-256。&lt;br /&gt;
&lt;br /&gt;
=== AES测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_aes_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。&lt;br /&gt;
&lt;br /&gt;
=== SHA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_sha_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算，输出哈希值&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
  SHA-1 test #1: passed&lt;br /&gt;
  SHA-1 test #2: passed&lt;br /&gt;
  SHA-1 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-224 test #1: passed&lt;br /&gt;
  SHA-224 test #2: passed&lt;br /&gt;
  SHA-224 test #3: passed&lt;br /&gt;
  SHA-256 test #1: passed&lt;br /&gt;
  SHA-256 test #2: passed&lt;br /&gt;
  SHA-256 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-384 test #1: passed&lt;br /&gt;
  SHA-384 test #2: passed&lt;br /&gt;
  SHA-384 test #3: passed&lt;br /&gt;
  SHA-512 test #1: passed&lt;br /&gt;
  SHA-512 test #2: passed&lt;br /&gt;
  SHA-512 test #3: passed&lt;br /&gt;
=========== ecdh test ================&lt;br /&gt;
setup rng ... ok&lt;br /&gt;
select ecp group SECP256R1 ... ok&lt;br /&gt;
Get public key time=33ms&lt;br /&gt;
1. ecdh client generate public parameter:&lt;br /&gt;
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED&lt;br /&gt;
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1&lt;br /&gt;
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22&lt;br /&gt;
     63 E3 AC 81 91&lt;br /&gt;
     &lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
aes ctr 192 block:1000 enc cost time:331 us&lt;br /&gt;
aes ctr 192 block:1000 dec cost time:329 us&lt;br /&gt;
test aes ctr 256 &lt;br /&gt;
aes ctr 256 block:1000 enc cost time:354 us&lt;br /&gt;
aes ctr 256 block:1000 dec cost time:354 us&lt;br /&gt;
&lt;br /&gt;
=========== sha test ================&lt;br /&gt;
sha1 block:1000 cost time:415 us&lt;br /&gt;
sha256 block:1000 cost time:268 us&lt;br /&gt;
sha512 block:1000 cost time:236 us&lt;br /&gt;
mbedtls test success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:memheap ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试申请和释放 内存memory 的功能是否正常。在当前代码下，程序会不断申请释放 无休止直到将内存消耗殆尽。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/memheap&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411520 byte&lt;br /&gt;
free memory :411520 byte&lt;br /&gt;
remain 25244 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411648 byte&lt;br /&gt;
free memory :411648 byte&lt;br /&gt;
remain 25116 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411776 byte&lt;br /&gt;
free memory :411776 byte&lt;br /&gt;
remain 24988 byte&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :433920 byte&lt;br /&gt;
free memory :433920 byte&lt;br /&gt;
remain 2844 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :434048 byte&lt;br /&gt;
free memory :434048 byte&lt;br /&gt;
tlsf malloc 434176 bytes failed at function bflb_malloc using heap base:0x62fc5554&lt;br /&gt;
remain 436900 byte&lt;br /&gt;
try to get 434176 byte memory failed!&lt;br /&gt;
memheap test fail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:partition ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试分区表获取和输出。所以这里主要要烧录whole bin,否则没有烧录分区表会导致失败。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
======= PtTable_Config @0x62fc3cc8=======&lt;br /&gt;
magicCode 0x54504642; version 0x0000; entryCnt 8; age 0; crc32 0xE38928F3&lt;br /&gt;
idx  type device active_index     name   Address[0]  Address[1]  Length[0]   Length[1]   age&lt;br /&gt;
[00]  16     0         0        Boot2  0x00000000  0x00000000  0x0000e000  0x00000000  0&lt;br /&gt;
[01]  00     0         0           FW  0x00010000  0x00210000  0x00200000  0x00168000  0&lt;br /&gt;
[02]  10     0         0          mfg  0x00210000  0x00000000  0x00168000  0x00000000  0&lt;br /&gt;
[03]  02     0         0        media  0x00378000  0x00000000  0x00071000  0x00000000  0&lt;br /&gt;
[04]  03     0         0          PSM  0x003e9000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
[05]  04     0         0          KEY  0x003f1000  0x00000000  0x00002000  0x00000000  0&lt;br /&gt;
[06]  05     0         0         DATA  0x003f3000  0x00000000  0x00005000  0x00000000  0&lt;br /&gt;
[07]  06     0         0      factory  0x003f8000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中： 索引的 0 和 1 分别代表不同的区，一个是活跃的当前正在使用的，另一个是备份的用于当升级失败回滚的。&lt;br /&gt;
&lt;br /&gt;
== Demo:efuse_trim ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该Demo主要用于验证efuse中储存的修剪数值是否正确，这些修剪值用于矫正一些模块。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下 ： bouffalo_sdk/examples/peripherals/efuse/efuse_trim&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;初始化和设备获取&#039;&#039;&#039;：&lt;br /&gt;
#* 调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。&lt;br /&gt;
#* 使用 &amp;lt;code&amp;gt;bflb_device_get_by_name(&amp;quot;ef_ctrl&amp;quot;)&amp;lt;/code&amp;gt; 获取 eFuse 控制设备的句柄。&lt;br /&gt;
# &#039;&#039;&#039;修剪值读取和验证&#039;&#039;&#039;：&lt;br /&gt;
#* 定义了一个数组 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，然后遍历 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，调用 &amp;lt;code&amp;gt;bflb_ef_ctrl_read_common_trim&amp;lt;/code&amp;gt; 读取每个修剪值。&lt;br /&gt;
#* 如果修剪值有效，则进一步验证其奇偶校验。如果校验通过，打印修剪值；否则提示校验错误。&lt;br /&gt;
#* 如果修剪值无效，提示未找到。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
eFuse read trim value case!&lt;br /&gt;
trim rc32m value=108!&lt;br /&gt;
trim rc32k value=273!&lt;br /&gt;
trim tsen value=2149!&lt;br /&gt;
case finished!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:i2s_es8311 ==&lt;br /&gt;
该Demo的主要用途是实现音频数据采集和播放。主要功能是初始化并配置 I2S 接口和 ES8311 音频编解码器，以实现音频数据的传输和处理。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/peripherals/i2s/i2s_es8311&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;硬件初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。初始化 GPIO 引脚&amp;lt;code&amp;gt;i2s_gpio_init()&amp;lt;/code&amp;gt;，为 I2S 和 I2C 接口分配功能引脚。&lt;br /&gt;
# &#039;&#039;&#039;主时钟输出&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;mclk_out_init()&amp;lt;/code&amp;gt; 配置 I2S 的主时钟输出，为外部音频设备ES8311提供时钟信号。&lt;br /&gt;
# &#039;&#039;&#039;ES8311 音频编解码器初始化&#039;&#039;&#039;：配置 ES8311 的工作模式。调用 &amp;lt;code&amp;gt;es8311_init()&amp;lt;/code&amp;gt; 初始化 ES8311，并设置音量。启动 ES8311 的 ADC 和 DAC 模块。&lt;br /&gt;
# &#039;&#039;&#039;I2S 和 DMA 初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;i2s_dma_init()&amp;lt;/code&amp;gt; 初始化 I2S 接口和 DMA 通道。配置 DMA 通道，启动 DMA 通道，开始音频数据的传输和接收。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
es8311 init&lt;br /&gt;
read chip id failed!&lt;br /&gt;
SET: volume:70%&lt;br /&gt;
i2s init&lt;br /&gt;
dma init&lt;br /&gt;
dma lli init&lt;br /&gt;
tx dma lli num: 2 &lt;br /&gt;
rx dma lli num: 2 &lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:printf ==&lt;br /&gt;
该demo主要测试基本printf功能是否完整，正常。&lt;br /&gt;
&lt;br /&gt;
保存在SDK 下：bouffalo_sdk/examples/printf&lt;br /&gt;
&lt;br /&gt;
=== 测试的主要功能包括： ===&lt;br /&gt;
&lt;br /&gt;
# 格式化标志(Flags)测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_space_flag&amp;lt;/code&amp;gt;: 测试空格标志( )的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_plus_flag&amp;lt;/code&amp;gt;: 测试加号标志(&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_zero_flag&amp;lt;/code&amp;gt;: 测试零填充标志(&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_minus_flag&amp;lt;/code&amp;gt;: 测试左对齐标志(&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_sharp_flag&amp;lt;/code&amp;gt;: 测试井号标志(&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;)的格式化&lt;br /&gt;
&lt;br /&gt;
# 宽度和精度测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_width&amp;lt;/code&amp;gt;: 测试基本宽度指定&lt;br /&gt;
* &amp;lt;code&amp;gt;test_width_20&amp;lt;/code&amp;gt;: 测试20字符宽度的格式化&lt;br /&gt;
* &amp;lt;code&amp;gt;test_padding_20&amp;lt;/code&amp;gt;: 测试20字符填充&lt;br /&gt;
* &amp;lt;code&amp;gt;test_padding_dot_20&amp;lt;/code&amp;gt;: 测试带小数点的20字符填充&lt;br /&gt;
&lt;br /&gt;
# 数值类型测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_integer_types&amp;lt;/code&amp;gt;: 测试各种整数类型(int, long, long long等)&lt;br /&gt;
* &amp;lt;code&amp;gt;test_floating_point_specifiers_precision_and_flags&amp;lt;/code&amp;gt;: 测试浮点数的精度和标志&lt;br /&gt;
* &amp;lt;code&amp;gt;test_pointer&amp;lt;/code&amp;gt;: 测试指针类型的打印&lt;br /&gt;
&lt;br /&gt;
# 特殊情况测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_infinity_and_not_a_number_values&amp;lt;/code&amp;gt;: 测试无穷大和NaN值的打印&lt;br /&gt;
* &amp;lt;code&amp;gt;test_tiny_floating_point_values&amp;lt;/code&amp;gt;: 测试极小浮点数的打印&lt;br /&gt;
&lt;br /&gt;
# 字符串相关测试：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;test_string_length&amp;lt;/code&amp;gt;: 测试字符串长度限制打印&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
test 26 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
53000atest-20 bit&lt;br /&gt;
53000atest-20 bit&lt;br /&gt;
0.33&lt;br /&gt;
0.33&lt;br /&gt;
1&lt;br /&gt;
1&lt;br /&gt;
foo&lt;br /&gt;
foo&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     00004&lt;br /&gt;
     00004&lt;br /&gt;
hi x&lt;br /&gt;
hi x&lt;br /&gt;
00123               &lt;br /&gt;
00123               &lt;br /&gt;
-67224.546875000000000000&lt;br /&gt;
-67224.546875000000000000&lt;br /&gt;
0.33&lt;br /&gt;
0.33&lt;br /&gt;
3.33e-01&lt;br /&gt;
3.33e-01&lt;br /&gt;
0.000000e+00&lt;br /&gt;
0.000000e+00&lt;br /&gt;
-0.000000e+00&lt;br /&gt;
-0.000000e+00&lt;br /&gt;
test 26 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test 27 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
test 27 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test 28 begin &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
30 30 30 30&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
-9223372036854775807 -9223372036854775807 -9223372036854775807 -9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807&lt;br /&gt;
9223372036854775807 9223372036854775807 9223372036854775807 -9223372036854775807&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
281474976710656 281474976710656 281474976710656 281474976710656&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
1234567891234567 1234567891234567 1234567891234567 1234567891234567&lt;br /&gt;
test 28 end &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=142</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=142"/>
		<updated>2025-08-11T08:03:33Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）支持 A/B 双分区设计，实现无缝固件更新和回滚处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：该程序会根据分区表加载固件到内存支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;   多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：OTA 更新：将新固件从临时分区复制到主分区防回滚（Anti-Rollback）：防止降级到不安全版本支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：SHA-256 校验 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Demo：mbedtls ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这段代码对tls中的加密功能进行了全面的自检测，保证mbedtls库可以正常在平台上运行。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的  bouffalo_sdk/examples/mbedtls&lt;br /&gt;
&lt;br /&gt;
=== ECDH测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdh_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致&lt;br /&gt;
&lt;br /&gt;
=== ECDSA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdsa_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：生成 ECDSA 密钥对。使用私钥对哈希值进行签名，生成签名。使用公钥验证签名的正确性。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;涉及的算法&#039;&#039;&#039;：ECDSA数字签名；哈希算法：SHA-256。&lt;br /&gt;
&lt;br /&gt;
=== AES测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_aes_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。&lt;br /&gt;
&lt;br /&gt;
=== SHA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_sha_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算，输出哈希值&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
  SHA-1 test #1: passed&lt;br /&gt;
  SHA-1 test #2: passed&lt;br /&gt;
  SHA-1 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-224 test #1: passed&lt;br /&gt;
  SHA-224 test #2: passed&lt;br /&gt;
  SHA-224 test #3: passed&lt;br /&gt;
  SHA-256 test #1: passed&lt;br /&gt;
  SHA-256 test #2: passed&lt;br /&gt;
  SHA-256 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-384 test #1: passed&lt;br /&gt;
  SHA-384 test #2: passed&lt;br /&gt;
  SHA-384 test #3: passed&lt;br /&gt;
  SHA-512 test #1: passed&lt;br /&gt;
  SHA-512 test #2: passed&lt;br /&gt;
  SHA-512 test #3: passed&lt;br /&gt;
=========== ecdh test ================&lt;br /&gt;
setup rng ... ok&lt;br /&gt;
select ecp group SECP256R1 ... ok&lt;br /&gt;
Get public key time=33ms&lt;br /&gt;
1. ecdh client generate public parameter:&lt;br /&gt;
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED&lt;br /&gt;
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1&lt;br /&gt;
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22&lt;br /&gt;
     63 E3 AC 81 91&lt;br /&gt;
     &lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
aes ctr 192 block:1000 enc cost time:331 us&lt;br /&gt;
aes ctr 192 block:1000 dec cost time:329 us&lt;br /&gt;
test aes ctr 256 &lt;br /&gt;
aes ctr 256 block:1000 enc cost time:354 us&lt;br /&gt;
aes ctr 256 block:1000 dec cost time:354 us&lt;br /&gt;
&lt;br /&gt;
=========== sha test ================&lt;br /&gt;
sha1 block:1000 cost time:415 us&lt;br /&gt;
sha256 block:1000 cost time:268 us&lt;br /&gt;
sha512 block:1000 cost time:236 us&lt;br /&gt;
mbedtls test success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:memheap ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试申请和释放 内存memory 的功能是否正常。在当前代码下，程序会不断申请释放 无休止直到将内存消耗殆尽。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/memheap&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411520 byte&lt;br /&gt;
free memory :411520 byte&lt;br /&gt;
remain 25244 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411648 byte&lt;br /&gt;
free memory :411648 byte&lt;br /&gt;
remain 25116 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411776 byte&lt;br /&gt;
free memory :411776 byte&lt;br /&gt;
remain 24988 byte&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :433920 byte&lt;br /&gt;
free memory :433920 byte&lt;br /&gt;
remain 2844 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :434048 byte&lt;br /&gt;
free memory :434048 byte&lt;br /&gt;
tlsf malloc 434176 bytes failed at function bflb_malloc using heap base:0x62fc5554&lt;br /&gt;
remain 436900 byte&lt;br /&gt;
try to get 434176 byte memory failed!&lt;br /&gt;
memheap test fail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:partition ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试分区表获取和输出。所以这里主要要烧录whole bin,否则没有烧录分区表会导致失败。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
======= PtTable_Config @0x62fc3cc8=======&lt;br /&gt;
magicCode 0x54504642; version 0x0000; entryCnt 8; age 0; crc32 0xE38928F3&lt;br /&gt;
idx  type device active_index     name   Address[0]  Address[1]  Length[0]   Length[1]   age&lt;br /&gt;
[00]  16     0         0        Boot2  0x00000000  0x00000000  0x0000e000  0x00000000  0&lt;br /&gt;
[01]  00     0         0           FW  0x00010000  0x00210000  0x00200000  0x00168000  0&lt;br /&gt;
[02]  10     0         0          mfg  0x00210000  0x00000000  0x00168000  0x00000000  0&lt;br /&gt;
[03]  02     0         0        media  0x00378000  0x00000000  0x00071000  0x00000000  0&lt;br /&gt;
[04]  03     0         0          PSM  0x003e9000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
[05]  04     0         0          KEY  0x003f1000  0x00000000  0x00002000  0x00000000  0&lt;br /&gt;
[06]  05     0         0         DATA  0x003f3000  0x00000000  0x00005000  0x00000000  0&lt;br /&gt;
[07]  06     0         0      factory  0x003f8000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中： 索引的 0 和 1 分别代表不同的区，一个是活跃的当前正在使用的，另一个是备份的用于当升级失败回滚的。&lt;br /&gt;
&lt;br /&gt;
== Demo:efuse_trim ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该Demo主要用于验证efuse中储存的修剪数值是否正确，这些修剪值用于矫正一些模块。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下 ： bouffalo_sdk/examples/peripherals/efuse/efuse_trim&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;初始化和设备获取&#039;&#039;&#039;：&lt;br /&gt;
#* 调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。&lt;br /&gt;
#* 使用 &amp;lt;code&amp;gt;bflb_device_get_by_name(&amp;quot;ef_ctrl&amp;quot;)&amp;lt;/code&amp;gt; 获取 eFuse 控制设备的句柄。&lt;br /&gt;
# &#039;&#039;&#039;修剪值读取和验证&#039;&#039;&#039;：&lt;br /&gt;
#* 定义了一个数组 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，然后遍历 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，调用 &amp;lt;code&amp;gt;bflb_ef_ctrl_read_common_trim&amp;lt;/code&amp;gt; 读取每个修剪值。&lt;br /&gt;
#* 如果修剪值有效，则进一步验证其奇偶校验。如果校验通过，打印修剪值；否则提示校验错误。&lt;br /&gt;
#* 如果修剪值无效，提示未找到。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
eFuse read trim value case!&lt;br /&gt;
trim rc32m value=108!&lt;br /&gt;
trim rc32k value=273!&lt;br /&gt;
trim tsen value=2149!&lt;br /&gt;
case finished!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:i2s_es8311 ==&lt;br /&gt;
该Demo的主要用途是实现音频数据采集和播放。主要功能是初始化并配置 I2S 接口和 ES8311 音频编解码器，以实现音频数据的传输和处理。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下：bouffalo_sdk/examples/peripherals/i2s/i2s_es8311&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;硬件初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。初始化 GPIO 引脚&amp;lt;code&amp;gt;i2s_gpio_init()&amp;lt;/code&amp;gt;，为 I2S 和 I2C 接口分配功能引脚。&lt;br /&gt;
# &#039;&#039;&#039;主时钟输出&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;mclk_out_init()&amp;lt;/code&amp;gt; 配置 I2S 的主时钟输出，为外部音频设备ES8311提供时钟信号。&lt;br /&gt;
# &#039;&#039;&#039;ES8311 音频编解码器初始化&#039;&#039;&#039;：配置 ES8311 的工作模式。调用 &amp;lt;code&amp;gt;es8311_init()&amp;lt;/code&amp;gt; 初始化 ES8311，并设置音量。启动 ES8311 的 ADC 和 DAC 模块。&lt;br /&gt;
# &#039;&#039;&#039;I2S 和 DMA 初始化&#039;&#039;&#039;：调用 &amp;lt;code&amp;gt;i2s_dma_init()&amp;lt;/code&amp;gt; 初始化 I2S 接口和 DMA 通道。配置 DMA 通道，启动 DMA 通道，开始音频数据的传输和接收。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
es8311 init&lt;br /&gt;
read chip id failed!&lt;br /&gt;
SET: volume:70%&lt;br /&gt;
i2s init&lt;br /&gt;
dma init&lt;br /&gt;
dma lli init&lt;br /&gt;
tx dma lli num: 2 &lt;br /&gt;
rx dma lli num: 2 &lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
tc done&lt;br /&gt;
rx done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=141</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=141"/>
		<updated>2025-08-11T05:48:00Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​efuse&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）支持 A/B 双分区设计，实现无缝固件更新和回滚处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：该程序会根据分区表加载固件到内存支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;   多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：OTA 更新：将新固件从临时分区复制到主分区防回滚（Anti-Rollback）：防止降级到不安全版本支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：SHA-256 校验 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Demo：mbedtls ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这段代码对tls中的加密功能进行了全面的自检测，保证mbedtls库可以正常在平台上运行。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的  bouffalo_sdk/examples/mbedtls&lt;br /&gt;
&lt;br /&gt;
=== ECDH测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdh_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致&lt;br /&gt;
&lt;br /&gt;
=== ECDSA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdsa_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：生成 ECDSA 密钥对。使用私钥对哈希值进行签名，生成签名。使用公钥验证签名的正确性。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;涉及的算法&#039;&#039;&#039;：ECDSA数字签名；哈希算法：SHA-256。&lt;br /&gt;
&lt;br /&gt;
=== AES测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_aes_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。&lt;br /&gt;
&lt;br /&gt;
=== SHA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_sha_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算，输出哈希值&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
  SHA-1 test #1: passed&lt;br /&gt;
  SHA-1 test #2: passed&lt;br /&gt;
  SHA-1 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-224 test #1: passed&lt;br /&gt;
  SHA-224 test #2: passed&lt;br /&gt;
  SHA-224 test #3: passed&lt;br /&gt;
  SHA-256 test #1: passed&lt;br /&gt;
  SHA-256 test #2: passed&lt;br /&gt;
  SHA-256 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-384 test #1: passed&lt;br /&gt;
  SHA-384 test #2: passed&lt;br /&gt;
  SHA-384 test #3: passed&lt;br /&gt;
  SHA-512 test #1: passed&lt;br /&gt;
  SHA-512 test #2: passed&lt;br /&gt;
  SHA-512 test #3: passed&lt;br /&gt;
=========== ecdh test ================&lt;br /&gt;
setup rng ... ok&lt;br /&gt;
select ecp group SECP256R1 ... ok&lt;br /&gt;
Get public key time=33ms&lt;br /&gt;
1. ecdh client generate public parameter:&lt;br /&gt;
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED&lt;br /&gt;
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1&lt;br /&gt;
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22&lt;br /&gt;
     63 E3 AC 81 91&lt;br /&gt;
     &lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
aes ctr 192 block:1000 enc cost time:331 us&lt;br /&gt;
aes ctr 192 block:1000 dec cost time:329 us&lt;br /&gt;
test aes ctr 256 &lt;br /&gt;
aes ctr 256 block:1000 enc cost time:354 us&lt;br /&gt;
aes ctr 256 block:1000 dec cost time:354 us&lt;br /&gt;
&lt;br /&gt;
=========== sha test ================&lt;br /&gt;
sha1 block:1000 cost time:415 us&lt;br /&gt;
sha256 block:1000 cost time:268 us&lt;br /&gt;
sha512 block:1000 cost time:236 us&lt;br /&gt;
mbedtls test success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:memheap ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试申请和释放 内存memory 的功能是否正常。在当前代码下，程序会不断申请释放 无休止直到将内存消耗殆尽。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/memheap&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411520 byte&lt;br /&gt;
free memory :411520 byte&lt;br /&gt;
remain 25244 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411648 byte&lt;br /&gt;
free memory :411648 byte&lt;br /&gt;
remain 25116 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411776 byte&lt;br /&gt;
free memory :411776 byte&lt;br /&gt;
remain 24988 byte&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :433920 byte&lt;br /&gt;
free memory :433920 byte&lt;br /&gt;
remain 2844 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :434048 byte&lt;br /&gt;
free memory :434048 byte&lt;br /&gt;
tlsf malloc 434176 bytes failed at function bflb_malloc using heap base:0x62fc5554&lt;br /&gt;
remain 436900 byte&lt;br /&gt;
try to get 434176 byte memory failed!&lt;br /&gt;
memheap test fail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:partition ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试分区表获取和输出。所以这里主要要烧录whole bin,否则没有烧录分区表会导致失败。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
======= PtTable_Config @0x62fc3cc8=======&lt;br /&gt;
magicCode 0x54504642; version 0x0000; entryCnt 8; age 0; crc32 0xE38928F3&lt;br /&gt;
idx  type device active_index     name   Address[0]  Address[1]  Length[0]   Length[1]   age&lt;br /&gt;
[00]  16     0         0        Boot2  0x00000000  0x00000000  0x0000e000  0x00000000  0&lt;br /&gt;
[01]  00     0         0           FW  0x00010000  0x00210000  0x00200000  0x00168000  0&lt;br /&gt;
[02]  10     0         0          mfg  0x00210000  0x00000000  0x00168000  0x00000000  0&lt;br /&gt;
[03]  02     0         0        media  0x00378000  0x00000000  0x00071000  0x00000000  0&lt;br /&gt;
[04]  03     0         0          PSM  0x003e9000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
[05]  04     0         0          KEY  0x003f1000  0x00000000  0x00002000  0x00000000  0&lt;br /&gt;
[06]  05     0         0         DATA  0x003f3000  0x00000000  0x00005000  0x00000000  0&lt;br /&gt;
[07]  06     0         0      factory  0x003f8000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中： 索引的 0 和 1 分别代表不同的区，一个是活跃的当前正在使用的，另一个是备份的用于当升级失败回滚的。&lt;br /&gt;
&lt;br /&gt;
== Demo:efuse_trim ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该Demo主要用于验证efuse中储存的修剪数值是否正确，这些修剪值用于矫正一些模块。&lt;br /&gt;
&lt;br /&gt;
保存在SDK下 ： bouffalo_sdk/examples/peripherals/efuse/efuse_trim&lt;br /&gt;
&lt;br /&gt;
=== 代码解读： ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;初始化和设备获取&#039;&#039;&#039;：&lt;br /&gt;
#* 调用 &amp;lt;code&amp;gt;board_init()&amp;lt;/code&amp;gt; 初始化硬件板级配置。&lt;br /&gt;
#* 使用 &amp;lt;code&amp;gt;bflb_device_get_by_name(&amp;quot;ef_ctrl&amp;quot;)&amp;lt;/code&amp;gt; 获取 eFuse 控制设备的句柄。&lt;br /&gt;
# &#039;&#039;&#039;修剪值读取和验证&#039;&#039;&#039;：&lt;br /&gt;
#* 定义了一个数组 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，然后遍历 &amp;lt;code&amp;gt;trim_list&amp;lt;/code&amp;gt;，调用 &amp;lt;code&amp;gt;bflb_ef_ctrl_read_common_trim&amp;lt;/code&amp;gt; 读取每个修剪值。&lt;br /&gt;
#* 如果修剪值有效，则进一步验证其奇偶校验。如果校验通过，打印修剪值；否则提示校验错误。&lt;br /&gt;
#* 如果修剪值无效，提示未找到。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
eFuse read trim value case!&lt;br /&gt;
trim rc32m value=108!&lt;br /&gt;
trim rc32k value=273!&lt;br /&gt;
trim tsen value=2149!&lt;br /&gt;
case finished!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=140</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=140"/>
		<updated>2025-08-07T07:25:06Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​/* Demos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Started =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/bouffalolab/bouffalo_sdk 如何获取SDK]&lt;br /&gt;
* [[如何在Ubuntu上搭建编译环境]]&lt;br /&gt;
* [[如何在Windows上搭建编译环境]]&lt;br /&gt;
* [[如何获取开发板]]&lt;br /&gt;
* [[烧录固件到开发板]]&lt;br /&gt;
&lt;br /&gt;
= Bouffalo SDK =&lt;br /&gt;
&#039;&#039;&#039;BouffaloSDK&#039;&#039;&#039; 是 Bouffalo Lab 提供的 IOT 和 MCU 软件开发包，支持博流智能所有系列芯片，也是 &#039;&#039;&#039;bl_mcu_sdk&#039;&#039;&#039; 和 &#039;&#039;&#039;bl_iot_sdk&#039;&#039;&#039; 的结合体。&lt;br /&gt;
&lt;br /&gt;
[[文件:BouffaloSDK.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
= Peripherals =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[I2S]]&lt;br /&gt;
*[[I2C]]&lt;br /&gt;
*[[CVBS]]&lt;br /&gt;
*[[Watchdog]]&lt;br /&gt;
*[[GSM/GPRS]]&lt;br /&gt;
*[[Codec]]&lt;br /&gt;
*[[PCIe]]&lt;br /&gt;
*[[GPIO]]&lt;br /&gt;
*[[eMMC]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[WiFi]]&lt;br /&gt;
*[[LED]]&lt;br /&gt;
*[[Serial port]]&lt;br /&gt;
*[[PWM]]&lt;br /&gt;
*[[SPI]]&lt;br /&gt;
*[[USB OTG]]&lt;br /&gt;
*[[LCD]]&lt;br /&gt;
*[[CPU]]&lt;br /&gt;
*[[Network]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Bluetooth]]&lt;br /&gt;
*[[HDMI]]&lt;br /&gt;
*[[Camera]]&lt;br /&gt;
*[[Memory]]&lt;br /&gt;
*[[RTC]]&lt;br /&gt;
*[[EEPROM]]&lt;br /&gt;
*[[MIPI-DSI]]&lt;br /&gt;
*[[NPU]]&lt;br /&gt;
*[[VPU]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Products =&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL602]]&lt;br /&gt;
* [[BL702]]&lt;br /&gt;
* [[BL618]]&lt;br /&gt;
* [[BL606P]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL702L]]&lt;br /&gt;
* [[BL616]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Develop Boards =&lt;br /&gt;
* BL602EVB&lt;br /&gt;
&lt;br /&gt;
= Application Notes =&lt;br /&gt;
* [[SDIOWIFI架构和开发手册]]&lt;br /&gt;
* [[BL616低功耗开发手册]]&lt;br /&gt;
* [[USB Wi-Fi用户手册]]&lt;br /&gt;
&lt;br /&gt;
= Demos =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:FreeRTOS]]&lt;br /&gt;
* [[Demo:wifi sta]]&lt;br /&gt;
* [[Demo:boot2_isp]]&lt;br /&gt;
* [[Demo:helloworld]]&lt;br /&gt;
* [[Demo:smartconfig ble]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:DMA]]&lt;br /&gt;
* [[Demo:Btble]]&lt;br /&gt;
* [[Demo:coremark]]&lt;br /&gt;
* [[Demo:littlefs]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:Flash]]&lt;br /&gt;
* [[Demo:Basical case]]&lt;br /&gt;
* [[Demo:dsp]]&lt;br /&gt;
* [[Demo:cks]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:smartconfig_ble&amp;diff=139</id>
		<title>Demo:smartconfig ble</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:smartconfig_ble&amp;diff=139"/>
		<updated>2025-08-07T07:24:22Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demo介绍： ==&lt;br /&gt;
该Demo使用BLE 蓝牙通讯 技术实现从手机端操控目标设备进行WIFI配网。&lt;br /&gt;
&lt;br /&gt;
该Demo 保存在SDK下的：bouffalo_sdk/examples/wifi/sta/smartconfig_ble 路经下。&lt;br /&gt;
&lt;br /&gt;
其中，手机 APK 放在该目录下的blsync 目录中。&lt;br /&gt;
&lt;br /&gt;
== 主要功能分析 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. BLE 配网与同步 ===&lt;br /&gt;
&lt;br /&gt;
* 通过 BLE 广播和连接，实现手机等设备与目标设备的配对和通信。&lt;br /&gt;
* BLE 端通过 &amp;lt;code&amp;gt;blsync_ble_app.c&amp;lt;/code&amp;gt; 管理 BLE 广播、连接、数据同步、Wi-Fi 配网等流程。&lt;br /&gt;
* 支持 BLE 端发起 Wi-Fi 扫描、连接、断开、状态查询等操作，并通过 BLE 通道将结果回传给上位机或手机。&lt;br /&gt;
&lt;br /&gt;
=== 2. Wi-Fi 智能配网 ===&lt;br /&gt;
&lt;br /&gt;
* 通过 BLE 通道下发 Wi-Fi SSID、密码等信息，设备自动连接到指定的 Wi-Fi 路由器。&lt;br /&gt;
* 支持 Wi-Fi 扫描，获取周围可用的 Wi-Fi 列表，并通过 BLE 返回给手机端。&lt;br /&gt;
* 支持 Wi-Fi 连接状态、IP 地址、网关、掩码等信息的查询和回传。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
另外：&amp;lt;code&amp;gt;payload.c&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;transfer.c&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;encrypt_layer.c&amp;lt;/code&amp;gt; 等文件实现了 BLE 配网协议的数据封装、分包、加密、解密、校验、ACK 等机制，保证 BLE 通信过程中的数据完整性和安全性。&lt;br /&gt;
&lt;br /&gt;
=== 当配网正确时的输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] Starting wifi ...                                                                                                                                                                   &lt;br /&gt;
[I][MAIN] Starting fhost ...                                                                                                                                                                  &lt;br /&gt;
Read slot:0                                                                                                                                                                                   &lt;br /&gt;
get sta mac: b4:0e:cf:2e:90:fb                                                                                                                                                                &lt;br /&gt;
Read slot:0                                                                                                                                                                                   &lt;br /&gt;
get ap mac: b4:0e:cf:2e:90:fb                                                                                                                                                                 &lt;br /&gt;
fhost_cntrl_start:3489                                                                                                                                                                        &lt;br /&gt;
fhost_cntrl_start:3492                                                                                                                                                                        &lt;br /&gt;
[I][MAIN] [APP] [EVT] wifi_event_handler, CODE_WIFI_ON_INIT_DONE                                                                                                                              &lt;br /&gt;
wifi_mgmr_set_country_code:code = CN, channel24G_num:13, channel5G_num:0                                                                                                                      &lt;br /&gt;
[I][MAIN] [APP] [EVT] wifi_event_handler, CODE_WIFI_ON_MGMR_DONE                                                                                                                              &lt;br /&gt;
SIGTERM is NOT supported yet!                                                                                                                                                                 &lt;br /&gt;
SIGHUP is NOT supported yet!                                                                                                                                                                  &lt;br /&gt;
blsync_connected                                                                                                                                                                              &lt;br /&gt;
Exchange mtu size pending.                                                                                                                                                                    &lt;br /&gt;
Exchange successful                         //代表蓝牙连接成功                                                                                                                                                          &lt;br /&gt;
event type 0, id 9                                                                                                                                                                            &lt;br /&gt;
Recevied indication to wifi scan          &lt;br /&gt;
&lt;br /&gt;
...........&lt;br /&gt;
&lt;br /&gt;
=================================================================                                                                                                                             &lt;br /&gt;
[I][MAIN] [APP] [EVT] wifi_event_handler, CODE_WIFI_ON_CONNECTED                                                                                                                              &lt;br /&gt;
==========================  Keyram Config ========================                                                                                                                            &lt;br /&gt;
  start 08 --&amp;gt;&amp;gt; end 11; nVAP 02; max 31                                                                                                                                                       &lt;br /&gt;
==========================  Keyram Dump =========================                                                                                                                             &lt;br /&gt;
[id]   MAC Address     Key Len  VLan ID  Default        Key Hexdump(16Bytes MAX)                                                                                                              &lt;br /&gt;
[00] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[01] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[02] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[03] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[04] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[05] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[06] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[07] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[08] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000&lt;br /&gt;
[09] 58:41:20:A8:4F:FC  64-Bit    01        1     00000000 00000000 00000000 00000000&lt;br /&gt;
[10] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000&lt;br /&gt;
[11] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000&lt;br /&gt;
==========================  MAC Address =========================&lt;br /&gt;
    MAC B4:0E:CF:2E:90:FB Mask 00:00:00:00:00:00&lt;br /&gt;
  BSSID 58:41:20:A8:4F:FC Mask 00:00:00:00:00:00&lt;br /&gt;
start dhcping ...                              &lt;br /&gt;
wpa_supplicant_ctrl_iface_msg_cb: cmd send succeded, txt is State### ASSOCIATED -&amp;gt; COMPLETED&lt;br /&gt;
[WPA] CTRL-EVENT-SUBNET-STATUS-UPDATE status=0&lt;br /&gt;
event type 0, id 13                            &lt;br /&gt;
Recevied indication to wifi state get&lt;br /&gt;
Connected                    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APK操作： ==&lt;br /&gt;
注意保证你的WIFI是打开的，点击对应设备 &#039;&#039;&#039;blsync&#039;&#039;&#039; 进行连接。&lt;br /&gt;
&lt;br /&gt;
[[文件:Ble apk 2.jpg|670x670像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;进入后连接成功的界面：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[文件:Ble apk 1.jpg|670x670像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;点击扫描配网后：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[文件:Ble 3.jpg|670x670像素]]&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:smartconfig_ble&amp;diff=138</id>
		<title>Demo:smartconfig ble</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:smartconfig_ble&amp;diff=138"/>
		<updated>2025-08-07T07:22:02Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demo介绍： ==&lt;br /&gt;
该Demo使用BLE 蓝牙通讯 技术实现从手机端操控目标设备进行WIFI配网。&lt;br /&gt;
&lt;br /&gt;
该Demo 保存在SDK下的：bouffalo_sdk/examples/wifi/sta/smartconfig_ble 路经下。&lt;br /&gt;
&lt;br /&gt;
其中，手机 APK 放在该目录下的blsync 目录中。&lt;br /&gt;
&lt;br /&gt;
== 主要功能分析 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. BLE 配网与同步 ===&lt;br /&gt;
&lt;br /&gt;
* 通过 BLE 广播和连接，实现手机等设备与目标设备的配对和通信。&lt;br /&gt;
* BLE 端通过 &amp;lt;code&amp;gt;blsync_ble_app.c&amp;lt;/code&amp;gt; 管理 BLE 广播、连接、数据同步、Wi-Fi 配网等流程。&lt;br /&gt;
* 支持 BLE 端发起 Wi-Fi 扫描、连接、断开、状态查询等操作，并通过 BLE 通道将结果回传给上位机或手机。&lt;br /&gt;
&lt;br /&gt;
=== 2. Wi-Fi 智能配网 ===&lt;br /&gt;
&lt;br /&gt;
* 通过 BLE 通道下发 Wi-Fi SSID、密码等信息，设备自动连接到指定的 Wi-Fi 路由器。&lt;br /&gt;
* 支持 Wi-Fi 扫描，获取周围可用的 Wi-Fi 列表，并通过 BLE 返回给手机端。&lt;br /&gt;
* 支持 Wi-Fi 连接状态、IP 地址、网关、掩码等信息的查询和回传。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
另外：&amp;lt;code&amp;gt;payload.c&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;transfer.c&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;encrypt_layer.c&amp;lt;/code&amp;gt; 等文件实现了 BLE 配网协议的数据封装、分包、加密、解密、校验、ACK 等机制，保证 BLE 通信过程中的数据完整性和安全性。&lt;br /&gt;
&lt;br /&gt;
=== 当配网正确时的输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] Starting wifi ...                                                                                                                                                                   &lt;br /&gt;
[I][MAIN] Starting fhost ...                                                                                                                                                                  &lt;br /&gt;
Read slot:0                                                                                                                                                                                   &lt;br /&gt;
get sta mac: b4:0e:cf:2e:90:fb                                                                                                                                                                &lt;br /&gt;
Read slot:0                                                                                                                                                                                   &lt;br /&gt;
get ap mac: b4:0e:cf:2e:90:fb                                                                                                                                                                 &lt;br /&gt;
fhost_cntrl_start:3489                                                                                                                                                                        &lt;br /&gt;
fhost_cntrl_start:3492                                                                                                                                                                        &lt;br /&gt;
[I][MAIN] [APP] [EVT] wifi_event_handler, CODE_WIFI_ON_INIT_DONE                                                                                                                              &lt;br /&gt;
wifi_mgmr_set_country_code:code = CN, channel24G_num:13, channel5G_num:0                                                                                                                      &lt;br /&gt;
[I][MAIN] [APP] [EVT] wifi_event_handler, CODE_WIFI_ON_MGMR_DONE                                                                                                                              &lt;br /&gt;
SIGTERM is NOT supported yet!                                                                                                                                                                 &lt;br /&gt;
SIGHUP is NOT supported yet!                                                                                                                                                                  &lt;br /&gt;
blsync_connected                                                                                                                                                                              &lt;br /&gt;
Exchange mtu size pending.                                                                                                                                                                    &lt;br /&gt;
Exchange successful                         //代表蓝牙连接成功                                                                                                                                                          &lt;br /&gt;
event type 0, id 9                                                                                                                                                                            &lt;br /&gt;
Recevied indication to wifi scan          &lt;br /&gt;
&lt;br /&gt;
...........&lt;br /&gt;
&lt;br /&gt;
=================================================================                                                                                                                             &lt;br /&gt;
[I][MAIN] [APP] [EVT] wifi_event_handler, CODE_WIFI_ON_CONNECTED                                                                                                                              &lt;br /&gt;
==========================  Keyram Config ========================                                                                                                                            &lt;br /&gt;
  start 08 --&amp;gt;&amp;gt; end 11; nVAP 02; max 31                                                                                                                                                       &lt;br /&gt;
==========================  Keyram Dump =========================                                                                                                                             &lt;br /&gt;
[id]   MAC Address     Key Len  VLan ID  Default        Key Hexdump(16Bytes MAX)                                                                                                              &lt;br /&gt;
[00] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[01] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[02] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[03] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[04] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[05] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[06] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[07] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[08] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000&lt;br /&gt;
[09] 58:41:20:A8:4F:FC  64-Bit    01        1     00000000 00000000 00000000 00000000&lt;br /&gt;
[10] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000&lt;br /&gt;
[11] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000&lt;br /&gt;
==========================  MAC Address =========================&lt;br /&gt;
    MAC B4:0E:CF:2E:90:FB Mask 00:00:00:00:00:00&lt;br /&gt;
  BSSID 58:41:20:A8:4F:FC Mask 00:00:00:00:00:00&lt;br /&gt;
start dhcping ...                              &lt;br /&gt;
wpa_supplicant_ctrl_iface_msg_cb: cmd send succeded, txt is State### ASSOCIATED -&amp;gt; COMPLETED&lt;br /&gt;
[WPA] CTRL-EVENT-SUBNET-STATUS-UPDATE status=0&lt;br /&gt;
event type 0, id 13                            &lt;br /&gt;
Recevied indication to wifi state get&lt;br /&gt;
Connected                    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APK操作： ==&lt;br /&gt;
注意保证你的WIFI是打开的，点击对应设备 &#039;&#039;&#039;blsync&#039;&#039;&#039; 进行连接。&lt;br /&gt;
&lt;br /&gt;
[[文件:Ble apk 2.jpg|670x670像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;进入后连接成功的界面：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=文件:Ble_apk_1.jpg|链接=文件:Ble_apk_1.jpg|670x670像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;点击扫描配网后：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=文件:Ble_3.jpg|链接=文件:Ble_3.jpg|670x670像素]]&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:smartconfig_ble&amp;diff=137</id>
		<title>Demo:smartconfig ble</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:smartconfig_ble&amp;diff=137"/>
		<updated>2025-08-07T07:20:09Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​创建页面，内容为“== Demo介绍： == 该Demo使用BLE 蓝牙通讯 技术实现从手机端操控目标设备进行WIFI配网。  该Demo 保存在SDK下的：bouffalo_sdk/examples/wifi/sta/smartconfig_ble 路经下。  其中，手机 APK 放在该目录下的blsync 目录中。  == 主要功能分析 ==  === 1. BLE 配网与同步 ===  * 通过 BLE 广播和连接，实现手机等设备与目标设备的配对和通信。 * BLE 端通过 &amp;lt;code&amp;gt;blsync_ble_app.c&amp;lt;/code&amp;gt; 管理…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demo介绍： ==&lt;br /&gt;
该Demo使用BLE 蓝牙通讯 技术实现从手机端操控目标设备进行WIFI配网。&lt;br /&gt;
&lt;br /&gt;
该Demo 保存在SDK下的：bouffalo_sdk/examples/wifi/sta/smartconfig_ble 路经下。&lt;br /&gt;
&lt;br /&gt;
其中，手机 APK 放在该目录下的blsync 目录中。&lt;br /&gt;
&lt;br /&gt;
== 主要功能分析 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. BLE 配网与同步 ===&lt;br /&gt;
&lt;br /&gt;
* 通过 BLE 广播和连接，实现手机等设备与目标设备的配对和通信。&lt;br /&gt;
* BLE 端通过 &amp;lt;code&amp;gt;blsync_ble_app.c&amp;lt;/code&amp;gt; 管理 BLE 广播、连接、数据同步、Wi-Fi 配网等流程。&lt;br /&gt;
* 支持 BLE 端发起 Wi-Fi 扫描、连接、断开、状态查询等操作，并通过 BLE 通道将结果回传给上位机或手机。&lt;br /&gt;
&lt;br /&gt;
=== 2. Wi-Fi 智能配网 ===&lt;br /&gt;
&lt;br /&gt;
* 通过 BLE 通道下发 Wi-Fi SSID、密码等信息，设备自动连接到指定的 Wi-Fi 路由器。&lt;br /&gt;
* 支持 Wi-Fi 扫描，获取周围可用的 Wi-Fi 列表，并通过 BLE 返回给手机端。&lt;br /&gt;
* 支持 Wi-Fi 连接状态、IP 地址、网关、掩码等信息的查询和回传。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
另外：&amp;lt;code&amp;gt;payload.c&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;transfer.c&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;encrypt_layer.c&amp;lt;/code&amp;gt; 等文件实现了 BLE 配网协议的数据封装、分包、加密、解密、校验、ACK 等机制，保证 BLE 通信过程中的数据完整性和安全性。&lt;br /&gt;
&lt;br /&gt;
=== 当配网正确时的输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] Starting wifi ...                                                                                                                                                                   &lt;br /&gt;
[I][MAIN] Starting fhost ...                                                                                                                                                                  &lt;br /&gt;
Read slot:0                                                                                                                                                                                   &lt;br /&gt;
get sta mac: b4:0e:cf:2e:90:fb                                                                                                                                                                &lt;br /&gt;
Read slot:0                                                                                                                                                                                   &lt;br /&gt;
get ap mac: b4:0e:cf:2e:90:fb                                                                                                                                                                 &lt;br /&gt;
fhost_cntrl_start:3489                                                                                                                                                                        &lt;br /&gt;
fhost_cntrl_start:3492                                                                                                                                                                        &lt;br /&gt;
[I][MAIN] [APP] [EVT] wifi_event_handler, CODE_WIFI_ON_INIT_DONE                                                                                                                              &lt;br /&gt;
wifi_mgmr_set_country_code:code = CN, channel24G_num:13, channel5G_num:0                                                                                                                      &lt;br /&gt;
[I][MAIN] [APP] [EVT] wifi_event_handler, CODE_WIFI_ON_MGMR_DONE                                                                                                                              &lt;br /&gt;
SIGTERM is NOT supported yet!                                                                                                                                                                 &lt;br /&gt;
SIGHUP is NOT supported yet!                                                                                                                                                                  &lt;br /&gt;
blsync_connected                                                                                                                                                                              &lt;br /&gt;
Exchange mtu size pending.                                                                                                                                                                    &lt;br /&gt;
Exchange successful                         //代表蓝牙连接成功                                                                                                                                                          &lt;br /&gt;
event type 0, id 9                                                                                                                                                                            &lt;br /&gt;
Recevied indication to wifi scan          &lt;br /&gt;
&lt;br /&gt;
...........&lt;br /&gt;
&lt;br /&gt;
=================================================================                                                                                                                             &lt;br /&gt;
[I][MAIN] [APP] [EVT] wifi_event_handler, CODE_WIFI_ON_CONNECTED                                                                                                                              &lt;br /&gt;
==========================  Keyram Config ========================                                                                                                                            &lt;br /&gt;
  start 08 --&amp;gt;&amp;gt; end 11; nVAP 02; max 31                                                                                                                                                       &lt;br /&gt;
==========================  Keyram Dump =========================                                                                                                                             &lt;br /&gt;
[id]   MAC Address     Key Len  VLan ID  Default        Key Hexdump(16Bytes MAX)                                                                                                              &lt;br /&gt;
[00] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[01] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[02] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[03] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[04] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[05] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[06] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[07] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000                                                                                                         &lt;br /&gt;
[08] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000&lt;br /&gt;
[09] 58:41:20:A8:4F:FC  64-Bit    01        1     00000000 00000000 00000000 00000000&lt;br /&gt;
[10] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000&lt;br /&gt;
[11] FF:FF:FF:FF:FF:FF  64-Bit    00        0     00000000 00000000 00000000 00000000&lt;br /&gt;
==========================  MAC Address =========================&lt;br /&gt;
    MAC B4:0E:CF:2E:90:FB Mask 00:00:00:00:00:00&lt;br /&gt;
  BSSID 58:41:20:A8:4F:FC Mask 00:00:00:00:00:00&lt;br /&gt;
start dhcping ...                              &lt;br /&gt;
wpa_supplicant_ctrl_iface_msg_cb: cmd send succeded, txt is State### ASSOCIATED -&amp;gt; COMPLETED&lt;br /&gt;
[WPA] CTRL-EVENT-SUBNET-STATUS-UPDATE status=0&lt;br /&gt;
event type 0, id 13                            &lt;br /&gt;
Recevied indication to wifi state get&lt;br /&gt;
Connected                    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== APK操作： ==&lt;br /&gt;
注意保证你的WIFI是打开的，点击对应设备 &#039;&#039;&#039;blsync&#039;&#039;&#039; 进行连接。&lt;br /&gt;
&lt;br /&gt;
[[文件:Ble apk 2.jpg|670x670像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
进入后连接成功的界面：&lt;br /&gt;
[[文件:Ble apk 1.jpg|670x670像素]]&lt;br /&gt;
点击扫描配网后：&lt;br /&gt;
[[文件:Ble 3.jpg|左|670x670像素]]&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E6%96%87%E4%BB%B6:Ble_3.jpg&amp;diff=136</id>
		<title>文件:Ble 3.jpg</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E6%96%87%E4%BB%B6:Ble_3.jpg&amp;diff=136"/>
		<updated>2025-08-07T07:19:05Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;3&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E6%96%87%E4%BB%B6:Ble_apk_2.jpg&amp;diff=135</id>
		<title>文件:Ble apk 2.jpg</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E6%96%87%E4%BB%B6:Ble_apk_2.jpg&amp;diff=135"/>
		<updated>2025-08-07T07:15:11Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E6%96%87%E4%BB%B6:Ble_apk_1.jpg&amp;diff=134</id>
		<title>文件:Ble apk 1.jpg</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E6%96%87%E4%BB%B6:Ble_apk_1.jpg&amp;diff=134"/>
		<updated>2025-08-07T07:12:42Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=133</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=133"/>
		<updated>2025-08-06T08:09:39Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​/* Demos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Started =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/bouffalolab/bouffalo_sdk 如何获取SDK]&lt;br /&gt;
* [[如何在Ubuntu上搭建编译环境]]&lt;br /&gt;
* [[如何在Windows上搭建编译环境]]&lt;br /&gt;
* [[如何获取开发板]]&lt;br /&gt;
* [[烧录固件到开发板]]&lt;br /&gt;
&lt;br /&gt;
= Bouffalo SDK =&lt;br /&gt;
&#039;&#039;&#039;BouffaloSDK&#039;&#039;&#039; 是 Bouffalo Lab 提供的 IOT 和 MCU 软件开发包，支持博流智能所有系列芯片，也是 &#039;&#039;&#039;bl_mcu_sdk&#039;&#039;&#039; 和 &#039;&#039;&#039;bl_iot_sdk&#039;&#039;&#039; 的结合体。&lt;br /&gt;
&lt;br /&gt;
[[文件:BouffaloSDK.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
= Peripherals =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[I2S]]&lt;br /&gt;
*[[I2C]]&lt;br /&gt;
*[[CVBS]]&lt;br /&gt;
*[[Watchdog]]&lt;br /&gt;
*[[GSM/GPRS]]&lt;br /&gt;
*[[Codec]]&lt;br /&gt;
*[[PCIe]]&lt;br /&gt;
*[[GPIO]]&lt;br /&gt;
*[[eMMC]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[WiFi]]&lt;br /&gt;
*[[LED]]&lt;br /&gt;
*[[Serial port]]&lt;br /&gt;
*[[PWM]]&lt;br /&gt;
*[[SPI]]&lt;br /&gt;
*[[USB OTG]]&lt;br /&gt;
*[[LCD]]&lt;br /&gt;
*[[CPU]]&lt;br /&gt;
*[[Network]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Bluetooth]]&lt;br /&gt;
*[[HDMI]]&lt;br /&gt;
*[[Camera]]&lt;br /&gt;
*[[Memory]]&lt;br /&gt;
*[[RTC]]&lt;br /&gt;
*[[EEPROM]]&lt;br /&gt;
*[[MIPI-DSI]]&lt;br /&gt;
*[[NPU]]&lt;br /&gt;
*[[VPU]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Products =&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL602]]&lt;br /&gt;
* [[BL702]]&lt;br /&gt;
* [[BL618]]&lt;br /&gt;
* [[BL606P]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL702L]]&lt;br /&gt;
* [[BL616]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Develop Boards =&lt;br /&gt;
* BL602EVB&lt;br /&gt;
&lt;br /&gt;
= Application Notes =&lt;br /&gt;
* [[SDIOWIFI架构和开发手册]]&lt;br /&gt;
* [[BL616低功耗开发手册]]&lt;br /&gt;
* [[USB Wi-Fi用户手册]]&lt;br /&gt;
&lt;br /&gt;
= Demos =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:FreeRTOS]]&lt;br /&gt;
* [[Demo:wifi sta]]&lt;br /&gt;
* [[Demo:boot2_isp]]&lt;br /&gt;
* [[Demo:helloworld]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:DMA]]&lt;br /&gt;
* [[Demo:Btble]]&lt;br /&gt;
* [[Demo:coremark]]&lt;br /&gt;
* [[Demo:littlefs]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:Flash]]&lt;br /&gt;
* [[Demo:Basical case]]&lt;br /&gt;
* [[Demo:dsp]]&lt;br /&gt;
* [[Demo:cks]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:cks&amp;diff=132</id>
		<title>Demo:cks</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:cks&amp;diff=132"/>
		<updated>2025-08-06T08:09:06Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​创建页面，内容为“== 介绍： == 这部分 Demo 主要测试了开发板上的软件和硬件 CheckSum 也就是校验和。  保存在 SDK 下的：&amp;#039;&amp;#039;&amp;#039;bouffalo_sdk/examples/peripherals/cks 。&amp;#039;&amp;#039;&amp;#039;  == Demo:cks_dma ==  === 测试内容 ===  # &amp;#039;&amp;#039;&amp;#039;软件校验和计算&amp;#039;&amp;#039;&amp;#039;：使用 &amp;lt;code&amp;gt;sw_chksum&amp;lt;/code&amp;gt; 函数通过纯软件方式计算校验和。测试软件计算校验和的时间和结果。 # &amp;#039;&amp;#039;&amp;#039;硬件校验和计算&amp;#039;&amp;#039;&amp;#039;：使用 &amp;lt;code&amp;gt;bflb_cks_compute&amp;lt;/code&amp;gt; 函数通过硬…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 介绍： ==&lt;br /&gt;
这部分 Demo 主要测试了开发板上的软件和硬件 CheckSum 也就是校验和。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的：&#039;&#039;&#039;bouffalo_sdk/examples/peripherals/cks 。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:cks_dma ==&lt;br /&gt;
&lt;br /&gt;
=== 测试内容 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;软件校验和计算&#039;&#039;&#039;：使用 &amp;lt;code&amp;gt;sw_chksum&amp;lt;/code&amp;gt; 函数通过纯软件方式计算校验和。测试软件计算校验和的时间和结果。&lt;br /&gt;
# &#039;&#039;&#039;硬件校验和计算&#039;&#039;&#039;：使用 &amp;lt;code&amp;gt;bflb_cks_compute&amp;lt;/code&amp;gt; 函数通过硬件模块计算校验和。测试硬件计算校验和的时间和结果。&lt;br /&gt;
# &#039;&#039;&#039;DMA（直接内存访问）辅助的硬件校验和计算&#039;&#039;&#039;：使用 DMA 将数据传输到硬件校验和模块，并通过 &amp;lt;code&amp;gt;bflb_cks_compute&amp;lt;/code&amp;gt; 计算校验和。测试 DMA 辅助硬件计算校验和的时间和结果。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
CKS normal case:&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&amp;gt;&amp;gt; case1 test&lt;br /&gt;
Pass&lt;br /&gt;
Pass&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&amp;gt;&amp;gt; case2 test&lt;br /&gt;
Pass&lt;br /&gt;
Pass&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&amp;gt;&amp;gt; case3 test&lt;br /&gt;
Pass&lt;br /&gt;
Pass&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&amp;gt;&amp;gt; case4 test&lt;br /&gt;
Pass&lt;br /&gt;
Pass&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&amp;gt;&amp;gt; case5 test&lt;br /&gt;
software checksum time=5us&lt;br /&gt;
sw_cks is 61b8&lt;br /&gt;
hardware checksum time=2us&lt;br /&gt;
hw_cks is 61b8&lt;br /&gt;
Pass&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:cks_normal ==&lt;br /&gt;
&lt;br /&gt;
=== 测试内容 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;校验和计算的正确性&#039;&#039;&#039;：验证硬件校验和计算结果是否与预期值一致。比较硬件校验和与软件校验和的结果。&lt;br /&gt;
# &#039;&#039;&#039;大小端模式的支持&#039;&#039;&#039;：测试硬件校验和模块在小端（Little Endian）和大端（Big Endian）模式下的计算结果。&lt;br /&gt;
# &#039;&#039;&#039;性能测试&#039;&#039;&#039;：测试硬件校验和与软件校验和的计算时间，比较两者的性能差异。&lt;br /&gt;
# &#039;&#039;&#039;多数据段校验&#039;&#039;&#039;：测试硬件校验和模块对多段数据的累加校验功能。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
CKS normal case:&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&amp;gt;&amp;gt; case1 test&lt;br /&gt;
Pass&lt;br /&gt;
Pass&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&amp;gt;&amp;gt; case2 test&lt;br /&gt;
Pass&lt;br /&gt;
Pass&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&amp;gt;&amp;gt; case3 test&lt;br /&gt;
Pass&lt;br /&gt;
Pass&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&amp;gt;&amp;gt; case4 test&lt;br /&gt;
Pass&lt;br /&gt;
Pass&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&amp;gt;&amp;gt; case5 test&lt;br /&gt;
software checksum time=5us&lt;br /&gt;
sw_cks is 61b8&lt;br /&gt;
hardware checksum time=2us&lt;br /&gt;
hw_cks is 61b8&lt;br /&gt;
Pass&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=131</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=131"/>
		<updated>2025-08-06T07:37:25Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​partition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）支持 A/B 双分区设计，实现无缝固件更新和回滚处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：该程序会根据分区表加载固件到内存支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;   多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：OTA 更新：将新固件从临时分区复制到主分区防回滚（Anti-Rollback）：防止降级到不安全版本支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：SHA-256 校验 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Demo：mbedtls ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这段代码对tls中的加密功能进行了全面的自检测，保证mbedtls库可以正常在平台上运行。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的  bouffalo_sdk/examples/mbedtls&lt;br /&gt;
&lt;br /&gt;
=== ECDH测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdh_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致&lt;br /&gt;
&lt;br /&gt;
=== ECDSA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdsa_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：生成 ECDSA 密钥对。使用私钥对哈希值进行签名，生成签名。使用公钥验证签名的正确性。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;涉及的算法&#039;&#039;&#039;：ECDSA数字签名；哈希算法：SHA-256。&lt;br /&gt;
&lt;br /&gt;
=== AES测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_aes_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。&lt;br /&gt;
&lt;br /&gt;
=== SHA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_sha_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算，输出哈希值&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
  SHA-1 test #1: passed&lt;br /&gt;
  SHA-1 test #2: passed&lt;br /&gt;
  SHA-1 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-224 test #1: passed&lt;br /&gt;
  SHA-224 test #2: passed&lt;br /&gt;
  SHA-224 test #3: passed&lt;br /&gt;
  SHA-256 test #1: passed&lt;br /&gt;
  SHA-256 test #2: passed&lt;br /&gt;
  SHA-256 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-384 test #1: passed&lt;br /&gt;
  SHA-384 test #2: passed&lt;br /&gt;
  SHA-384 test #3: passed&lt;br /&gt;
  SHA-512 test #1: passed&lt;br /&gt;
  SHA-512 test #2: passed&lt;br /&gt;
  SHA-512 test #3: passed&lt;br /&gt;
=========== ecdh test ================&lt;br /&gt;
setup rng ... ok&lt;br /&gt;
select ecp group SECP256R1 ... ok&lt;br /&gt;
Get public key time=33ms&lt;br /&gt;
1. ecdh client generate public parameter:&lt;br /&gt;
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED&lt;br /&gt;
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1&lt;br /&gt;
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22&lt;br /&gt;
     63 E3 AC 81 91&lt;br /&gt;
     &lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
aes ctr 192 block:1000 enc cost time:331 us&lt;br /&gt;
aes ctr 192 block:1000 dec cost time:329 us&lt;br /&gt;
test aes ctr 256 &lt;br /&gt;
aes ctr 256 block:1000 enc cost time:354 us&lt;br /&gt;
aes ctr 256 block:1000 dec cost time:354 us&lt;br /&gt;
&lt;br /&gt;
=========== sha test ================&lt;br /&gt;
sha1 block:1000 cost time:415 us&lt;br /&gt;
sha256 block:1000 cost time:268 us&lt;br /&gt;
sha512 block:1000 cost time:236 us&lt;br /&gt;
mbedtls test success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:memheap ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试申请和释放 内存memory 的功能是否正常。在当前代码下，程序会不断申请释放 无休止直到将内存消耗殆尽。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/memheap&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411520 byte&lt;br /&gt;
free memory :411520 byte&lt;br /&gt;
remain 25244 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411648 byte&lt;br /&gt;
free memory :411648 byte&lt;br /&gt;
remain 25116 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :411776 byte&lt;br /&gt;
free memory :411776 byte&lt;br /&gt;
remain 24988 byte&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :433920 byte&lt;br /&gt;
free memory :433920 byte&lt;br /&gt;
remain 2844 byte&lt;br /&gt;
ptr :hello123456789123456789123456789&lt;br /&gt;
get memory :434048 byte&lt;br /&gt;
free memory :434048 byte&lt;br /&gt;
tlsf malloc 434176 bytes failed at function bflb_malloc using heap base:0x62fc5554&lt;br /&gt;
remain 436900 byte&lt;br /&gt;
try to get 434176 byte memory failed!&lt;br /&gt;
memheap test fail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:partition ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo主要测试分区表获取和输出。所以这里主要要烧录whole bin,否则没有烧录分区表会导致失败。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
======= PtTable_Config @0x62fc3cc8=======&lt;br /&gt;
magicCode 0x54504642; version 0x0000; entryCnt 8; age 0; crc32 0xE38928F3&lt;br /&gt;
idx  type device active_index     name   Address[0]  Address[1]  Length[0]   Length[1]   age&lt;br /&gt;
[00]  16     0         0        Boot2  0x00000000  0x00000000  0x0000e000  0x00000000  0&lt;br /&gt;
[01]  00     0         0           FW  0x00010000  0x00210000  0x00200000  0x00168000  0&lt;br /&gt;
[02]  10     0         0          mfg  0x00210000  0x00000000  0x00168000  0x00000000  0&lt;br /&gt;
[03]  02     0         0        media  0x00378000  0x00000000  0x00071000  0x00000000  0&lt;br /&gt;
[04]  03     0         0          PSM  0x003e9000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
[05]  04     0         0          KEY  0x003f1000  0x00000000  0x00002000  0x00000000  0&lt;br /&gt;
[06]  05     0         0         DATA  0x003f3000  0x00000000  0x00005000  0x00000000  0&lt;br /&gt;
[07]  06     0         0      factory  0x003f8000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;其中： 索引的 0 和 1 分别代表不同的区，一个是活跃的当前正在使用的，另一个是备份的用于当升级失败回滚的。&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=130</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=130"/>
		<updated>2025-08-05T09:11:28Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）支持 A/B 双分区设计，实现无缝固件更新和回滚处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：该程序会根据分区表加载固件到内存支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;   多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：OTA 更新：将新固件从临时分区复制到主分区防回滚（Anti-Rollback）：防止降级到不安全版本支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：SHA-256 校验 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Demo：mbedtls ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
这段代码对tls中的加密功能进行了全面的自检测，保证mbedtls库可以正常在平台上运行。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的  bouffalo_sdk/examples/mbedtls&lt;br /&gt;
&lt;br /&gt;
=== ECDH测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdh_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致&lt;br /&gt;
&lt;br /&gt;
=== ECDSA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdsa_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：生成 ECDSA 密钥对。使用私钥对哈希值进行签名，生成签名。使用公钥验证签名的正确性。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;涉及的算法&#039;&#039;&#039;：ECDSA数字签名；哈希算法：SHA-256。&lt;br /&gt;
&lt;br /&gt;
=== AES测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_aes_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。&lt;br /&gt;
&lt;br /&gt;
=== SHA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_sha_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算，输出哈希值&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
  SHA-1 test #1: passed&lt;br /&gt;
  SHA-1 test #2: passed&lt;br /&gt;
  SHA-1 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-224 test #1: passed&lt;br /&gt;
  SHA-224 test #2: passed&lt;br /&gt;
  SHA-224 test #3: passed&lt;br /&gt;
  SHA-256 test #1: passed&lt;br /&gt;
  SHA-256 test #2: passed&lt;br /&gt;
  SHA-256 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-384 test #1: passed&lt;br /&gt;
  SHA-384 test #2: passed&lt;br /&gt;
  SHA-384 test #3: passed&lt;br /&gt;
  SHA-512 test #1: passed&lt;br /&gt;
  SHA-512 test #2: passed&lt;br /&gt;
  SHA-512 test #3: passed&lt;br /&gt;
=========== ecdh test ================&lt;br /&gt;
setup rng ... ok&lt;br /&gt;
select ecp group SECP256R1 ... ok&lt;br /&gt;
Get public key time=33ms&lt;br /&gt;
1. ecdh client generate public parameter:&lt;br /&gt;
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED&lt;br /&gt;
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1&lt;br /&gt;
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22&lt;br /&gt;
     63 E3 AC 81 91&lt;br /&gt;
     &lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
aes ctr 192 block:1000 enc cost time:331 us&lt;br /&gt;
aes ctr 192 block:1000 dec cost time:329 us&lt;br /&gt;
test aes ctr 256 &lt;br /&gt;
aes ctr 256 block:1000 enc cost time:354 us&lt;br /&gt;
aes ctr 256 block:1000 dec cost time:354 us&lt;br /&gt;
&lt;br /&gt;
=========== sha test ================&lt;br /&gt;
sha1 block:1000 cost time:415 us&lt;br /&gt;
sha256 block:1000 cost time:268 us&lt;br /&gt;
sha512 block:1000 cost time:236 us&lt;br /&gt;
mbedtls test success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=129</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=129"/>
		<updated>2025-08-05T09:09:21Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​mbedtls&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）支持 A/B 双分区设计，实现无缝固件更新和回滚处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：该程序会根据分区表加载固件到内存支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;   多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：OTA 更新：将新固件从临时分区复制到主分区防回滚（Anti-Rollback）：防止降级到不安全版本支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：SHA-256 校验 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Demo：mbedtls ==&lt;br /&gt;
&lt;br /&gt;
=== ECDH测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdh_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致&lt;br /&gt;
&lt;br /&gt;
=== ECDSA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_ecdsa_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：生成 ECDSA 密钥对。使用私钥对哈希值进行签名，生成签名。使用公钥验证签名的正确性。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;涉及的算法&#039;&#039;&#039;：ECDSA数字签名；哈希算法：SHA-256。&lt;br /&gt;
&lt;br /&gt;
=== AES测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_aes_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。&lt;br /&gt;
&lt;br /&gt;
=== SHA测试 ===&lt;br /&gt;
函数：&amp;lt;code&amp;gt;mbedtls_sha_test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;测试内容&#039;&#039;&#039;：测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算，输出哈希值&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
  SHA-1 test #1: passed&lt;br /&gt;
  SHA-1 test #2: passed&lt;br /&gt;
  SHA-1 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-224 test #1: passed&lt;br /&gt;
  SHA-224 test #2: passed&lt;br /&gt;
  SHA-224 test #3: passed&lt;br /&gt;
  SHA-256 test #1: passed&lt;br /&gt;
  SHA-256 test #2: passed&lt;br /&gt;
  SHA-256 test #3: passed&lt;br /&gt;
&lt;br /&gt;
  SHA-384 test #1: passed&lt;br /&gt;
  SHA-384 test #2: passed&lt;br /&gt;
  SHA-384 test #3: passed&lt;br /&gt;
  SHA-512 test #1: passed&lt;br /&gt;
  SHA-512 test #2: passed&lt;br /&gt;
  SHA-512 test #3: passed&lt;br /&gt;
=========== ecdh test ================&lt;br /&gt;
setup rng ... ok&lt;br /&gt;
select ecp group SECP256R1 ... ok&lt;br /&gt;
Get public key time=33ms&lt;br /&gt;
1. ecdh client generate public parameter:&lt;br /&gt;
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED&lt;br /&gt;
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1&lt;br /&gt;
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22&lt;br /&gt;
     63 E3 AC 81 91&lt;br /&gt;
     &lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
aes ctr 192 block:1000 enc cost time:331 us&lt;br /&gt;
aes ctr 192 block:1000 dec cost time:329 us&lt;br /&gt;
test aes ctr 256 &lt;br /&gt;
aes ctr 256 block:1000 enc cost time:354 us&lt;br /&gt;
aes ctr 256 block:1000 dec cost time:354 us&lt;br /&gt;
&lt;br /&gt;
=========== sha test ================&lt;br /&gt;
sha1 block:1000 cost time:415 us&lt;br /&gt;
sha256 block:1000 cost time:268 us&lt;br /&gt;
sha512 block:1000 cost time:236 us&lt;br /&gt;
mbedtls test success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=128</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=128"/>
		<updated>2025-08-05T07:23:49Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​/* Demos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Started =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/bouffalolab/bouffalo_sdk 如何获取SDK]&lt;br /&gt;
* [[如何在Ubuntu上搭建编译环境]]&lt;br /&gt;
* [[如何在Windows上搭建编译环境]]&lt;br /&gt;
* [[如何获取开发板]]&lt;br /&gt;
* [[烧录固件到开发板]]&lt;br /&gt;
&lt;br /&gt;
= Bouffalo SDK =&lt;br /&gt;
&#039;&#039;&#039;BouffaloSDK&#039;&#039;&#039; 是 Bouffalo Lab 提供的 IOT 和 MCU 软件开发包，支持博流智能所有系列芯片，也是 &#039;&#039;&#039;bl_mcu_sdk&#039;&#039;&#039; 和 &#039;&#039;&#039;bl_iot_sdk&#039;&#039;&#039; 的结合体。&lt;br /&gt;
&lt;br /&gt;
[[文件:BouffaloSDK.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
= Peripherals =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[I2S]]&lt;br /&gt;
*[[I2C]]&lt;br /&gt;
*[[CVBS]]&lt;br /&gt;
*[[Watchdog]]&lt;br /&gt;
*[[GSM/GPRS]]&lt;br /&gt;
*[[Codec]]&lt;br /&gt;
*[[PCIe]]&lt;br /&gt;
*[[GPIO]]&lt;br /&gt;
*[[eMMC]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[WiFi]]&lt;br /&gt;
*[[LED]]&lt;br /&gt;
*[[Serial port]]&lt;br /&gt;
*[[PWM]]&lt;br /&gt;
*[[SPI]]&lt;br /&gt;
*[[USB OTG]]&lt;br /&gt;
*[[LCD]]&lt;br /&gt;
*[[CPU]]&lt;br /&gt;
*[[Network]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Bluetooth]]&lt;br /&gt;
*[[HDMI]]&lt;br /&gt;
*[[Camera]]&lt;br /&gt;
*[[Memory]]&lt;br /&gt;
*[[RTC]]&lt;br /&gt;
*[[EEPROM]]&lt;br /&gt;
*[[MIPI-DSI]]&lt;br /&gt;
*[[NPU]]&lt;br /&gt;
*[[VPU]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Products =&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL602]]&lt;br /&gt;
* [[BL702]]&lt;br /&gt;
* [[BL618]]&lt;br /&gt;
* [[BL606P]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL702L]]&lt;br /&gt;
* [[BL616]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Develop Boards =&lt;br /&gt;
* BL602EVB&lt;br /&gt;
&lt;br /&gt;
= Application Notes =&lt;br /&gt;
* [[SDIOWIFI架构和开发手册]]&lt;br /&gt;
* [[BL616低功耗开发手册]]&lt;br /&gt;
* [[USB Wi-Fi用户手册]]&lt;br /&gt;
&lt;br /&gt;
= Demos =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:FreeRTOS]]&lt;br /&gt;
* [[Demo:wifi sta]]&lt;br /&gt;
* [[Demo:boot2_isp]]&lt;br /&gt;
* [[Demo:helloworld]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:DMA]]&lt;br /&gt;
* [[Demo:Btble]]&lt;br /&gt;
* [[Demo:coremark]]&lt;br /&gt;
* [[Demo:littlefs]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:Flash]]&lt;br /&gt;
* [[Demo:Basical case]]&lt;br /&gt;
* [[Demo:dsp]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=127</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=127"/>
		<updated>2025-08-05T07:23:06Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
[[文件:Make success.png]]&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
[[文件:烧录Step1.png|无|缩略图|300x300像素]]&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
[[文件:烧录Step2.png|887x887像素]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：&lt;br /&gt;
#* 读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）&lt;br /&gt;
#* 支持 A/B 双分区设计，实现无缝固件更新和回滚&lt;br /&gt;
#* 处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：&lt;br /&gt;
#* 该程序会根据分区表加载固件到内存&lt;br /&gt;
#* 支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;&lt;br /&gt;
#* 多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：&lt;br /&gt;
#* OTA 更新：将新固件从临时分区复制到主分区&lt;br /&gt;
#* 防回滚（Anti-Rollback）：防止降级到不安全版本&lt;br /&gt;
#* 支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：&lt;br /&gt;
#* SHA-256 校验&lt;br /&gt;
#* 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=126</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=126"/>
		<updated>2025-08-05T07:17:53Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在对应 Case 的文件夹下有一个 README.md 文件，该文件中根据不同的开发板型号有不同编译的参数，例如 bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin（示例）    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：&lt;br /&gt;
#* 读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）&lt;br /&gt;
#* 支持 A/B 双分区设计，实现无缝固件更新和回滚&lt;br /&gt;
#* 处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：&lt;br /&gt;
#* 该程序会根据分区表加载固件到内存&lt;br /&gt;
#* 支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;&lt;br /&gt;
#* 多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：&lt;br /&gt;
#* OTA 更新：将新固件从临时分区复制到主分区&lt;br /&gt;
#* 防回滚（Anti-Rollback）：防止降级到不安全版本&lt;br /&gt;
#* 支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：&lt;br /&gt;
#* SHA-256 校验&lt;br /&gt;
#* 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=125</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=125"/>
		<updated>2025-08-05T07:16:09Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​Basical 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 前言 ==&lt;br /&gt;
&#039;&#039;&#039;该页面将介绍一些较为简单基础的测试case 功能，目前包括 freertos；log等级输出；boot2；这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 源码编译: ===&lt;br /&gt;
在该文件夹下有一个README.md文件，该文件中根据不同的开发板型号有不同编译的参数，例如bl616 ：&lt;br /&gt;
 - BL616/BL618&lt;br /&gt;
 &lt;br /&gt;
 ```&lt;br /&gt;
 make CHIP=bl616 BOARD=bl616dk&lt;br /&gt;
 ```&lt;br /&gt;
 #以上为README文件中的内容，根据内容直接执行对应make编译指令即可&lt;br /&gt;
make如果成功，你会在终端看到：&lt;br /&gt;
&lt;br /&gt;
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin    &#039;&#039;&#039;代表生成了对应可供烧录的固件&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 开发板烧录： ===&lt;br /&gt;
执行make命令后，在该文件夹下会生成一个build目录，在文件夹中有一个生成的固件 freertos_bl616.bin ，该文件用于烧录直接使用（类似于keil生成的.hex文件）。&lt;br /&gt;
&lt;br /&gt;
其具体路径为 &#039;&#039;&#039;.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 下载烧录工具： ====&lt;br /&gt;
下载BLDevCube工具：下载后解压即可直接使用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://dev.bouffalolab.com/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;烧录具体步骤：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step1：打开DevCube选择对应开发板型号。&lt;br /&gt;
&lt;br /&gt;
Step2：选择对应的 .bin 文件，选择对应的串口。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意：要选择IOT并勾选enable&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Step3：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;按住boot键按一下复位键（按复位时boot键不松开），然后点击Create &amp;amp; Download&#039;&#039;&#039;。查看下方的输出信息是否烧录成功。&lt;br /&gt;
&lt;br /&gt;
== Demo:FreeRTOS ==&lt;br /&gt;
在Bouffalo SDK上使用FreeRTOS APP&lt;br /&gt;
&lt;br /&gt;
=== 源码介绍： ===&lt;br /&gt;
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中，该测试 demo 简单测试了一些组件，包括Semaphore，Mutex，Queue，Priority 的基本简单测试。&lt;br /&gt;
&lt;br /&gt;
测试分为两个阶段：&lt;br /&gt;
&lt;br /&gt;
阶段一以消费者生产者模型测试&#039;&#039;&#039;信号量&#039;&#039;&#039;和&#039;&#039;&#039;信号队列&#039;&#039;&#039;组件，共生成三个Task。阶段结束后Task自动销毁。&lt;br /&gt;
&lt;br /&gt;
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试&#039;&#039;&#039;互斥量&#039;&#039;&#039;，途中高优先级的任务将启动并占用CPU一段时间以此测试抢占&#039;&#039;&#039;任务调度&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
=== 源码部分输出： ===&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5&lt;br /&gt;
 .....&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change&lt;br /&gt;
 [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.&lt;br /&gt;
&lt;br /&gt;
== Demo:bflog ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Demo:helloworld ==&lt;br /&gt;
&lt;br /&gt;
=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&lt;br /&gt;
 ===========================&lt;br /&gt;
 uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
 clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
 xtal:40000000Hz(crystal)&lt;br /&gt;
 board init done&lt;br /&gt;
 ===========================&lt;br /&gt;
 [F][MAIN] hello world fatal&lt;br /&gt;
 [E][MAIN] hello world error&lt;br /&gt;
 [W][MAIN] hello world warning&lt;br /&gt;
 [I][MAIN] hello world information&lt;br /&gt;
 hello world fatal raw&lt;br /&gt;
 hello world error raw&lt;br /&gt;
 hello world warning raw&lt;br /&gt;
 hello world information raw&lt;br /&gt;
通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
 #define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_D(...)  ((void)0)&lt;br /&gt;
 #define LOG_RD(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
 #define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
 #else&lt;br /&gt;
 #define LOG_T(...)  ((void)0)&lt;br /&gt;
 #define LOG_RT(...) ((void)0)&lt;br /&gt;
 #endif&lt;br /&gt;
是否有颜色则取决于是否带有R,在引用文件中可以看到：&lt;br /&gt;
 #define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
以上配置可以在同级目录下的 proj.conf 中。&lt;br /&gt;
&lt;br /&gt;
== Demo:log_dbg_assert ==&lt;br /&gt;
这部分代码和Demo:helloworld 基本一致，但是多了测试断言输出的功能。&lt;br /&gt;
&lt;br /&gt;
保存在 SDK 下的： bouffalo_sdk/examples/log_dbg_assert&lt;br /&gt;
&lt;br /&gt;
在代码中先进行了一个阶乘的递归函数，每一次递归以及判读啊都会输出断言信息以此测试断言输出。&lt;br /&gt;
&lt;br /&gt;
示例输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][MAIN] message = &amp;quot;hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui&amp;quot;&lt;br /&gt;
[I][MAIN] message (size: 138):&lt;br /&gt;
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a &#039;hellokszhdfoiasj&#039;&lt;br /&gt;
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 &#039;dkjnskjxnvuiolas&#039;&lt;br /&gt;
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b &#039;hdfoinaskjldfnvk&#039;&lt;br /&gt;
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 &#039;lasjhdfi213489o7&#039;&lt;br /&gt;
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c &#039;1234589073298dfl&#039;&lt;br /&gt;
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 &#039;;asjdlfnkjzxncvh&#039;&lt;br /&gt;
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a &#039;asdlkfljhasjkldj&#039;&lt;br /&gt;
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 &#039;hnvjkaslndfvklja&#039;&lt;br /&gt;
    00000080: 73 68 64 6c 69 66 68 75  69 00                   &#039;shdlifhui.&#039;&lt;br /&gt;
[I][MAIN] 3 * a = 6 (0x6)&lt;br /&gt;
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 2 (0x2)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 6 (0x6)&lt;br /&gt;
[I][MAIN] n * factorial(n - 1) = 24 (0x18)&lt;br /&gt;
[I][MAIN] factorial(4) = 24 (0x18)&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = false&lt;br /&gt;
[I][MAIN] n &amp;lt;= 1 = true&lt;br /&gt;
[I][MAIN] 1 = 1 (0x1)&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
 1 == factorial(4) but 1 = 1 , factorial(4) = 24&lt;br /&gt;
error handler&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Demo:boot2 isp ==&lt;br /&gt;
这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：&lt;br /&gt;
#* 读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）&lt;br /&gt;
#* 支持 A/B 双分区设计，实现无缝固件更新和回滚&lt;br /&gt;
#* 处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：&lt;br /&gt;
#* 该程序会根据分区表加载固件到内存&lt;br /&gt;
#* 支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;&lt;br /&gt;
#* 多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：&lt;br /&gt;
#* OTA 更新：将新固件从临时分区复制到主分区&lt;br /&gt;
#* 防回滚（Anti-Rollback）：防止降级到不安全版本&lt;br /&gt;
#* 支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：&lt;br /&gt;
#* SHA-256 校验&lt;br /&gt;
#* 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:bflog&amp;diff=124</id>
		<title>Demo:bflog</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:bflog&amp;diff=124"/>
		<updated>2025-08-05T07:01:05Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​武楷轩移动页面Demo:bflog至Demo:Basical case&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#重定向 [[Demo:Basical case]]&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=123</id>
		<title>Demo:Basical case</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Basical_case&amp;diff=123"/>
		<updated>2025-08-05T07:01:05Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​武楷轩移动页面Demo:bflog至Demo:Basical case&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Demo介绍： ===&lt;br /&gt;
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下，主要测试该开发板不同级别的log输出功能；&lt;br /&gt;
&lt;br /&gt;
filter对输出日志的过滤功能。bflog分为五个级别，分别为：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;日志等级&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;说明&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;基本应用场景&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;FATL&#039;&#039;&#039;&lt;br /&gt;
|致命错误（Fatal）&lt;br /&gt;
|系统无法继续运行的灾难性事件（如核心崩溃、数据损坏），需立即人工干预并终止程序。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ERRO&#039;&#039;&#039;&lt;br /&gt;
|错误（Error）&lt;br /&gt;
|影响当前操作的关键错误（如功能失效、外部服务异常），但系统仍可部分运行，需尽快处理。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;WARN&#039;&#039;&#039;&lt;br /&gt;
|警告（Warning）&lt;br /&gt;
|非关键性异常或潜在风险（如配置降级、资源不足），需关注但无需立即行动。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;INFO&#039;&#039;&#039;&lt;br /&gt;
|信息（Info）&lt;br /&gt;
|常规运行状态记录（如服务启动、关键操作完成），用于监控系统健康状态。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;DBUG&#039;&#039;&#039;&lt;br /&gt;
|调试（Debug）&lt;br /&gt;
|开发/测试阶段的详细运行细节（如变量值、逻辑分支），用于定位问题原因。&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TRAC&#039;&#039;&#039;&lt;br /&gt;
|跟踪（Trace）&lt;br /&gt;
|最细粒度的执行路径追踪（如函数调用栈、循环过程），用于深度分析复杂逻辑。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== barebone_sync： ===&lt;br /&gt;
该部分主要是裸机测试了以上的各个等级log输出，filter过滤。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
&lt;br /&gt;
============================== enable all output&lt;br /&gt;
&lt;br /&gt;
[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]&amp;lt;MAIN&amp;gt; hello world this is fatal error&lt;br /&gt;
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]&amp;lt;MAIN&amp;gt; hello world this is error&lt;br /&gt;
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]&amp;lt;MAIN&amp;gt; hello world this is warning&lt;br /&gt;
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]&amp;lt;MAIN&amp;gt; hello world this is information&lt;br /&gt;
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]&amp;lt;MAIN&amp;gt; hello world this is degug information&lt;br /&gt;
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]&amp;lt;MAIN&amp;gt; hello world this is trace information&lt;br /&gt;
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== enable only MAIN output&lt;br /&gt;
&lt;br /&gt;
[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]&amp;lt;TEST&amp;gt; hello test this is fatal error&lt;br /&gt;
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]&amp;lt;TEST&amp;gt; hello test this is error&lt;br /&gt;
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]&amp;lt;TEST&amp;gt; hello test this is warning&lt;br /&gt;
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]&amp;lt;TEST&amp;gt; hello test this is information&lt;br /&gt;
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]&amp;lt;TEST&amp;gt; hello test this is degug information&lt;br /&gt;
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]&amp;lt;TEST&amp;gt; hello test this is trace information&lt;br /&gt;
&lt;br /&gt;
============================== disable all output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== freertos_async： ===&lt;br /&gt;
该部分测试了在FreeRTOS下log的输出是否正常。&lt;br /&gt;
&lt;br /&gt;
该case创建了两个任务，消费者和生产者，从信号队列中进行获取和放入的经典场景来测试log。&lt;br /&gt;
&lt;br /&gt;
消费者任务和生产者任务具体代码放在同目录下的： thread_consumer; thread_producer;中。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;部分输出：&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:lmac154&amp;diff=122</id>
		<title>Demo:lmac154</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:lmac154&amp;diff=122"/>
		<updated>2025-08-05T06:18:12Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​lmac154&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Demo介绍： ===&lt;br /&gt;
该Demo根据IEEE 802.15.4标准的无线通信 实现了数据链路层的基本无限通讯协议。&lt;br /&gt;
&lt;br /&gt;
该Demo是构建上层无线通信协议的&#039;&#039;&#039;起点&#039;&#039;&#039;。你可以直接在其MAC层基础上开发Zigbee网络层，或通过替换物理层驱动适配LoRa，亦或实现自定义的轻量级IoT协议。&lt;br /&gt;
&lt;br /&gt;
保存在SDK 下的 bouffalo_sdk/examples/lmac154&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
代码：代码部分主要做了RF 也就是 频射相关的初始化，然后通过每秒发包来测试TX或者RX的吞吐量。&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[I][rfparam] tcap_tsen[10]: -3,-4,20,39,39,40,41,42,43,44,&lt;br /&gt;
[I][rfparam] tcap_cap[11]: 28,29,30,31,32,33,34,35,36,37,38,&lt;br /&gt;
[OS] Starting lmac154 example task...&lt;br /&gt;
[OS] Starting OS Scheduler...&lt;br /&gt;
RF (channel 12) Init&lt;br /&gt;
Tx Power: 15dBm&lt;br /&gt;
CCA: 0, RSSI: -120dBm&lt;br /&gt;
&lt;br /&gt;
TX Done (STATUS: 0, SN: 0x00)&lt;br /&gt;
&lt;br /&gt;
No Ack&lt;br /&gt;
&lt;br /&gt;
TX Done (STATUS: 0, SN: 0x00)&lt;br /&gt;
&lt;br /&gt;
No Ack&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=121</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=121"/>
		<updated>2025-08-05T02:58:39Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​/* Demos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Started =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/bouffalolab/bouffalo_sdk 如何获取SDK]&lt;br /&gt;
* [[如何在Ubuntu上搭建编译环境]]&lt;br /&gt;
* [[如何在Windows上搭建编译环境]]&lt;br /&gt;
* [[如何获取开发板]]&lt;br /&gt;
* [[烧录固件到开发板]]&lt;br /&gt;
&lt;br /&gt;
= Bouffalo SDK =&lt;br /&gt;
&#039;&#039;&#039;BouffaloSDK&#039;&#039;&#039; 是 Bouffalo Lab 提供的 IOT 和 MCU 软件开发包，支持博流智能所有系列芯片，也是 &#039;&#039;&#039;bl_mcu_sdk&#039;&#039;&#039; 和 &#039;&#039;&#039;bl_iot_sdk&#039;&#039;&#039; 的结合体。&lt;br /&gt;
&lt;br /&gt;
[[文件:BouffaloSDK.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
= Peripherals =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[I2S]]&lt;br /&gt;
*[[I2C]]&lt;br /&gt;
*[[CVBS]]&lt;br /&gt;
*[[Watchdog]]&lt;br /&gt;
*[[GSM/GPRS]]&lt;br /&gt;
*[[Codec]]&lt;br /&gt;
*[[PCIe]]&lt;br /&gt;
*[[GPIO]]&lt;br /&gt;
*[[eMMC]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[WiFi]]&lt;br /&gt;
*[[LED]]&lt;br /&gt;
*[[Serial port]]&lt;br /&gt;
*[[PWM]]&lt;br /&gt;
*[[SPI]]&lt;br /&gt;
*[[USB OTG]]&lt;br /&gt;
*[[LCD]]&lt;br /&gt;
*[[CPU]]&lt;br /&gt;
*[[Network]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Bluetooth]]&lt;br /&gt;
*[[HDMI]]&lt;br /&gt;
*[[Camera]]&lt;br /&gt;
*[[Memory]]&lt;br /&gt;
*[[RTC]]&lt;br /&gt;
*[[EEPROM]]&lt;br /&gt;
*[[MIPI-DSI]]&lt;br /&gt;
*[[NPU]]&lt;br /&gt;
*[[VPU]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Products =&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL602]]&lt;br /&gt;
* [[BL702]]&lt;br /&gt;
* [[BL618]]&lt;br /&gt;
* [[BL606P]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL702L]]&lt;br /&gt;
* [[BL616]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Develop Boards =&lt;br /&gt;
* BL602EVB&lt;br /&gt;
&lt;br /&gt;
= Application Notes =&lt;br /&gt;
* [[SDIOWIFI架构和开发手册]]&lt;br /&gt;
* [[BL616低功耗开发手册]]&lt;br /&gt;
* [[USB Wi-Fi用户手册]]&lt;br /&gt;
&lt;br /&gt;
= Demos =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:FreeRTOS]]&lt;br /&gt;
* [[Demo:wifi sta]]&lt;br /&gt;
* [[Demo:boot2_isp]]&lt;br /&gt;
* [[Demo:helloworld]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:DMA]]&lt;br /&gt;
* [[Demo:Btble]]&lt;br /&gt;
* [[Demo:coremark]]&lt;br /&gt;
* [[Demo:littlefs]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:Flash]]&lt;br /&gt;
* [[Demo:bflog]]&lt;br /&gt;
* [[Demo:dsp]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:littlefs&amp;diff=120</id>
		<title>Demo:littlefs</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:littlefs&amp;diff=120"/>
		<updated>2025-08-05T02:58:05Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​littlefs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Demo介绍： ===&lt;br /&gt;
该部分demo主要测试了开发板的文件系统是否正常运行。对文件进行基本的创建读写来完成测试。&lt;br /&gt;
&lt;br /&gt;
这部分代码存放在SDK下的： bouffalo_sdk/examples/littlefs&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;注意： 这部分代码需要完整的 XIP init ，也就是说需要 分区表，所以在执行玩基本的 make 编译后必须进行马 make whole 然后烧录 whole bin文件。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 示例输出： ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
burst wrap cmd   0x77&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
Active Partition[0] consumed 596 Bytes&lt;br /&gt;
======= PtTable_Config @0x62fc6880=======&lt;br /&gt;
magicCode 0x54504642; version 0x0000; entryCnt 8; age 0; crc32 0xE38928F3&lt;br /&gt;
idx  type device active_index     name   Address[0]  Address[1]  Length[0]   Length[1]   age&lt;br /&gt;
[00]  16     0         0        Boot2  0x00000000  0x00000000  0x0000e000  0x00000000  0&lt;br /&gt;
[01]  00     0         0           FW  0x00010000  0x00210000  0x00200000  0x00168000  0&lt;br /&gt;
[02]  10     0         0          mfg  0x00210000  0x00000000  0x00168000  0x00000000  0&lt;br /&gt;
[03]  02     0         0        media  0x00378000  0x00000000  0x00071000  0x00000000  0&lt;br /&gt;
[04]  03     0         0          PSM  0x003e9000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
[05]  04     0         0          KEY  0x003f1000  0x00000000  0x00002000  0x00000000  0&lt;br /&gt;
[06]  05     0         0         DATA  0x003f3000  0x00000000  0x00005000  0x00000000  0&lt;br /&gt;
[07]  06     0         0      factory  0x003f8000  0x00000000  0x00008000  0x00000000  0&lt;br /&gt;
bouffalolab /&amp;gt;[MTD] &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Hanlde info Dump &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
      name PSM&lt;br /&gt;
      id 0&lt;br /&gt;
      offset 0x003e9000(4100096)&lt;br /&gt;
      size 0x00008000(32Kbytes)&lt;br /&gt;
      xip_addr 0xa03d8000&lt;br /&gt;
[MTD] &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; Hanlde info End &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
[I][LFS] Found valid PSM partition, XIP addr a03d8000, flash addr 003e9000, size 32768&lt;br /&gt;
[I][LFS] mount success&lt;br /&gt;
boot_count: 8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;输出首先是分区表的信息，其中包括 ：活跃分区表索引；Bootloader 的区域；主要代码存放区域等等。 &lt;br /&gt;
&lt;br /&gt;
下方是XIP INIT 中的一些信息，和程序输出，其中 mount success 可以表示该程序执行是成功的。&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=119</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=119"/>
		<updated>2025-08-04T09:09:56Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​/* Demos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Started =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/bouffalolab/bouffalo_sdk 如何获取SDK]&lt;br /&gt;
* [[如何在Ubuntu上搭建编译环境]]&lt;br /&gt;
* [[如何在Windows上搭建编译环境]]&lt;br /&gt;
* [[如何获取开发板]]&lt;br /&gt;
* [[烧录固件到开发板]]&lt;br /&gt;
&lt;br /&gt;
= Bouffalo SDK =&lt;br /&gt;
&#039;&#039;&#039;BouffaloSDK&#039;&#039;&#039; 是 Bouffalo Lab 提供的 IOT 和 MCU 软件开发包，支持博流智能所有系列芯片，也是 &#039;&#039;&#039;bl_mcu_sdk&#039;&#039;&#039; 和 &#039;&#039;&#039;bl_iot_sdk&#039;&#039;&#039; 的结合体。&lt;br /&gt;
&lt;br /&gt;
[[文件:BouffaloSDK.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
= Peripherals =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[I2S]]&lt;br /&gt;
*[[I2C]]&lt;br /&gt;
*[[CVBS]]&lt;br /&gt;
*[[Watchdog]]&lt;br /&gt;
*[[GSM/GPRS]]&lt;br /&gt;
*[[Codec]]&lt;br /&gt;
*[[PCIe]]&lt;br /&gt;
*[[GPIO]]&lt;br /&gt;
*[[eMMC]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[WiFi]]&lt;br /&gt;
*[[LED]]&lt;br /&gt;
*[[Serial port]]&lt;br /&gt;
*[[PWM]]&lt;br /&gt;
*[[SPI]]&lt;br /&gt;
*[[USB OTG]]&lt;br /&gt;
*[[LCD]]&lt;br /&gt;
*[[CPU]]&lt;br /&gt;
*[[Network]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Bluetooth]]&lt;br /&gt;
*[[HDMI]]&lt;br /&gt;
*[[Camera]]&lt;br /&gt;
*[[Memory]]&lt;br /&gt;
*[[RTC]]&lt;br /&gt;
*[[EEPROM]]&lt;br /&gt;
*[[MIPI-DSI]]&lt;br /&gt;
*[[NPU]]&lt;br /&gt;
*[[VPU]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Products =&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL602]]&lt;br /&gt;
* [[BL702]]&lt;br /&gt;
* [[BL618]]&lt;br /&gt;
* [[BL606P]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL702L]]&lt;br /&gt;
* [[BL616]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Develop Boards =&lt;br /&gt;
* BL602EVB&lt;br /&gt;
&lt;br /&gt;
= Application Notes =&lt;br /&gt;
* [[SDIOWIFI架构和开发手册]]&lt;br /&gt;
* [[BL616低功耗开发手册]]&lt;br /&gt;
* [[USB Wi-Fi用户手册]]&lt;br /&gt;
&lt;br /&gt;
= Demos =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:FreeRTOS]]&lt;br /&gt;
* [[Demo:wifi sta]]&lt;br /&gt;
* [[Demo:boot2_isp]]&lt;br /&gt;
* [[Demo:helloworld]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:DMA]]&lt;br /&gt;
* [[Demo:Btble]]&lt;br /&gt;
* [[Demo:coremark]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:Flash]]&lt;br /&gt;
* [[Demo:bflog]]&lt;br /&gt;
* [[Demo:dsp]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:helloworld&amp;diff=118</id>
		<title>Demo:helloworld</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:helloworld&amp;diff=118"/>
		<updated>2025-08-04T09:09:25Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​创建页面，内容为“=== Demo介绍： === 该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。  保存路径： bouffalo_sdk/examples/helloworld  在当前默认情况下的输出如下：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt; =========================== uart  sig1:ffffffff, sig2:0000f32f clock gen1:9ffffffd, gen2:0fff0c11 xtal:40000000Hz(crystal) board init done ==============…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Demo介绍： ===&lt;br /&gt;
该demo测试基本日志等级输出，该Demo是对bflog加了一层封装，比如控制日志输出等级，控制是否使用严重等级颜色输出。&lt;br /&gt;
&lt;br /&gt;
保存路径： bouffalo_sdk/examples/helloworld&lt;br /&gt;
&lt;br /&gt;
在当前默认情况下的输出如下：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
[F][MAIN] hello world fatal&lt;br /&gt;
[E][MAIN] hello world error&lt;br /&gt;
[W][MAIN] hello world warning&lt;br /&gt;
[I][MAIN] hello world information&lt;br /&gt;
hello world fatal raw&lt;br /&gt;
hello world error raw&lt;br /&gt;
hello world warning raw&lt;br /&gt;
hello world information raw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过代码对应可以看到部分代码没有输出，部分代码有颜色而部分代码没有颜色。&lt;br /&gt;
&lt;br /&gt;
没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出：&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#if (CONFIG_LOG_LEVEL &amp;gt;= 4)&lt;br /&gt;
#define LOG_D(...)  BFLOG_D((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
#define LOG_RD(...) BFLOG_RD((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
#else&lt;br /&gt;
#define LOG_D(...)  ((void)0)&lt;br /&gt;
#define LOG_RD(...) ((void)0)&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (CONFIG_LOG_LEVEL &amp;gt;= 5)&lt;br /&gt;
#define LOG_T(...)  BFLOG_T((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
#define LOG_RT(...) BFLOG_RT((void *)&amp;amp;__bflog_recorder, __VA_ARGS__)&lt;br /&gt;
#else&lt;br /&gt;
#define LOG_T(...)  ((void)0)&lt;br /&gt;
#define LOG_RT(...) ((void)0)&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;是否有颜色则取决于是否带有R,在引用文件中可以看到：&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;以上配置可以在同级目录下的 proj.conf 中。&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=117</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=117"/>
		<updated>2025-08-04T08:36:16Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​/* Demos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Started =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/bouffalolab/bouffalo_sdk 如何获取SDK]&lt;br /&gt;
* [[如何在Ubuntu上搭建编译环境]]&lt;br /&gt;
* [[如何在Windows上搭建编译环境]]&lt;br /&gt;
* [[如何获取开发板]]&lt;br /&gt;
* [[烧录固件到开发板]]&lt;br /&gt;
&lt;br /&gt;
= Bouffalo SDK =&lt;br /&gt;
&#039;&#039;&#039;BouffaloSDK&#039;&#039;&#039; 是 Bouffalo Lab 提供的 IOT 和 MCU 软件开发包，支持博流智能所有系列芯片，也是 &#039;&#039;&#039;bl_mcu_sdk&#039;&#039;&#039; 和 &#039;&#039;&#039;bl_iot_sdk&#039;&#039;&#039; 的结合体。&lt;br /&gt;
&lt;br /&gt;
[[文件:BouffaloSDK.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
= Peripherals =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[I2S]]&lt;br /&gt;
*[[I2C]]&lt;br /&gt;
*[[CVBS]]&lt;br /&gt;
*[[Watchdog]]&lt;br /&gt;
*[[GSM/GPRS]]&lt;br /&gt;
*[[Codec]]&lt;br /&gt;
*[[PCIe]]&lt;br /&gt;
*[[GPIO]]&lt;br /&gt;
*[[eMMC]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[WiFi]]&lt;br /&gt;
*[[LED]]&lt;br /&gt;
*[[Serial port]]&lt;br /&gt;
*[[PWM]]&lt;br /&gt;
*[[SPI]]&lt;br /&gt;
*[[USB OTG]]&lt;br /&gt;
*[[LCD]]&lt;br /&gt;
*[[CPU]]&lt;br /&gt;
*[[Network]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Bluetooth]]&lt;br /&gt;
*[[HDMI]]&lt;br /&gt;
*[[Camera]]&lt;br /&gt;
*[[Memory]]&lt;br /&gt;
*[[RTC]]&lt;br /&gt;
*[[EEPROM]]&lt;br /&gt;
*[[MIPI-DSI]]&lt;br /&gt;
*[[NPU]]&lt;br /&gt;
*[[VPU]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Products =&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL602]]&lt;br /&gt;
* [[BL702]]&lt;br /&gt;
* [[BL618]]&lt;br /&gt;
* [[BL606P]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL702L]]&lt;br /&gt;
* [[BL616]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Develop Boards =&lt;br /&gt;
* BL602EVB&lt;br /&gt;
&lt;br /&gt;
= Application Notes =&lt;br /&gt;
* [[SDIOWIFI架构和开发手册]]&lt;br /&gt;
* [[BL616低功耗开发手册]]&lt;br /&gt;
* [[USB Wi-Fi用户手册]]&lt;br /&gt;
&lt;br /&gt;
= Demos =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:FreeRTOS]]&lt;br /&gt;
* [[Demo:wifi sta]]&lt;br /&gt;
* [[Demo:boot2_isp]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:DMA]]&lt;br /&gt;
* [[Demo:Btble]]&lt;br /&gt;
* [[Demo:coremark]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:Flash]]&lt;br /&gt;
* [[Demo:bflog]]&lt;br /&gt;
* [[Demo:dsp]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:dsp&amp;diff=116</id>
		<title>Demo:dsp</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:dsp&amp;diff=116"/>
		<updated>2025-08-04T08:35:53Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​dsp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;该Demo主要从角度测试DSP功能是否正常，保存在SDK下的：bouffalo_sdk/examples/dsp  中。&lt;br /&gt;
&lt;br /&gt;
=== 测试目的 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;验证 DSP 算法的正确性&#039;&#039;&#039;：&lt;br /&gt;
#* 通过运行多个 DSP 算法模块，检查其输出是否符合预期。&lt;br /&gt;
# &#039;&#039;&#039;集成测试&#039;&#039;&#039;：&lt;br /&gt;
#* 确保多个 DSP 算法模块可以在同一程序中顺利运行，验证其集成性。&lt;br /&gt;
# &#039;&#039;&#039;性能测试&#039;&#039;&#039;：&lt;br /&gt;
#* 测试这些算法在嵌入式平台上的运行效率和资源占用情况。&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 测试的具体功能 ===&lt;br /&gt;
&amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; 函数依次调用了以下 DSP 算法模块，功能如下：&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;riscv_dsp2_fir_q15&amp;lt;/code&amp;gt;&#039;&#039;&#039;：&lt;br /&gt;
#* 测试FIR滤波器的实现。&lt;br /&gt;
#* 使用 Q15 格式处理输入信号，验证滤波器的输出是否与参考结果一致。&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;riscv_dsp2_matrix_q31&amp;lt;/code&amp;gt;&#039;&#039;&#039;：&lt;br /&gt;
#* 测试矩阵运算功能。&lt;br /&gt;
#* 使用 Q31 格式进行矩阵计算，例如矩阵乘法或矩阵变换。&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;riscv_dsp2_rfft_q15&amp;lt;/code&amp;gt;&#039;&#039;&#039;：&lt;br /&gt;
#* 测试快速傅里叶变换（FFT）的实现。&lt;br /&gt;
#* 使用 Q15 格式对输入信号进行频域变换，验证频域结果。&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;riscv_dsp2_sin_q31&amp;lt;/code&amp;gt;&#039;&#039;&#039;：&lt;br /&gt;
#* 测试正弦波生成功能。&lt;br /&gt;
#* 使用 Q31 格式生成正弦波信号，验证其幅值和周期是否正确。&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;riscv_dsp2_variance_q15&amp;lt;/code&amp;gt;&#039;&#039;&#039;：&lt;br /&gt;
#* 测试方差计算功能。&lt;br /&gt;
#* 使用 Q15 格式计算输入信号的方差，验证统计计算的准确性。&lt;br /&gt;
&lt;br /&gt;
==== 示例输出： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Example run riscv_dsp2_fir_q15!&lt;br /&gt;
Example run successfully!&lt;br /&gt;
Example run riscv_dsp2_matrix_q31!&lt;br /&gt;
Example run successfully!&lt;br /&gt;
Example run riscv_dsp2_rfft_q15!&lt;br /&gt;
Example run successfully!&lt;br /&gt;
Example run riscv_dsp2_fir_q15!&lt;br /&gt;
Example run successfully!&lt;br /&gt;
Example run riscv_dsp2_variance_q15!&lt;br /&gt;
Example run successfully!&lt;br /&gt;
Example all successfully!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=115</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=115"/>
		<updated>2025-08-04T08:23:46Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​/* Demos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Started =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/bouffalolab/bouffalo_sdk 如何获取SDK]&lt;br /&gt;
* [[如何在Ubuntu上搭建编译环境]]&lt;br /&gt;
* [[如何在Windows上搭建编译环境]]&lt;br /&gt;
* [[如何获取开发板]]&lt;br /&gt;
* [[烧录固件到开发板]]&lt;br /&gt;
&lt;br /&gt;
= Bouffalo SDK =&lt;br /&gt;
&#039;&#039;&#039;BouffaloSDK&#039;&#039;&#039; 是 Bouffalo Lab 提供的 IOT 和 MCU 软件开发包，支持博流智能所有系列芯片，也是 &#039;&#039;&#039;bl_mcu_sdk&#039;&#039;&#039; 和 &#039;&#039;&#039;bl_iot_sdk&#039;&#039;&#039; 的结合体。&lt;br /&gt;
&lt;br /&gt;
[[文件:BouffaloSDK.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
= Peripherals =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[I2S]]&lt;br /&gt;
*[[I2C]]&lt;br /&gt;
*[[CVBS]]&lt;br /&gt;
*[[Watchdog]]&lt;br /&gt;
*[[GSM/GPRS]]&lt;br /&gt;
*[[Codec]]&lt;br /&gt;
*[[PCIe]]&lt;br /&gt;
*[[GPIO]]&lt;br /&gt;
*[[eMMC]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[WiFi]]&lt;br /&gt;
*[[LED]]&lt;br /&gt;
*[[Serial port]]&lt;br /&gt;
*[[PWM]]&lt;br /&gt;
*[[SPI]]&lt;br /&gt;
*[[USB OTG]]&lt;br /&gt;
*[[LCD]]&lt;br /&gt;
*[[CPU]]&lt;br /&gt;
*[[Network]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Bluetooth]]&lt;br /&gt;
*[[HDMI]]&lt;br /&gt;
*[[Camera]]&lt;br /&gt;
*[[Memory]]&lt;br /&gt;
*[[RTC]]&lt;br /&gt;
*[[EEPROM]]&lt;br /&gt;
*[[MIPI-DSI]]&lt;br /&gt;
*[[NPU]]&lt;br /&gt;
*[[VPU]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Products =&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL602]]&lt;br /&gt;
* [[BL702]]&lt;br /&gt;
* [[BL618]]&lt;br /&gt;
* [[BL606P]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL702L]]&lt;br /&gt;
* [[BL616]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Develop Boards =&lt;br /&gt;
* BL602EVB&lt;br /&gt;
&lt;br /&gt;
= Application Notes =&lt;br /&gt;
* [[SDIOWIFI架构和开发手册]]&lt;br /&gt;
* [[BL616低功耗开发手册]]&lt;br /&gt;
* [[USB Wi-Fi用户手册]]&lt;br /&gt;
&lt;br /&gt;
= Demos =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:FreeRTOS]]&lt;br /&gt;
* [[Demo:wifi sta]]&lt;br /&gt;
* [[Demo:boot2_isp]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:DMA]]&lt;br /&gt;
* [[Demo:Btble]]&lt;br /&gt;
* [[Demo:coremark]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:Flash]]&lt;br /&gt;
* [[Demo:bflog]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:coremark&amp;diff=114</id>
		<title>Demo:coremark</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:coremark&amp;diff=114"/>
		<updated>2025-08-04T08:22:48Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​coremark&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Demo简介 (Introduction) ===&lt;br /&gt;
CoreMark 的主要目标是提供一个简单的方法来测试处理器核心功能,该Demo存放在SDK的 bouffalo_sdk/examples/coremark_v1.01 下。&lt;br /&gt;
&lt;br /&gt;
关于处理器，更多信息请访问 www.eembc.org。&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== 构建与运行 ====&lt;br /&gt;
&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; 命令构建和运行基准测试。&lt;br /&gt;
* 运行结果会输出到 &amp;lt;code&amp;gt;run1.log&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;run2.log&amp;lt;/code&amp;gt; 文件中，性能结果在 &amp;lt;code&amp;gt;run1.log&amp;lt;/code&amp;gt; 中。&lt;br /&gt;
&lt;br /&gt;
==== 交叉编译 ====&lt;br /&gt;
&lt;br /&gt;
* 对于交叉编译平台，需要调整 &amp;lt;code&amp;gt;core_portme.mak&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;core_portme.h&amp;lt;/code&amp;gt; 和可能的 &amp;lt;code&amp;gt;core_portme.c&amp;lt;/code&amp;gt; 文件。&lt;br /&gt;
* 示例：创建一个新平台目录并复制默认配置文件，然后运行： make PORT_DIR=&amp;lt;platform&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Makefile 目标 ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt;：默认目标，生成 &amp;lt;code&amp;gt;run1.log&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;run2.log&amp;lt;/code&amp;gt;。&lt;br /&gt;
* &amp;lt;code&amp;gt;run1.log&amp;lt;/code&amp;gt;：性能参数运行结果。&lt;br /&gt;
* &amp;lt;code&amp;gt;run2.log&amp;lt;/code&amp;gt;：验证参数运行结果。&lt;br /&gt;
* &amp;lt;code&amp;gt;run3.log&amp;lt;/code&amp;gt;：生成配置文件的运行结果。&lt;br /&gt;
* &amp;lt;code&amp;gt;compile&amp;lt;/code&amp;gt;：编译基准测试可执行文件。&lt;br /&gt;
* &amp;lt;code&amp;gt;link&amp;lt;/code&amp;gt;：链接基准测试可执行文件。&lt;br /&gt;
* &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;：验证源文件的 MD5 值。&lt;br /&gt;
* &amp;lt;code&amp;gt;clean&amp;lt;/code&amp;gt;：清理临时文件。&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Make 标志 ====&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;ITERATIONS&amp;lt;/code&amp;gt;&#039;&#039;&#039;：设置运行迭代次数，默认运行 10-100 秒。例如： make ITERATIONS=10 适用于模拟器、功耗测量等场景。&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;XCFLAGS&amp;lt;/code&amp;gt;&#039;&#039;&#039;：添加编译器标志。例如： make XCFLAGS=&amp;quot;-g -DMULTITHREAD=4 -DUSE_FORK=1&amp;quot;&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;CORE_DEBUG&amp;lt;/code&amp;gt;&#039;&#039;&#039;：调试运行时使用。例如： make XCFLAGS=&amp;quot;-DCORE_DEBUG=1&amp;quot;&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;REBUILD&amp;lt;/code&amp;gt;&#039;&#039;&#039;：强制重新构建可执行文件。&lt;br /&gt;
&lt;br /&gt;
==== 无 &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; 系统 (Systems Without &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
* 手动编译所需文件并运行。例如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;gcc -O2 -o coremark.exe core_list_join.c core_main.c core_matrix.c core_state.c core_util.c simple/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=1000&lt;br /&gt;
&lt;br /&gt;
./coremark.exe &amp;gt; run1.log&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 并行执行 ===&lt;br /&gt;
&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;XCFLAGS=-DMULTITHREAD=N&amp;lt;/code&amp;gt; 设置并行线程数。例如： make XCFLAGS=&amp;quot;-DMULTITHREAD=4 -DUSE_PTHREAD&amp;quot;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 可执行文件运行参数 (Run Parameters) ===&lt;br /&gt;
&lt;br /&gt;
* CoreMark 可执行文件支持多个参数（如果 &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; 支持参数）。&lt;br /&gt;
* 参数包括种子值、迭代次数、数据缓冲区大小等。&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 运行规则 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;必须&#039;&#039;&#039;：&lt;br /&gt;
*# 基准测试运行时间至少为 10 秒。&lt;br /&gt;
*# 验证必须成功，种子值为 &amp;lt;code&amp;gt;0,0,0x66&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;0x3415,0x3415,0x66&amp;lt;/code&amp;gt;。&lt;br /&gt;
*# 如果使用配置文件优化，必须使用种子值 &amp;lt;code&amp;gt;8,8,8&amp;lt;/code&amp;gt; 生成配置文件。&lt;br /&gt;
*# 所有源文件必须使用相同的编译标志。&lt;br /&gt;
* &#039;&#039;&#039;允许&#039;&#039;&#039;：&lt;br /&gt;
** 修改迭代次数、工具链、内存分配方法等。&lt;br /&gt;
* &#039;&#039;&#039;不允许&#039;&#039;&#039;：&lt;br /&gt;
** 修改除 &amp;lt;code&amp;gt;core_portme*&amp;lt;/code&amp;gt; 外的源文件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;示例输出：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Benchmark started, please make sure it runs for at least 10s.&lt;br /&gt;
&lt;br /&gt;
                                                             Now PC=a0006152&lt;br /&gt;
2K performance run parameters for coremark.&lt;br /&gt;
CoreMark Size    : 666&lt;br /&gt;
Total ticks      : 11807&lt;br /&gt;
Total time (secs): 11&lt;br /&gt;
Iterations/Sec   : 1000&lt;br /&gt;
Iterations       : 11000&lt;br /&gt;
Compiler version : GCC10.2.0&lt;br /&gt;
Compiler flags   : -O2&lt;br /&gt;
Memory location  : STACK&lt;br /&gt;
seedcrc          : 0xe9f5&lt;br /&gt;
[0]crclist       : 0xe714&lt;br /&gt;
[0]crcmatrix     : 0x1fd7&lt;br /&gt;
[0]crcstate      : 0x8e3a&lt;br /&gt;
[0]crcfinal      : 0x33ff&lt;br /&gt;
Correct operation validated. See readme.txt for run and reporting rules.&lt;br /&gt;
CoreMark 1.0 : 1000 / GCC10.2.0 -O2 / STACK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:boot2_isp&amp;diff=113</id>
		<title>Demo:boot2 isp</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:boot2_isp&amp;diff=113"/>
		<updated>2025-07-30T07:00:48Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​boot2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;这部分代码是一个bootloader程序，具备 &#039;&#039;&#039;安全启动&#039;&#039;&#039;、&#039;&#039;&#039;双分区更新&#039;&#039;&#039;、&#039;&#039;&#039;压缩支持&#039;&#039;&#039;、&#039;&#039;&#039;多核管理&#039;&#039;&#039; 等工业级特性。&lt;br /&gt;
&lt;br /&gt;
该demo存放在 SDK 下的：/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。&lt;br /&gt;
&lt;br /&gt;
=== 主要功能 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;分区表&#039;&#039;&#039;：&lt;br /&gt;
#* 读取并验证分区表（&amp;lt;code&amp;gt;pt_table_stuff&amp;lt;/code&amp;gt;），确定活动分区（&amp;lt;code&amp;gt;active_id&amp;lt;/code&amp;gt;）&lt;br /&gt;
#* 支持 A/B 双分区设计，实现无缝固件更新和回滚&lt;br /&gt;
#* 处理分区条目，包括固件位置、大小、版本号&lt;br /&gt;
# &#039;&#039;&#039;固件加载与启动&#039;&#039;&#039;：&lt;br /&gt;
#* 该程序会根据分区表加载固件到内存&lt;br /&gt;
#* 支持压缩固件：XZ 格式的解压&amp;lt;code&amp;gt;blsp_boot2_check_xz_fw&amp;lt;/code&amp;gt;&lt;br /&gt;
#* 多核支持： &amp;lt;code&amp;gt;BLSP_BOOT2_CPU_GROUP_MAX&amp;lt;/code&amp;gt; 定义 CPU 数量&lt;br /&gt;
# &#039;&#039;&#039;固件更新&#039;&#039;&#039;：&lt;br /&gt;
#* OTA 更新：将新固件从临时分区复制到主分区&lt;br /&gt;
#* 防回滚（Anti-Rollback）：防止降级到不安全版本&lt;br /&gt;
#* 支持 USB/UART 烧录模式，对应代码：&amp;lt;code&amp;gt;bflb_eflash_loader_main&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;安全&#039;&#039;&#039;：&lt;br /&gt;
#* SHA-256 校验&lt;br /&gt;
#* 具有固件完整性检查&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
您可以在开发板存在其他 App 的同时烧录该 bin ,&#039;&#039;&#039;这并不会覆盖掉你的程序，而是只为开发板更换 bootloader&#039;&#039;&#039;.&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=112</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=112"/>
		<updated>2025-07-30T06:51:41Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​/* Demos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Started =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/bouffalolab/bouffalo_sdk 如何获取SDK]&lt;br /&gt;
* [[如何在Ubuntu上搭建编译环境]]&lt;br /&gt;
* [[如何在Windows上搭建编译环境]]&lt;br /&gt;
* [[如何获取开发板]]&lt;br /&gt;
* [[烧录固件到开发板]]&lt;br /&gt;
&lt;br /&gt;
= Bouffalo SDK =&lt;br /&gt;
&#039;&#039;&#039;BouffaloSDK&#039;&#039;&#039; 是 Bouffalo Lab 提供的 IOT 和 MCU 软件开发包，支持博流智能所有系列芯片，也是 &#039;&#039;&#039;bl_mcu_sdk&#039;&#039;&#039; 和 &#039;&#039;&#039;bl_iot_sdk&#039;&#039;&#039; 的结合体。&lt;br /&gt;
&lt;br /&gt;
[[文件:BouffaloSDK.png|无框|600x600像素]]&lt;br /&gt;
&lt;br /&gt;
= Peripherals =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[I2S]]&lt;br /&gt;
*[[I2C]]&lt;br /&gt;
*[[CVBS]]&lt;br /&gt;
*[[Watchdog]]&lt;br /&gt;
*[[GSM/GPRS]]&lt;br /&gt;
*[[Codec]]&lt;br /&gt;
*[[PCIe]]&lt;br /&gt;
*[[GPIO]]&lt;br /&gt;
*[[eMMC]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[WiFi]]&lt;br /&gt;
*[[LED]]&lt;br /&gt;
*[[Serial port]]&lt;br /&gt;
*[[PWM]]&lt;br /&gt;
*[[SPI]]&lt;br /&gt;
*[[USB OTG]]&lt;br /&gt;
*[[LCD]]&lt;br /&gt;
*[[CPU]]&lt;br /&gt;
*[[Network]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Bluetooth]]&lt;br /&gt;
*[[HDMI]]&lt;br /&gt;
*[[Camera]]&lt;br /&gt;
*[[Memory]]&lt;br /&gt;
*[[RTC]]&lt;br /&gt;
*[[EEPROM]]&lt;br /&gt;
*[[MIPI-DSI]]&lt;br /&gt;
*[[NPU]]&lt;br /&gt;
*[[VPU]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Products =&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL602]]&lt;br /&gt;
* [[BL702]]&lt;br /&gt;
* [[BL618]]&lt;br /&gt;
* [[BL606P]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
* [[BL702L]]&lt;br /&gt;
* [[BL616]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Develop Boards =&lt;br /&gt;
* BL602EVB&lt;br /&gt;
&lt;br /&gt;
= Application Notes =&lt;br /&gt;
* [[SDIOWIFI架构和开发手册]]&lt;br /&gt;
* [[BL616低功耗开发手册]]&lt;br /&gt;
* [[USB Wi-Fi用户手册]]&lt;br /&gt;
&lt;br /&gt;
= Demos =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:FreeRTOS]]&lt;br /&gt;
* [[Demo:wifi sta]]&lt;br /&gt;
* [[Demo:boot2_isp]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:DMA]]&lt;br /&gt;
* [[Demo:Btble]]&lt;br /&gt;
|width=&amp;quot;32%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[Demo:Flash]]&lt;br /&gt;
* [[Demo:bflog]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Btble&amp;diff=111</id>
		<title>Demo:Btble</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Btble&amp;diff=111"/>
		<updated>2025-07-29T09:12:28Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Demo介绍： ==&lt;br /&gt;
&#039;&#039;&#039;这部分Demo主要是蓝牙通讯相关功能的实例代码，这些demo保存在SDK的 example/btble路径下。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== blemesh_cli: ==&lt;br /&gt;
&lt;br /&gt;
=== 基本介绍： ===&lt;br /&gt;
该demo创建了一个 Bluetooth mesh 网络，通过向串口发送指令进行初始化后，就可以通过手机APP在mesh网络中进行添加并连接。&lt;br /&gt;
&lt;br /&gt;
DEMO命令和输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_init              #初始化bluemesh网络&lt;br /&gt;
#输出：&lt;br /&gt;
Init successfully &lt;br /&gt;
Env[LOCAL_NAME] Data len[10], setting_env_cb&lt;br /&gt;
Use pb-adv or pb-gatt to enable advertising&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_pb 2 1            &lt;br /&gt;
#输出：&lt;br /&gt;
PB-GATT enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;执行完上述命令后，就可以使用手机APP进行NODE的添加和连接。&lt;br /&gt;
&lt;br /&gt;
添加的步骤如下：&amp;lt;gallery&amp;gt;&lt;br /&gt;
文件:APPopen.png|step1&lt;br /&gt;
文件:Meshnode2.png|step2&lt;br /&gt;
文件:Meshnode3.png|step3&lt;br /&gt;
文件:Meshnode4.png|step4&lt;br /&gt;
文件:Meshnode5.png|step5&lt;br /&gt;
文件:Meshnode6.png|ste6&lt;br /&gt;
文件:Meshnode7.png|step7&lt;br /&gt;
文件:Meshnode8.png|step8&lt;br /&gt;
文件:Meshnode9.png|step9&lt;br /&gt;
文件:Meshnode10.png|step10&lt;br /&gt;
文件:Meshnode11.png|step11&lt;br /&gt;
文件:Meshnode12.png|step12&lt;br /&gt;
文件:Meshnode13.png|step13&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 如何使用配网器 Provisioner 将新设备添加进网络中： ===&lt;br /&gt;
大概流程如下：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.打开未配网设备 ---- 2.启动配网器Provisioner ---- 3.监听设备广播 ---- 4.添加设备到网络 ---- 5.获取设备信息 ---- 6.分配密钥&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
provisioner设备编译时，必须更改一个编译选项：&lt;br /&gt;
&lt;br /&gt;
CONFIG_BT_MESH_PROVISIONER=1&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤1：打开未配网设备并且输入以下命令： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
blemesh_init        # 初始化Mesh协议栈&lt;br /&gt;
blemesh_pb 1 1      # 开启PB-ADV和PB-GATT配网承载&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤2： 打开配网器设备输入以下命令： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_pvnr_init             #初始化Provisioner&lt;br /&gt;
#得到输出：&lt;br /&gt;
    .........&lt;br /&gt;
    Local node provisioned, net_idx 0x0000 address 0x0001&lt;br /&gt;
&lt;br /&gt;
    Network key:8fe7deea92943001567251dc1f9b0f03&lt;br /&gt;
&lt;br /&gt;
    Dev key:89c2f18f9f286661c6bbb1430d7aadb7&lt;br /&gt;
&lt;br /&gt;
    Provisioning completed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0x0000&amp;lt;/code&amp;gt;：网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;address 0x0001&amp;lt;/code&amp;gt;：Provisioner自身地址&lt;br /&gt;
* &amp;lt;code&amp;gt;Network key&amp;lt;/code&amp;gt;：网络层加密密钥&lt;br /&gt;
* &amp;lt;code&amp;gt;Dev key&amp;lt;/code&amp;gt;：设备专属配置密钥&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤3：打开广播 ====&lt;br /&gt;
执行以下命令：&lt;br /&gt;
 blemesh_beacon_listen 0x01  # 开启广播监听&lt;br /&gt;
&lt;br /&gt;
* 扫描周围广播Mesh信标的设备&lt;br /&gt;
* 捕获并显示未配网设备的UUID（如：&amp;lt;code&amp;gt;07af000011112222333318b905de96c2&amp;lt;/code&amp;gt;）&lt;br /&gt;
* UUID包含设备身份信息（厂商ID、产品ID等）&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤4：在配网器设备上执行 添加设备到网络命令 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_provision_adv 07af000011112222333318b905de96c2 0 3 0&lt;br /&gt;
#输出&lt;br /&gt;
    P1：“07af000011112222333318b905de96c2&amp;quot; is UUID information.&lt;br /&gt;
    P2：0：net_idx&lt;br /&gt;
    P3：3： assign node unicast address。&lt;br /&gt;
    P4：0：attention_duration&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;UUID&amp;lt;/code&amp;gt;：目标设备的唯一标识&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0&amp;lt;/code&amp;gt;：使用的网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;address 3&amp;lt;/code&amp;gt;：分配给设备的单播地址(0x0003)&lt;br /&gt;
* &amp;lt;code&amp;gt;attention_duration 0&amp;lt;/code&amp;gt;：配网指示时长（0=无提示）&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤5：获取设备信息 ====&lt;br /&gt;
执行的命令与输出内容：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt; blemesh_get_comp 0x0000 0x0003 0x00&lt;br /&gt;
#输出：&lt;br /&gt;
P1：net index.&lt;br /&gt;
&lt;br /&gt;
P2：dst address.&lt;br /&gt;
&lt;br /&gt;
P3：page number.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0x0000&amp;lt;/code&amp;gt;：网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;dst 0x0003&amp;lt;/code&amp;gt;：目标设备地址&lt;br /&gt;
* &amp;lt;code&amp;gt;page 0x00&amp;lt;/code&amp;gt;：组成数据页码&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤6：分配密钥key ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;  blemesh_app_key_add 0x0000 0x0003 0x0000 0x0000&lt;br /&gt;
#输出&lt;br /&gt;
P1：net index.&lt;br /&gt;
&lt;br /&gt;
P2：dst address.&lt;br /&gt;
&lt;br /&gt;
P3：Network key index。&lt;br /&gt;
&lt;br /&gt;
P4：Application key index.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== blemesh_simple ==&lt;br /&gt;
该demo的功能与上述的一致，但是该demo不需要前置的命令操作，在板子上电后会自动启动 blue mesh 网络，你可以参考blemesh_cli中的连接步骤直接进行节点连接。&lt;br /&gt;
&lt;br /&gt;
如果你需要发送指令来控制，你可以发送以下指令：&lt;br /&gt;
&lt;br /&gt;
&amp;quot;gen_cli_send dstaddress&amp;quot;将控制数据发送到指定的设备地址或这组地址。&lt;br /&gt;
&lt;br /&gt;
== btble_cli ==&lt;br /&gt;
该demo会启动一个基本的BLE设备。你需要使用命令去进行操控该设备。&lt;br /&gt;
&lt;br /&gt;
如果您不熟悉BLE的通信流程，请参考以下基本流程。&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#服务端执行&lt;br /&gt;
ble_init&lt;br /&gt;
ble_start_adv 0 0 0x80 0x80&lt;br /&gt;
&lt;br /&gt;
#客户端设备执行&lt;br /&gt;
ble_start_scan 0 1 0x80 0x50&lt;br /&gt;
&lt;br /&gt;
#scan后会获取到对应的地址 进行连接 这里是示例地址&lt;br /&gt;
#连接成功后 服务端的终端会显示  connected&lt;br /&gt;
ble_connect 0 B40ECF2E90FC          &lt;br /&gt;
&lt;br /&gt;
#查询GATT服务 这里是通用服务码&lt;br /&gt;
ble_discover 0 0x1800 0x1 0xffff 或者 ble_discover 0 0x1801 0x1 0xffff&lt;br /&gt;
&lt;br /&gt;
#如果要查询特殊码（这里可以省略这一步）&lt;br /&gt;
ble_discover 3 0x1800 0x1 0xffff&lt;br /&gt;
&lt;br /&gt;
#查询到服务后，可以选择直接读写：&lt;br /&gt;
ble_read 0x7 0&lt;br /&gt;
ble_write 0x7 0 2 0102&lt;br /&gt;
&lt;br /&gt;
#也可以通过CCC进行订阅操作&lt;br /&gt;
ble_subscribe 0x4 0x3 0x1  &lt;br /&gt;
#取消订阅：&lt;br /&gt;
ble_unsubscribe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&amp;lt;big&amp;gt;上述的函数相关具体说明，全部保存在SDK的路径下： docs/en/api_reference/ble.rst&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== BLE基本通信流程   GATT服务框架：                                                                                                                                                       ===&lt;br /&gt;
[[文件:BLE.png|链接=https://docs.bouffalolab.com/%E6%96%87%E4%BB%B6:BLE.png|左|450x450像素]]&lt;br /&gt;
[[文件:GATT.png|链接=https://docs.bouffalolab.com/%E6%96%87%E4%BB%B6:GATT.png|居中|450x450像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CCC则是一个订阅开关，本质上是一个数值，服务端会监控这个数值，假设该数值变化了，那么服务端则认为连接设备需要订阅消息。&lt;br /&gt;
&lt;br /&gt;
== btble_controller_test ==&lt;br /&gt;
BLE控制器测试demo,终端返回 pwr_mod is  bf 则表示正常。&lt;br /&gt;
&lt;br /&gt;
== btble_central ==&lt;br /&gt;
该demo上电后会直接自动扫描周围的BLE设备，当设备存在并且名称匹配时，会直接进行连接并扫描对应的GATT服务然后进行订阅。&lt;br /&gt;
&lt;br /&gt;
设备名称，GATT服务等都是程序提前设定好的，这部分设定在同级目录下的 config.h 文件中。&lt;br /&gt;
&lt;br /&gt;
这里展示一部分 ：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#endif &lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*  CONFIG_BT_DEVICE_NAME:Bluetooth device name. Name can be up&lt;br /&gt;
*  to 248 bytes long (excluding NULL termination). Can be empty string&lt;br /&gt;
*/&lt;br /&gt;
#ifndef CONFIG_BT_DEVICE_NAME&lt;br /&gt;
#if defined(CONFIG_AUTO_PTS)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;AUTO_PTS_TEST0123456789012345&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#if defined(BL602)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL602-BLE-DEV&amp;quot;&lt;br /&gt;
#elif defined(BL702)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL702-BLE-DEV&amp;quot;&lt;br /&gt;
#elif defined(BL702L)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL702L-BLE-DEV&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BTBLE-DEV&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
/**&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== btble_periphral ==&lt;br /&gt;
该demo测试了BLE的OAD服务，上电后会直接执行GATT的OAD服务注册，然后进行广播，所有了连接上该服务端的设备订阅OAD服务都可以进行OAD远程升级。&lt;br /&gt;
&lt;br /&gt;
注意这部分代码需要分区表，所以在烧录时必须进行 make whole 将分区表信息烧录进去。&lt;br /&gt;
&lt;br /&gt;
OAD烧录的固件需要手动生成：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#其中FW.bin 是你要进行升级的bin&lt;br /&gt;
python3 components/wireless/bluetooth/tools/GenerateOAD.py FW.bin FW.bin.sha256&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Btble&amp;diff=110</id>
		<title>Demo:Btble</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Btble&amp;diff=110"/>
		<updated>2025-07-29T09:10:14Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​/* BLE基本通信流程：                                                                                                                                                       GATT服务是什么： */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Demo介绍： ==&lt;br /&gt;
&#039;&#039;&#039;这部分Demo主要是蓝牙通讯相关功能的实例代码，这些demo保存在SDK的 example/btble路径下。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== blemesh_cli: ==&lt;br /&gt;
&lt;br /&gt;
=== 基本介绍： ===&lt;br /&gt;
该demo创建了一个 Bluetooth mesh 网络，通过向串口发送指令进行初始化后，就可以通过手机APP在mesh网络中进行添加并连接。&lt;br /&gt;
&lt;br /&gt;
DEMO命令和输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_init              #初始化bluemesh网络&lt;br /&gt;
#输出：&lt;br /&gt;
Init successfully &lt;br /&gt;
Env[LOCAL_NAME] Data len[10], setting_env_cb&lt;br /&gt;
Use pb-adv or pb-gatt to enable advertising&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_pb 2 1            &lt;br /&gt;
#输出：&lt;br /&gt;
PB-GATT enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;执行完上述命令后，就可以使用手机APP进行NODE的添加和连接。&lt;br /&gt;
&lt;br /&gt;
添加的步骤如下：&amp;lt;gallery&amp;gt;&lt;br /&gt;
文件:APPopen.png|step1&lt;br /&gt;
文件:Meshnode2.png|step2&lt;br /&gt;
文件:Meshnode3.png|step3&lt;br /&gt;
文件:Meshnode4.png|step4&lt;br /&gt;
文件:Meshnode5.png|step5&lt;br /&gt;
文件:Meshnode6.png|ste6&lt;br /&gt;
文件:Meshnode7.png|step7&lt;br /&gt;
文件:Meshnode8.png|step8&lt;br /&gt;
文件:Meshnode9.png|step9&lt;br /&gt;
文件:Meshnode10.png|step10&lt;br /&gt;
文件:Meshnode11.png|step11&lt;br /&gt;
文件:Meshnode12.png|step12&lt;br /&gt;
文件:Meshnode13.png|step13&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 如何使用配网器 Provisioner 将新设备添加进网络中： ===&lt;br /&gt;
大概流程如下：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.打开未配网设备 ---- 2.启动配网器Provisioner ---- 3.监听设备广播 ---- 4.添加设备到网络 ---- 5.获取设备信息 ---- 6.分配密钥&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
provisioner设备编译时，必须更改一个编译选项：&lt;br /&gt;
&lt;br /&gt;
CONFIG_BT_MESH_PROVISIONER=1&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤1：打开未配网设备并且输入以下命令： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
blemesh_init        # 初始化Mesh协议栈&lt;br /&gt;
blemesh_pb 1 1      # 开启PB-ADV和PB-GATT配网承载&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤2： 打开配网器设备输入以下命令： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_pvnr_init             #初始化Provisioner&lt;br /&gt;
#得到输出：&lt;br /&gt;
    .........&lt;br /&gt;
    Local node provisioned, net_idx 0x0000 address 0x0001&lt;br /&gt;
&lt;br /&gt;
    Network key:8fe7deea92943001567251dc1f9b0f03&lt;br /&gt;
&lt;br /&gt;
    Dev key:89c2f18f9f286661c6bbb1430d7aadb7&lt;br /&gt;
&lt;br /&gt;
    Provisioning completed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0x0000&amp;lt;/code&amp;gt;：网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;address 0x0001&amp;lt;/code&amp;gt;：Provisioner自身地址&lt;br /&gt;
* &amp;lt;code&amp;gt;Network key&amp;lt;/code&amp;gt;：网络层加密密钥&lt;br /&gt;
* &amp;lt;code&amp;gt;Dev key&amp;lt;/code&amp;gt;：设备专属配置密钥&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤3：打开广播 ====&lt;br /&gt;
执行以下命令：&lt;br /&gt;
 blemesh_beacon_listen 0x01  # 开启广播监听&lt;br /&gt;
&lt;br /&gt;
* 扫描周围广播Mesh信标的设备&lt;br /&gt;
* 捕获并显示未配网设备的UUID（如：&amp;lt;code&amp;gt;07af000011112222333318b905de96c2&amp;lt;/code&amp;gt;）&lt;br /&gt;
* UUID包含设备身份信息（厂商ID、产品ID等）&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤4：在配网器设备上执行 添加设备到网络命令 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_provision_adv 07af000011112222333318b905de96c2 0 3 0&lt;br /&gt;
#输出&lt;br /&gt;
    P1：“07af000011112222333318b905de96c2&amp;quot; is UUID information.&lt;br /&gt;
    P2：0：net_idx&lt;br /&gt;
    P3：3： assign node unicast address。&lt;br /&gt;
    P4：0：attention_duration&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;UUID&amp;lt;/code&amp;gt;：目标设备的唯一标识&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0&amp;lt;/code&amp;gt;：使用的网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;address 3&amp;lt;/code&amp;gt;：分配给设备的单播地址(0x0003)&lt;br /&gt;
* &amp;lt;code&amp;gt;attention_duration 0&amp;lt;/code&amp;gt;：配网指示时长（0=无提示）&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤5：获取设备信息 ====&lt;br /&gt;
执行的命令与输出内容：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt; blemesh_get_comp 0x0000 0x0003 0x00&lt;br /&gt;
#输出：&lt;br /&gt;
P1：net index.&lt;br /&gt;
&lt;br /&gt;
P2：dst address.&lt;br /&gt;
&lt;br /&gt;
P3：page number.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0x0000&amp;lt;/code&amp;gt;：网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;dst 0x0003&amp;lt;/code&amp;gt;：目标设备地址&lt;br /&gt;
* &amp;lt;code&amp;gt;page 0x00&amp;lt;/code&amp;gt;：组成数据页码&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤6：分配密钥key ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;  blemesh_app_key_add 0x0000 0x0003 0x0000 0x0000&lt;br /&gt;
#输出&lt;br /&gt;
P1：net index.&lt;br /&gt;
&lt;br /&gt;
P2：dst address.&lt;br /&gt;
&lt;br /&gt;
P3：Network key index。&lt;br /&gt;
&lt;br /&gt;
P4：Application key index.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== blemesh_simple ==&lt;br /&gt;
该demo的功能与上述的一致，但是该demo不需要前置的命令操作，在板子上电后会自动启动 blue mesh 网络，你可以参考blemesh_cli中的连接步骤直接进行节点连接。&lt;br /&gt;
&lt;br /&gt;
如果你需要发送指令来控制，你可以发送以下指令：&lt;br /&gt;
&lt;br /&gt;
&amp;quot;gen_cli_send dstaddress&amp;quot;将控制数据发送到指定的设备地址或这组地址。&lt;br /&gt;
&lt;br /&gt;
== btble_cli ==&lt;br /&gt;
该demo会启动一个基本的BLE设备。你需要使用命令去进行操控该设备。&lt;br /&gt;
&lt;br /&gt;
如果您不熟悉BLE的通信流程，请参考以下基本流程。&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#服务端执行&lt;br /&gt;
ble_init&lt;br /&gt;
ble_start_adv 0 0 0x80 0x80&lt;br /&gt;
&lt;br /&gt;
#客户端设备执行&lt;br /&gt;
ble_start_scan 0 1 0x80 0x50&lt;br /&gt;
&lt;br /&gt;
#scan后会获取到对应的地址 进行连接 这里是示例地址&lt;br /&gt;
#连接成功后 服务端的终端会显示  connected&lt;br /&gt;
ble_connect 0 B40ECF2E90FC          &lt;br /&gt;
&lt;br /&gt;
#查询GATT服务 这里是通用服务码&lt;br /&gt;
ble_discover 0 0x1800 0x1 0xffff 或者 ble_discover 0 0x1801 0x1 0xffff&lt;br /&gt;
&lt;br /&gt;
#如果要查询特殊码（这里可以省略这一步）&lt;br /&gt;
ble_discover 3 0x1800 0x1 0xffff&lt;br /&gt;
&lt;br /&gt;
#查询到服务后，可以选择直接读写：&lt;br /&gt;
ble_read 0x7 0&lt;br /&gt;
ble_write 0x7 0 2 0102&lt;br /&gt;
&lt;br /&gt;
#也可以通过CCC进行订阅操作&lt;br /&gt;
ble_subscribe 0x4 0x3 0x1  &lt;br /&gt;
#取消订阅：&lt;br /&gt;
ble_unsubscribe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&amp;lt;big&amp;gt;上述的函数相关具体说明，全部保存在SDK的路径下： docs/en/api_reference/ble.rst&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== BLE基本通信流程：                                                                                                                                                       GATT服务是什么： ===&lt;br /&gt;
[[文件:BLE.png|链接=https://docs.bouffalolab.com/%E6%96%87%E4%BB%B6:BLE.png|左|450x450像素]]&lt;br /&gt;
[[文件:GATT.png|链接=https://docs.bouffalolab.com/%E6%96%87%E4%BB%B6:GATT.png|居中|450x450像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CCC则是一个订阅开关，本质上是一个数值，服务端会监控这个数值，假设该数值变化了，那么服务端则认为连接设备需要订阅消息。&lt;br /&gt;
&lt;br /&gt;
== btble_controller_test ==&lt;br /&gt;
BLE控制器测试demo,终端返回 pwr_mod is  bf 则表示正常。&lt;br /&gt;
&lt;br /&gt;
== btble_central ==&lt;br /&gt;
该demo上电后会直接自动扫描周围的BLE设备，当设备存在并且名称匹配时，会直接进行连接并扫描对应的GATT服务然后进行订阅。&lt;br /&gt;
&lt;br /&gt;
设备名称，GATT服务等都是程序提前设定好的，这部分设定在同级目录下的 config.h 文件中。&lt;br /&gt;
&lt;br /&gt;
这里展示一部分 ：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#endif &lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*  CONFIG_BT_DEVICE_NAME:Bluetooth device name. Name can be up&lt;br /&gt;
*  to 248 bytes long (excluding NULL termination). Can be empty string&lt;br /&gt;
*/&lt;br /&gt;
#ifndef CONFIG_BT_DEVICE_NAME&lt;br /&gt;
#if defined(CONFIG_AUTO_PTS)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;AUTO_PTS_TEST0123456789012345&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#if defined(BL602)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL602-BLE-DEV&amp;quot;&lt;br /&gt;
#elif defined(BL702)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL702-BLE-DEV&amp;quot;&lt;br /&gt;
#elif defined(BL702L)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL702L-BLE-DEV&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BTBLE-DEV&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
/**&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== btble_periphral ==&lt;br /&gt;
该demo测试了BLE的OAD服务，上电后会直接执行GATT的OAD服务注册，然后进行广播，所有了连接上该服务端的设备订阅OAD服务都可以进行OAD远程升级。&lt;br /&gt;
&lt;br /&gt;
注意这部分代码需要分区表，所以在烧录时必须进行 make whole 将分区表信息烧录进去。&lt;br /&gt;
&lt;br /&gt;
OAD烧录的固件需要手动生成：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#其中FW.bin 是你要进行升级的bin&lt;br /&gt;
python3 components/wireless/bluetooth/tools/GenerateOAD.py FW.bin FW.bin.sha256&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Btble&amp;diff=109</id>
		<title>Demo:Btble</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Btble&amp;diff=109"/>
		<updated>2025-07-29T09:08:59Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Demo介绍： ==&lt;br /&gt;
&#039;&#039;&#039;这部分Demo主要是蓝牙通讯相关功能的实例代码，这些demo保存在SDK的 example/btble路径下。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== blemesh_cli: ==&lt;br /&gt;
&lt;br /&gt;
=== 基本介绍： ===&lt;br /&gt;
该demo创建了一个 Bluetooth mesh 网络，通过向串口发送指令进行初始化后，就可以通过手机APP在mesh网络中进行添加并连接。&lt;br /&gt;
&lt;br /&gt;
DEMO命令和输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_init              #初始化bluemesh网络&lt;br /&gt;
#输出：&lt;br /&gt;
Init successfully &lt;br /&gt;
Env[LOCAL_NAME] Data len[10], setting_env_cb&lt;br /&gt;
Use pb-adv or pb-gatt to enable advertising&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_pb 2 1            &lt;br /&gt;
#输出：&lt;br /&gt;
PB-GATT enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;执行完上述命令后，就可以使用手机APP进行NODE的添加和连接。&lt;br /&gt;
&lt;br /&gt;
添加的步骤如下：&amp;lt;gallery&amp;gt;&lt;br /&gt;
文件:APPopen.png|step1&lt;br /&gt;
文件:Meshnode2.png|step2&lt;br /&gt;
文件:Meshnode3.png|step3&lt;br /&gt;
文件:Meshnode4.png|step4&lt;br /&gt;
文件:Meshnode5.png|step5&lt;br /&gt;
文件:Meshnode6.png|ste6&lt;br /&gt;
文件:Meshnode7.png|step7&lt;br /&gt;
文件:Meshnode8.png|step8&lt;br /&gt;
文件:Meshnode9.png|step9&lt;br /&gt;
文件:Meshnode10.png|step10&lt;br /&gt;
文件:Meshnode11.png|step11&lt;br /&gt;
文件:Meshnode12.png|step12&lt;br /&gt;
文件:Meshnode13.png|step13&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 如何使用配网器 Provisioner 将新设备添加进网络中： ===&lt;br /&gt;
大概流程如下：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.打开未配网设备 ---- 2.启动配网器Provisioner ---- 3.监听设备广播 ---- 4.添加设备到网络 ---- 5.获取设备信息 ---- 6.分配密钥&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
provisioner设备编译时，必须更改一个编译选项：&lt;br /&gt;
&lt;br /&gt;
CONFIG_BT_MESH_PROVISIONER=1&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤1：打开未配网设备并且输入以下命令： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
blemesh_init        # 初始化Mesh协议栈&lt;br /&gt;
blemesh_pb 1 1      # 开启PB-ADV和PB-GATT配网承载&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤2： 打开配网器设备输入以下命令： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_pvnr_init             #初始化Provisioner&lt;br /&gt;
#得到输出：&lt;br /&gt;
    .........&lt;br /&gt;
    Local node provisioned, net_idx 0x0000 address 0x0001&lt;br /&gt;
&lt;br /&gt;
    Network key:8fe7deea92943001567251dc1f9b0f03&lt;br /&gt;
&lt;br /&gt;
    Dev key:89c2f18f9f286661c6bbb1430d7aadb7&lt;br /&gt;
&lt;br /&gt;
    Provisioning completed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0x0000&amp;lt;/code&amp;gt;：网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;address 0x0001&amp;lt;/code&amp;gt;：Provisioner自身地址&lt;br /&gt;
* &amp;lt;code&amp;gt;Network key&amp;lt;/code&amp;gt;：网络层加密密钥&lt;br /&gt;
* &amp;lt;code&amp;gt;Dev key&amp;lt;/code&amp;gt;：设备专属配置密钥&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤3：打开广播 ====&lt;br /&gt;
执行以下命令：&lt;br /&gt;
 blemesh_beacon_listen 0x01  # 开启广播监听&lt;br /&gt;
&lt;br /&gt;
* 扫描周围广播Mesh信标的设备&lt;br /&gt;
* 捕获并显示未配网设备的UUID（如：&amp;lt;code&amp;gt;07af000011112222333318b905de96c2&amp;lt;/code&amp;gt;）&lt;br /&gt;
* UUID包含设备身份信息（厂商ID、产品ID等）&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤4：在配网器设备上执行 添加设备到网络命令 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_provision_adv 07af000011112222333318b905de96c2 0 3 0&lt;br /&gt;
#输出&lt;br /&gt;
    P1：“07af000011112222333318b905de96c2&amp;quot; is UUID information.&lt;br /&gt;
    P2：0：net_idx&lt;br /&gt;
    P3：3： assign node unicast address。&lt;br /&gt;
    P4：0：attention_duration&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;UUID&amp;lt;/code&amp;gt;：目标设备的唯一标识&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0&amp;lt;/code&amp;gt;：使用的网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;address 3&amp;lt;/code&amp;gt;：分配给设备的单播地址(0x0003)&lt;br /&gt;
* &amp;lt;code&amp;gt;attention_duration 0&amp;lt;/code&amp;gt;：配网指示时长（0=无提示）&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤5：获取设备信息 ====&lt;br /&gt;
执行的命令与输出内容：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt; blemesh_get_comp 0x0000 0x0003 0x00&lt;br /&gt;
#输出：&lt;br /&gt;
P1：net index.&lt;br /&gt;
&lt;br /&gt;
P2：dst address.&lt;br /&gt;
&lt;br /&gt;
P3：page number.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0x0000&amp;lt;/code&amp;gt;：网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;dst 0x0003&amp;lt;/code&amp;gt;：目标设备地址&lt;br /&gt;
* &amp;lt;code&amp;gt;page 0x00&amp;lt;/code&amp;gt;：组成数据页码&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤6：分配密钥key ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;  blemesh_app_key_add 0x0000 0x0003 0x0000 0x0000&lt;br /&gt;
#输出&lt;br /&gt;
P1：net index.&lt;br /&gt;
&lt;br /&gt;
P2：dst address.&lt;br /&gt;
&lt;br /&gt;
P3：Network key index。&lt;br /&gt;
&lt;br /&gt;
P4：Application key index.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== blemesh_simple ==&lt;br /&gt;
该demo的功能与上述的一致，但是该demo不需要前置的命令操作，在板子上电后会自动启动 blue mesh 网络，你可以参考blemesh_cli中的连接步骤直接进行节点连接。&lt;br /&gt;
&lt;br /&gt;
如果你需要发送指令来控制，你可以发送以下指令：&lt;br /&gt;
&lt;br /&gt;
&amp;quot;gen_cli_send dstaddress&amp;quot;将控制数据发送到指定的设备地址或这组地址。&lt;br /&gt;
&lt;br /&gt;
== btble_cli ==&lt;br /&gt;
该demo会启动一个基本的BLE设备。你需要使用命令去进行操控该设备。&lt;br /&gt;
&lt;br /&gt;
如果您不熟悉BLE的通信流程，请参考以下基本流程。&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#服务端执行&lt;br /&gt;
ble_init&lt;br /&gt;
ble_start_adv 0 0 0x80 0x80&lt;br /&gt;
&lt;br /&gt;
#客户端设备执行&lt;br /&gt;
ble_start_scan 0 1 0x80 0x50&lt;br /&gt;
&lt;br /&gt;
#scan后会获取到对应的地址 进行连接 这里是示例地址&lt;br /&gt;
#连接成功后 服务端的终端会显示  connected&lt;br /&gt;
ble_connect 0 B40ECF2E90FC          &lt;br /&gt;
&lt;br /&gt;
#查询GATT服务 这里是通用服务码&lt;br /&gt;
ble_discover 0 0x1800 0x1 0xffff 或者 ble_discover 0 0x1801 0x1 0xffff&lt;br /&gt;
&lt;br /&gt;
#如果要查询特殊码（这里可以省略这一步）&lt;br /&gt;
ble_discover 3 0x1800 0x1 0xffff&lt;br /&gt;
&lt;br /&gt;
#查询到服务后，可以选择直接读写：&lt;br /&gt;
ble_read 0x7 0&lt;br /&gt;
ble_write 0x7 0 2 0102&lt;br /&gt;
&lt;br /&gt;
#也可以通过CCC进行订阅操作&lt;br /&gt;
ble_subscribe 0x4 0x3 0x1  &lt;br /&gt;
#取消订阅：&lt;br /&gt;
ble_unsubscribe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&amp;lt;big&amp;gt;上述的函数相关具体说明，全部保存在SDK的路径下： docs/en/api_reference/ble.rst&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;BLE基本通信流程：&#039;&#039;&#039;                                                                                                                                                       &#039;&#039;&#039;GATT服务是什么：&#039;&#039;&#039; ===&lt;br /&gt;
[[文件:BLE.png|链接=https://docs.bouffalolab.com/%E6%96%87%E4%BB%B6:BLE.png|左|450x450像素]]&lt;br /&gt;
[[文件:GATT.png|链接=https://docs.bouffalolab.com/%E6%96%87%E4%BB%B6:GATT.png|居中|450x450像素]]&lt;br /&gt;
CCC则是一个订阅开关，本质上是一个数值，服务端会监控这个数值，假设该数值变化了，那么服务端则认为连接设备需要订阅消息。&lt;br /&gt;
&lt;br /&gt;
== btble_controller_test ==&lt;br /&gt;
BLE控制器测试demo,终端返回 pwr_mod is  bf 则表示正常。&lt;br /&gt;
&lt;br /&gt;
== btble_central ==&lt;br /&gt;
该demo上电后会直接自动扫描周围的BLE设备，当设备存在并且名称匹配时，会直接进行连接并扫描对应的GATT服务然后进行订阅。&lt;br /&gt;
&lt;br /&gt;
设备名称，GATT服务等都是程序提前设定好的，这部分设定在同级目录下的 config.h 文件中。&lt;br /&gt;
&lt;br /&gt;
这里展示一部分 ：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#endif &lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*  CONFIG_BT_DEVICE_NAME:Bluetooth device name. Name can be up&lt;br /&gt;
*  to 248 bytes long (excluding NULL termination). Can be empty string&lt;br /&gt;
*/&lt;br /&gt;
#ifndef CONFIG_BT_DEVICE_NAME&lt;br /&gt;
#if defined(CONFIG_AUTO_PTS)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;AUTO_PTS_TEST0123456789012345&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#if defined(BL602)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL602-BLE-DEV&amp;quot;&lt;br /&gt;
#elif defined(BL702)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL702-BLE-DEV&amp;quot;&lt;br /&gt;
#elif defined(BL702L)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL702L-BLE-DEV&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BTBLE-DEV&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
/**&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== btble_periphral ==&lt;br /&gt;
该demo测试了BLE的OAD服务，上电后会直接执行GATT的OAD服务注册，然后进行广播，所有了连接上该服务端的设备订阅OAD服务都可以进行OAD远程升级。&lt;br /&gt;
&lt;br /&gt;
注意这部分代码需要分区表，所以在烧录时必须进行 make whole 将分区表信息烧录进去。&lt;br /&gt;
&lt;br /&gt;
OAD烧录的固件需要手动生成：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#其中FW.bin 是你要进行升级的bin&lt;br /&gt;
python3 components/wireless/bluetooth/tools/GenerateOAD.py FW.bin FW.bin.sha256&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Btble&amp;diff=108</id>
		<title>Demo:Btble</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Btble&amp;diff=108"/>
		<updated>2025-07-29T09:07:15Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Demo介绍： ==&lt;br /&gt;
&#039;&#039;&#039;这部分Demo主要是蓝牙通讯相关功能的实例代码，这些demo保存在SDK的 example/btble路径下。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== blemesh_cli: ==&lt;br /&gt;
&lt;br /&gt;
=== 基本介绍： ===&lt;br /&gt;
该demo创建了一个 Bluetooth mesh 网络，通过向串口发送指令进行初始化后，就可以通过手机APP在mesh网络中进行添加并连接。&lt;br /&gt;
&lt;br /&gt;
DEMO命令和输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_init              #初始化bluemesh网络&lt;br /&gt;
#输出：&lt;br /&gt;
Init successfully &lt;br /&gt;
Env[LOCAL_NAME] Data len[10], setting_env_cb&lt;br /&gt;
Use pb-adv or pb-gatt to enable advertising&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_pb 2 1            &lt;br /&gt;
#输出：&lt;br /&gt;
PB-GATT enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;执行完上述命令后，就可以使用手机APP进行NODE的添加和连接。&lt;br /&gt;
&lt;br /&gt;
添加的步骤如下：&amp;lt;gallery&amp;gt;&lt;br /&gt;
文件:APPopen.png|step1&lt;br /&gt;
文件:Meshnode2.png|step2&lt;br /&gt;
文件:Meshnode3.png|step3&lt;br /&gt;
文件:Meshnode4.png|step4&lt;br /&gt;
文件:Meshnode5.png|step5&lt;br /&gt;
文件:Meshnode6.png|ste6&lt;br /&gt;
文件:Meshnode7.png|step7&lt;br /&gt;
文件:Meshnode8.png|step8&lt;br /&gt;
文件:Meshnode9.png|step9&lt;br /&gt;
文件:Meshnode10.png|step10&lt;br /&gt;
文件:Meshnode11.png|step11&lt;br /&gt;
文件:Meshnode12.png|step12&lt;br /&gt;
文件:Meshnode13.png|step13&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 如何使用配网器 Provisioner 将新设备添加进网络中： ===&lt;br /&gt;
大概流程如下：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.打开未配网设备 ---- 2.启动配网器Provisioner ---- 3.监听设备广播 ---- 4.添加设备到网络 ---- 5.获取设备信息 ---- 6.分配密钥&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
provisioner设备编译时，必须更改一个编译选项：&lt;br /&gt;
&lt;br /&gt;
CONFIG_BT_MESH_PROVISIONER=1&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤1：打开未配网设备并且输入以下命令： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
blemesh_init        # 初始化Mesh协议栈&lt;br /&gt;
blemesh_pb 1 1      # 开启PB-ADV和PB-GATT配网承载&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤2： 打开配网器设备输入以下命令： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_pvnr_init             #初始化Provisioner&lt;br /&gt;
#得到输出：&lt;br /&gt;
    .........&lt;br /&gt;
    Local node provisioned, net_idx 0x0000 address 0x0001&lt;br /&gt;
&lt;br /&gt;
    Network key:8fe7deea92943001567251dc1f9b0f03&lt;br /&gt;
&lt;br /&gt;
    Dev key:89c2f18f9f286661c6bbb1430d7aadb7&lt;br /&gt;
&lt;br /&gt;
    Provisioning completed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0x0000&amp;lt;/code&amp;gt;：网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;address 0x0001&amp;lt;/code&amp;gt;：Provisioner自身地址&lt;br /&gt;
* &amp;lt;code&amp;gt;Network key&amp;lt;/code&amp;gt;：网络层加密密钥&lt;br /&gt;
* &amp;lt;code&amp;gt;Dev key&amp;lt;/code&amp;gt;：设备专属配置密钥&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤3：打开广播 ====&lt;br /&gt;
执行以下命令：&lt;br /&gt;
 blemesh_beacon_listen 0x01  # 开启广播监听&lt;br /&gt;
&lt;br /&gt;
* 扫描周围广播Mesh信标的设备&lt;br /&gt;
* 捕获并显示未配网设备的UUID（如：&amp;lt;code&amp;gt;07af000011112222333318b905de96c2&amp;lt;/code&amp;gt;）&lt;br /&gt;
* UUID包含设备身份信息（厂商ID、产品ID等）&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤4：在配网器设备上执行 添加设备到网络命令 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_provision_adv 07af000011112222333318b905de96c2 0 3 0&lt;br /&gt;
#输出&lt;br /&gt;
    P1：“07af000011112222333318b905de96c2&amp;quot; is UUID information.&lt;br /&gt;
    P2：0：net_idx&lt;br /&gt;
    P3：3： assign node unicast address。&lt;br /&gt;
    P4：0：attention_duration&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;UUID&amp;lt;/code&amp;gt;：目标设备的唯一标识&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0&amp;lt;/code&amp;gt;：使用的网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;address 3&amp;lt;/code&amp;gt;：分配给设备的单播地址(0x0003)&lt;br /&gt;
* &amp;lt;code&amp;gt;attention_duration 0&amp;lt;/code&amp;gt;：配网指示时长（0=无提示）&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤5：获取设备信息 ====&lt;br /&gt;
执行的命令与输出内容：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt; blemesh_get_comp 0x0000 0x0003 0x00&lt;br /&gt;
#输出：&lt;br /&gt;
P1：net index.&lt;br /&gt;
&lt;br /&gt;
P2：dst address.&lt;br /&gt;
&lt;br /&gt;
P3：page number.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0x0000&amp;lt;/code&amp;gt;：网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;dst 0x0003&amp;lt;/code&amp;gt;：目标设备地址&lt;br /&gt;
* &amp;lt;code&amp;gt;page 0x00&amp;lt;/code&amp;gt;：组成数据页码&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤6：分配密钥key ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;  blemesh_app_key_add 0x0000 0x0003 0x0000 0x0000&lt;br /&gt;
#输出&lt;br /&gt;
P1：net index.&lt;br /&gt;
&lt;br /&gt;
P2：dst address.&lt;br /&gt;
&lt;br /&gt;
P3：Network key index。&lt;br /&gt;
&lt;br /&gt;
P4：Application key index.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== blemesh_simple ==&lt;br /&gt;
该demo的功能与上述的一致，但是该demo不需要前置的命令操作，在板子上电后会自动启动 blue mesh 网络，你可以参考blemesh_cli中的连接步骤直接进行节点连接。&lt;br /&gt;
&lt;br /&gt;
如果你需要发送指令来控制，你可以发送以下指令：&lt;br /&gt;
&lt;br /&gt;
&amp;quot;gen_cli_send dstaddress&amp;quot;将控制数据发送到指定的设备地址或这组地址。&lt;br /&gt;
&lt;br /&gt;
== btble_cli ==&lt;br /&gt;
该demo会启动一个基本的BLE设备。你需要使用命令去进行操控该设备。&lt;br /&gt;
&lt;br /&gt;
如果您不熟悉BLE的通信流程，请参考以下基本流程。&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#服务端执行&lt;br /&gt;
ble_init&lt;br /&gt;
ble_start_adv 0 0 0x80 0x80&lt;br /&gt;
&lt;br /&gt;
#客户端设备执行&lt;br /&gt;
ble_start_scan 0 1 0x80 0x50&lt;br /&gt;
&lt;br /&gt;
#scan后会获取到对应的地址 进行连接 这里是示例地址&lt;br /&gt;
#连接成功后 服务端的终端会显示  connected&lt;br /&gt;
ble_connect 0 B40ECF2E90FC          &lt;br /&gt;
&lt;br /&gt;
#查询GATT服务 这里是通用服务码&lt;br /&gt;
ble_discover 0 0x1800 0x1 0xffff 或者 ble_discover 0 0x1801 0x1 0xffff&lt;br /&gt;
&lt;br /&gt;
#如果要查询特殊码（这里可以省略这一步）&lt;br /&gt;
ble_discover 3 0x1800 0x1 0xffff&lt;br /&gt;
&lt;br /&gt;
#查询到服务后，可以选择直接读写：&lt;br /&gt;
ble_read 0x7 0&lt;br /&gt;
ble_write 0x7 0 2 0102&lt;br /&gt;
&lt;br /&gt;
#也可以通过CCC进行订阅操作&lt;br /&gt;
ble_subscribe 0x4 0x3 0x1  &lt;br /&gt;
#取消订阅：&lt;br /&gt;
ble_unsubscribe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&amp;lt;big&amp;gt;上述的函数相关具体说明，全部保存在SDK的路径下： docs/en/api_reference/ble.rst&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BLE基本通信流程：&#039;&#039;&#039;                                                                                                                                                       &#039;&#039;&#039;GATT服务是什么：&#039;&#039;&#039;&lt;br /&gt;
[[文件:BLE.png|链接=https://docs.bouffalolab.com/%E6%96%87%E4%BB%B6:BLE.png|左|450x450像素]]&lt;br /&gt;
[[文件:GATT.png|链接=https://docs.bouffalolab.com/%E6%96%87%E4%BB%B6:GATT.png|居中|450x450像素]]&lt;br /&gt;
CCC则是一个订阅开关，本质上是一个数值，服务端会监控这个数值，假设该数值变化了，那么服务端则认为连接设备需要订阅消息。&lt;br /&gt;
&lt;br /&gt;
== btble_controller_test ==&lt;br /&gt;
BLE控制器测试demo,终端返回 pwr_mod is  bf 则表示正常。&lt;br /&gt;
&lt;br /&gt;
== btble_central ==&lt;br /&gt;
该demo上电后会直接自动扫描周围的BLE设备，当设备存在并且名称匹配时，会直接进行连接并扫描对应的GATT服务然后进行订阅。&lt;br /&gt;
&lt;br /&gt;
设备名称，GATT服务等都是程序提前设定好的，这部分设定在同级目录下的 config.h 文件中。&lt;br /&gt;
&lt;br /&gt;
这里展示一部分 ：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#endif &lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*  CONFIG_BT_DEVICE_NAME:Bluetooth device name. Name can be up&lt;br /&gt;
*  to 248 bytes long (excluding NULL termination). Can be empty string&lt;br /&gt;
*/&lt;br /&gt;
#ifndef CONFIG_BT_DEVICE_NAME&lt;br /&gt;
#if defined(CONFIG_AUTO_PTS)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;AUTO_PTS_TEST0123456789012345&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#if defined(BL602)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL602-BLE-DEV&amp;quot;&lt;br /&gt;
#elif defined(BL702)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL702-BLE-DEV&amp;quot;&lt;br /&gt;
#elif defined(BL702L)&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BL702L-BLE-DEV&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#define CONFIG_BT_DEVICE_NAME &amp;quot;BTBLE-DEV&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
/**&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== btble_periphral ==&lt;br /&gt;
该demo测试了BLE的OAD服务，上电后会直接执行GATT的OAD服务注册，然后进行广播，所有了连接上该服务端的设备订阅OAD服务都可以进行OAD远程升级。&lt;br /&gt;
&lt;br /&gt;
注意这部分代码需要分区表，所以在烧录时必须进行 make whole 将分区表信息烧录进去。&lt;br /&gt;
&lt;br /&gt;
OAD烧录的固件需要手动生成：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#其中FW.bin 是你要进行升级的bin&lt;br /&gt;
python3 components/wireless/bluetooth/tools/GenerateOAD.py FW.bin FW.bin.sha256&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E6%96%87%E4%BB%B6:GATT.png&amp;diff=107</id>
		<title>文件:GATT.png</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E6%96%87%E4%BB%B6:GATT.png&amp;diff=107"/>
		<updated>2025-07-29T07:00:25Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;。&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E6%96%87%E4%BB%B6:BLE.png&amp;diff=106</id>
		<title>文件:BLE.png</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E6%96%87%E4%BB%B6:BLE.png&amp;diff=106"/>
		<updated>2025-07-29T06:57:46Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;通信大致宏观流程&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E7%94%A8%E6%88%B7:%E6%AD%A6%E6%A5%B7%E8%BD%A9&amp;diff=105</id>
		<title>用户:武楷轩</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E7%94%A8%E6%88%B7:%E6%AD%A6%E6%A5%B7%E8%BD%A9&amp;diff=105"/>
		<updated>2025-07-28T07:39:55Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is kxwu.&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=%E7%94%A8%E6%88%B7:%E6%AD%A6%E6%A5%B7%E8%BD%A9&amp;diff=104</id>
		<title>用户:武楷轩</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=%E7%94%A8%E6%88%B7:%E6%AD%A6%E6%A5%B7%E8%BD%A9&amp;diff=104"/>
		<updated>2025-07-28T07:39:20Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​创建页面，内容为“this is kxwu”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;this is kxwu&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:wifi_sta&amp;diff=103</id>
		<title>Demo:wifi sta</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:wifi_sta&amp;diff=103"/>
		<updated>2025-07-23T07:37:22Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=== 基本介绍： ===&lt;br /&gt;
该系列demo存放在SDK 的路径为：bouffalo_sdk/examples/wifi/sta 。&lt;br /&gt;
&lt;br /&gt;
该系列代码需要将开发板作为STA节点连接到WiFi或者路由器后进行一些基本的通讯数据功能性测试。&lt;br /&gt;
&lt;br /&gt;
以下该系列demo的基本功能说明。&lt;br /&gt;
&lt;br /&gt;
=== MQTT相关Demo说明： ===&lt;br /&gt;
&lt;br /&gt;
==== wifi_mqtt_pub： ====&lt;br /&gt;
该demo将开发板作为mqtt中的publisher,向节点内发布主题信息。&lt;br /&gt;
&lt;br /&gt;
要测试该节点需要以下前置：&lt;br /&gt;
&lt;br /&gt;
1.建立一个mqtt服务器&lt;br /&gt;
&lt;br /&gt;
2.使用mqttbox或者其他相关工具从服务器上订阅对应的主题。&lt;br /&gt;
&lt;br /&gt;
3.可以向串口发送指令。&lt;br /&gt;
&lt;br /&gt;
建议本地下载mosquito,在本地搭建一个mqtt服务器，或者使用emqX公用服务器。该案例的defult server是：`test.mosquitto.org:1883`&lt;br /&gt;
&lt;br /&gt;
向串口发送指令连接WIFI并订阅：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
wifi_sta_connect your_wifi_id your_passwd&lt;br /&gt;
&lt;br /&gt;
mqtts_pub $local_ip 8883   #mqtt_pub  如果不带参数会默认发送到上述的公有服务器&lt;br /&gt;
&lt;br /&gt;
#会得到以下输出：&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;mqtt_pub is ready to begin publishing the time.&lt;br /&gt;
Press ENTER to publish the current time.&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
mqtt_pub published : &amp;quot;{&amp;quot;hello mqtt by bl616/8 !&amp;quot;}&lt;br /&gt;
Now time is 2023-06-16 00:00:00&amp;quot;&lt;br /&gt;
mqtt_pub published : &amp;quot;{&amp;quot;hello mqtt by bl616/8 !&amp;quot;}&lt;br /&gt;
Now time is 2023-06-16 00:00:03&amp;quot;&lt;br /&gt;
mqtt_pub stop publish to test.mosquitto.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;订阅方会受到当前时间的字符串。&lt;br /&gt;
&lt;br /&gt;
==== wifi_mqtt_sub: ====&lt;br /&gt;
和上述一样，但是该案例是submiter ，也就是消息订阅方。&lt;br /&gt;
&lt;br /&gt;
前置条件：同上。&lt;br /&gt;
&lt;br /&gt;
同样向串口发送指令来验证：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect your_wifi_id your_pwd&lt;br /&gt;
bouffalolab /&amp;gt;mqtt_sub your_server &amp;lt;port&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#得到输出&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;mqtt_sub listening for &#039;&amp;lt;theme&amp;gt;&#039; messages.&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
Received publish(&#039;&amp;lt;theme&amp;gt;&#039;):  {&amp;quot;hello mqtt&amp;quot;}&lt;br /&gt;
Received publish(&#039;&amp;lt;theme&amp;gt;&#039;):  {&amp;quot;hello mqtt&amp;quot;}&lt;br /&gt;
mqtt_sub disconnecting from xxx.your_server&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MQTTS功能： ====&lt;br /&gt;
&#039;&#039;&#039;上述的两个Demo现已支持TLS加密功能&#039;&#039;&#039;，该加密使用&#039;&#039;&#039;TLS1.2&#039;&#039;&#039;加密套件，未验证 CN name。&lt;br /&gt;
&lt;br /&gt;
开启MQTT的选项在对应文件夹中的CmakeList中：&amp;lt;syntaxhighlight lang=&amp;quot;makefile&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
cmake_minimum_required(VERSION 3.15)&lt;br /&gt;
&lt;br /&gt;
include(proj.conf)&lt;br /&gt;
&lt;br /&gt;
find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE})&lt;br /&gt;
&lt;br /&gt;
# User&lt;br /&gt;
sdk_add_compile_definitions(-DCONFIG_CLI_CMD_ENABLE)&lt;br /&gt;
# sdk_add_compile_options(-DMQTT_USE_CUSTOM_SOCKET_HANDLE)&lt;br /&gt;
# sdk_add_compile_definitions(-DMBEDTLS_PK_PARSE_C)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sdk_add_compile_options(-DMQTT_USE_MBEDTLS)     #注释该行则不启用TLS加密，否则加密。&lt;br /&gt;
&lt;br /&gt;
target_sources(app PRIVATE&lt;br /&gt;
                   wifi_mqtt_pub.c)&lt;br /&gt;
&lt;br /&gt;
sdk_add_include_directories(.)&lt;br /&gt;
&lt;br /&gt;
sdk_set_main_file(main.c)&lt;br /&gt;
&lt;br /&gt;
project(wifi_mqtt_publisher)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 其中的CA证书，密钥等具体为： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#ca.crt：&lt;br /&gt;
-----BEGIN CERTIFICATE-----&lt;br /&gt;
MIIDwzCCAqugAwIBAgIUT2Cy6wsGGycw6WvNoHot5I+GlTQwDQYJKoZIhvcNAQEL&lt;br /&gt;
BQAwcTELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0Jl&lt;br /&gt;
aWppbmcxDzANBgNVBAoMBk15IE9yZzEWMBQGA1UECwwNQ0EgRGVwYXJ0bWVudDEV&lt;br /&gt;
MBMGA1UEAwwMTVFUVCBSb290IENBMB4XDTI1MDcxNzEwMzU1MVoXDTM1MDcxNTEw&lt;br /&gt;
MzU1MVowcTELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcM&lt;br /&gt;
B0JlaWppbmcxDzANBgNVBAoMBk15IE9yZzEWMBQGA1UECwwNQ0EgRGVwYXJ0bWVu&lt;br /&gt;
dDEVMBMGA1UEAwwMTVFUVCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A&lt;br /&gt;
MIIBCgKCAQEAzMguxj26xEFb1N5u6slSgEp62eak+dqkmq6BoxVW48V2GO62caCt&lt;br /&gt;
n7MZywknnKm1sFM9kOv/mdr4fjHF3ZhvZ4MCqu0EPy2crjROoV8ofsjMDoIp2PSh&lt;br /&gt;
VZ7wmDC5zu7ndCMX85C/vv3Ikows5sMr/r6Ieh7lgoLeXTFDbGixLM3u1vB2I/OQ&lt;br /&gt;
gepYnPVkUHmEWsRFtzwwBgbAkSlmf3UreCT/lDbcOsKGl3YY4PZtJjk3wwtJqLAE&lt;br /&gt;
M/dNJdleU9ENwwelotScu4CGex+OaPNfn1EwLgwBrX2FByYyfpw+DUTnhdXsPbGM&lt;br /&gt;
jly24NUcg7CavTJxow5ltuWLahN5oQZZ4wIDAQABo1MwUTAdBgNVHQ4EFgQUGIBW&lt;br /&gt;
MZwM5z40nEZde/GSQxszsDEwHwYDVR0jBBgwFoAUGIBWMZwM5z40nEZde/GSQxsz&lt;br /&gt;
sDEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEALp0qj9qWnc9l&lt;br /&gt;
9GWivdOHVSfIHWWuTUN7+2QXGEHZ7vyC6dPoMNvr0Wg35Wj3VLbmZm6vlIubQ0JW&lt;br /&gt;
3nt5Kru9Keh/BALAxFa6onRVdYahXWRzD1fjTMUfIpDjaRtFWE6luA3ztfj2ZtiL&lt;br /&gt;
q665MZulKQLFhIQeAXNfR7hpxaiR+qu5YVYvWQN7gigjB787Y+JUk+h3rnlZ5vPX&lt;br /&gt;
j/yf9BP2u9tK1VkF2Ir1c+Y0xcp0qomd25QOm0H/qwgEh5wnO3du8GrTS5WMlYq1&lt;br /&gt;
LJSLM7dmBKgvTPngAgewFiwNPyhtywM6Vdc/mrcNwqAcfmyV0U8oU/DReKbX4ed2&lt;br /&gt;
+zlke05LKA==&lt;br /&gt;
-----END CERTIFICATE-----&lt;br /&gt;
&lt;br /&gt;
#ca.key：&lt;br /&gt;
-----BEGIN PRIVATE KEY-----&lt;br /&gt;
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDMyC7GPbrEQVvU&lt;br /&gt;
3m7qyVKASnrZ5qT52qSaroGjFVbjxXYY7rZxoK2fsxnLCSecqbWwUz2Q6/+Z2vh+&lt;br /&gt;
McXdmG9ngwKq7QQ/LZyuNE6hXyh+yMwOginY9KFVnvCYMLnO7ud0IxfzkL++/ciS&lt;br /&gt;
jCzmwyv+voh6HuWCgt5dMUNsaLEsze7W8HYj85CB6lic9WRQeYRaxEW3PDAGBsCR&lt;br /&gt;
KWZ/dSt4JP+UNtw6woaXdhjg9m0mOTfDC0mosAQz900l2V5T0Q3DB6Wi1Jy7gIZ7&lt;br /&gt;
H45o81+fUTAuDAGtfYUHJjJ+nD4NROeF1ew9sYyOXLbg1RyDsJq9MnGjDmW25Ytq&lt;br /&gt;
E3mhBlnjAgMBAAECggEAJTvQpWLb7osjs1SuPipUwdbI942kOXmzrBxGnexnXAqv&lt;br /&gt;
KmFc8tQQPZVG/0+u0CFbU7AO5abDVqolvGw4Wc45k0yS05k8yG/2qQYBtf2jU0oX&lt;br /&gt;
MBwil7wDCZpYjJNvdVyi4M7wr+yFsKhcK6kpENwzx6HFFs8/U7ePzsoCRFfUvxxu&lt;br /&gt;
26rKP0rF5168DCTn8UMyYqEdPQ9MOD2xI6hPsJVelqu7eWRXAWrFgVH5L+xgd0mH&lt;br /&gt;
MhtidnvayrUKt5eE+FifZN9QK2rgJ9lppGw9bPANSOQ+K1O7F+HIOwSCXCD2hM2t&lt;br /&gt;
bHaQfeLfOeu32MlOMcGQIcQGqwWpI9XHWQBJO9OcgQKBgQD5azAYDJL/jRxaN4o+&lt;br /&gt;
1QXOBRuimKNT4XDDyoPA0j6uwcXQa6LbhxPAack2ocyXm4O+g/wySiO/tnPoaNUH&lt;br /&gt;
WGppGdnGuqX+JAK/35GsNb30BCXb0Gkz/bijTSm3fNKg63ZTREZlJ/KTH8/4bM+p&lt;br /&gt;
B6FIO2g+oREjvVI6pRlBiLF70wKBgQDSL3nGHRzo6FSUjGmZBJ9f7koylYT7QuE8&lt;br /&gt;
mLoHG4fMoYaVDZk8eY10Xc9gL79aO4Uf98N004qbfL5QcbCgi5DBwrrIE1eInq0Y&lt;br /&gt;
CNKtfySzg2sdCG8Ex3fhtZZyOljlc4bckTj4gmGgCuNUDhPo+k2roskSoXo0G3T/&lt;br /&gt;
gFLFHJwvsQKBgG3UqIH+j4Ce59xGVsciUQMOtsObyVg3jst40xnGuzmDNJN5wmY/&lt;br /&gt;
DhCNxMAc8ZXVMmdjgVu30BQsyM+P0jcA1SLg8kgTiuLlgpxxW5lktPfOF8m69Yii&lt;br /&gt;
cnrekL8u5SVdamZySzliJOxqds8jQzJgnMHM/zONA5okVSBj8UItalJnAoGBAM8F&lt;br /&gt;
8hSfwkTp6b0zHCOauPv9MlnmicgOVNmhuMGdbUGx62ROs5ssQpbWe5bLENfofjRB&lt;br /&gt;
juQ4JHMICFAl2woWzar7iYvd+T7Yw7dDoXdAHz8td0hucSMs8TiA6kFylPLTuobw&lt;br /&gt;
B0RG7696afT1tMiqGeyvdwuBv2MplDDBDUWW64PRAoGAXmCqgu4AgKDrg/BsKCH3&lt;br /&gt;
070IxOXc+7tVdESmWyexDyNUfBCF+6Kowl1Kw3IgIcywA19sKK2msykyIy0Om+rM&lt;br /&gt;
EaZfHaspt9srWNlzDsPy6nV5dkXZcSezKVXxJgriDk46sPlEBNKGrYPbNmSYpvrY&lt;br /&gt;
NKgGQaYrJ5ixe1aEARcF2CE=&lt;br /&gt;
-----END PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
#server.crt：&lt;br /&gt;
-----BEGIN CERTIFICATE-----&lt;br /&gt;
MIID6zCCAtOgAwIBAgIUYSb6OOUA1AaPPfdB/QhCrJFxYfIwDQYJKoZIhvcNAQEL&lt;br /&gt;
BQAwcTELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0Jl&lt;br /&gt;
aWppbmcxDzANBgNVBAoMBk15IE9yZzEWMBQGA1UECwwNQ0EgRGVwYXJ0bWVudDEV&lt;br /&gt;
MBMGA1UEAwwMTVFUVCBSb290IENBMB4XDTI1MDcyMjA2MDk0MVoXDTI2MDcyMjA2&lt;br /&gt;
MDk0MVowazELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcM&lt;br /&gt;
B0JlaWppbmcxDzANBgNVBAoMBk15IE9yZzENMAsGA1UECwwETVFUVDEYMBYGA1UE&lt;br /&gt;
AwwPMTkyLjE2OC4xNTMuMTE0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC&lt;br /&gt;
AQEAm1NDiGRlGbUKX938s9HFrTyprJ4fhjHgmVZuqy0Hj5jX5Wvq7iPDXQHUuStN&lt;br /&gt;
9rIMB31K8h8gBfTbWTALQnL/p5urvBACvLI8J3BEz8pweq61sUeqBNGFO8YnxRou&lt;br /&gt;
vRPUeel9zg4GbLIf4T6BfwKtgMoqX/ROnnUiuE8sdo/KCreB5we+ZriP+jS1gVSQ&lt;br /&gt;
NMiJFXbo08aEV8WefuQnTegjgooEbFpeq7dtHXKiDiHW5LUCj6TUGh1DcKVvlSTa&lt;br /&gt;
ur7SMCvADT0W4Mp8Q9VXFCGwJugwy6pmtOqnPHEEBxs+1EGX22XeGS6ccP5HH2bm&lt;br /&gt;
yJ1gSLI+yt0r+T0cMTsoeBR2EQIDAQABo4GAMH4wCQYDVR0TBAIwADALBgNVHQ8E&lt;br /&gt;
BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0RBAgwBocEwKiZcjAdBgNV&lt;br /&gt;
HQ4EFgQUW7r5PWIFPiDa1RcxhUUcMwMID3wwHwYDVR0jBBgwFoAUGIBWMZwM5z40&lt;br /&gt;
nEZde/GSQxszsDEwDQYJKoZIhvcNAQELBQADggEBAKWlIJWaDzhhbBy9ftUkGIis&lt;br /&gt;
EDjMvmLnkFchFFNAOWZq1yBujf3K0KqcmdgKfSearMQrK/YTHR1a39P21BSqnRpk&lt;br /&gt;
dfNZfiVvRkJAcdY9SgderklUmPoY9huxumtGEPDtrkxkyuhgpk7/9YyavgyMCMdd&lt;br /&gt;
cFIwdeBUEHPhHLw8TlhVT1UotClKbhjyRHOMrpfWXVnsa+U/UrPeqGn8uL49XPH4&lt;br /&gt;
9DqzKZPSZaPxNoAj0iHvo+7RvEl5jy+ixwRgnvdOsDteRwFFW0Kxd4Ccn4QKEgTY&lt;br /&gt;
chx6XC0/a2Lg8KwxZbmDGoj4sqJ3PltuG8GZB6Vdv0FJnjAK6cZAQE0Hyclhhbs=&lt;br /&gt;
-----END CERTIFICATE-----&lt;br /&gt;
&lt;br /&gt;
#server.key：&lt;br /&gt;
-----BEGIN PRIVATE KEY-----&lt;br /&gt;
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCbU0OIZGUZtQpf&lt;br /&gt;
3fyz0cWtPKmsnh+GMeCZVm6rLQePmNfla+ruI8NdAdS5K032sgwHfUryHyAF9NtZ&lt;br /&gt;
MAtCcv+nm6u8EAK8sjwncETPynB6rrWxR6oE0YU7xifFGi69E9R56X3ODgZssh/h&lt;br /&gt;
PoF/Aq2Ayipf9E6edSK4Tyx2j8oKt4HnB75muI/6NLWBVJA0yIkVdujTxoRXxZ5+&lt;br /&gt;
5CdN6COCigRsWl6rt20dcqIOIdbktQKPpNQaHUNwpW+VJNq6vtIwK8ANPRbgynxD&lt;br /&gt;
1VcUIbAm6DDLqma06qc8cQQHGz7UQZfbZd4ZLpxw/kcfZubInWBIsj7K3Sv5PRwx&lt;br /&gt;
Oyh4FHYRAgMBAAECgf8CjFso4a/6ImSix5sqi0Z/xEvRIsb7OW/cR1uJc2bfjdWW&lt;br /&gt;
h5Uf7Kl7EFltFq8ww1SiZGvWWd+TBj4sntBdRrjrBwkwpkXLn4ddHkc17k+Ds8B6&lt;br /&gt;
jn87lQE0LQwTlicuJiUjDhgCSWvRj+dcZEO7noLTzUoX4oPOFbd8G2oFuyL71s0l&lt;br /&gt;
4jO2poU42qsOxgBd2XIxePUc320/2a7Y0rABZJMLVx24oRzHqCLhyhRneqoqar0P&lt;br /&gt;
1hmS2tMeEr66db8U6Fr7J+P1SVt0KFSdrvEYCDHTCVf0TAZ25vYT69VznZGSok4U&lt;br /&gt;
YQkBQiFFuyGXLgiRfrX/aL7rYxj2KBRAbce/lUECgYEAyx1coRA+FyptMZLWh7ny&lt;br /&gt;
QSSq25/J7K+TPUMefIKFtKCmBRHg6gWu9YbTimXIOoq7l51xI+YT02VnEqjn9ToR&lt;br /&gt;
vkUlNRyHBzsDt2VQTH+00Slo0tn4NS9Sb8uMezHiUgKGjiQWPQqwzUG4ToG2cYkj&lt;br /&gt;
8+vcxyHK5CWkWEVjh/1sRRkCgYEAw8R9Zqic+nv+9wRV219bmqyeSw2SkDXIyQSM&lt;br /&gt;
tUBjqZHB1wh3Z+Tc0KdYSM9tymEwBJ5mx/nYxxF3gWXW0K4kuS1jtMFZscNaA2/1&lt;br /&gt;
VRweVXWBUlC/oZY1IEdLchtcQt3CfLIwQIKyikPwax0EU9YfQiTAiDNCAdBNJPF0&lt;br /&gt;
J/bMn7kCgYEAiBWbCxp7zz+Qu0cbTwJpafXsN4ueWWLlLoV6tocol/WOZhUtcP3v&lt;br /&gt;
0/bKYo6BEaADwbgtppSvMdJdtaXPC4ElhCqFnEkJuvFyMvzBSQ/DEORCpAp//vo+&lt;br /&gt;
rEJfU+b/MF0a078f2zP/cvYWSxsjJnxwxyt+1zgv3J3Pt4h+AA3t7XkCgYEAnCJh&lt;br /&gt;
VXgTQx+T2RUHGOBz4efck8VuaD/NNK3BP2nsUriiXcst2JnKl0tweRme2fMrZfOj&lt;br /&gt;
y8hz4UkIBBbh/it1tI8D34z56XIBn44yn7++XbBLBQjL3ac8FdNm08oIinftfqBr&lt;br /&gt;
JXhXxziqTfOlmOvEoG9JcxdWhLXKYTWFy73ls1kCgYEAsrPcSpF8Ce3r+izDW2TM&lt;br /&gt;
2M4arK3T7hcMItLAQQoLO7RCYIivgQQE0WV9BmbC0fVTkptDMfks5s7QcU/6vzqC&lt;br /&gt;
zPx0NowGnabNWS1vsXD4QyoOyV3gqfVhM46cWbRhxtRmMo/LGuJ8rXnHY3bgF5va&lt;br /&gt;
VJlSyLW96jWK9neR0QOTKM4=&lt;br /&gt;
-----END PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;将对应的证书和密钥保存到文件中，放在mosquitto的路径下。&#039;&#039;&#039;注意要将这些文件的所属组归给mosquitto.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
然后修改mosquito的配置文件 ，该文件储存在 /etc/mosquitto/mosquitto.conf 中，配置如下：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# Place your local configuration in /etc/mosquitto/conf.d/&lt;br /&gt;
#&lt;br /&gt;
# A full description of the configuration file is at&lt;br /&gt;
&lt;br /&gt;
log_dest file /var/log/mosquitto/mosquitto.log&lt;br /&gt;
&lt;br /&gt;
listener 8883&lt;br /&gt;
tls_version tlsv1.2&lt;br /&gt;
cafile /etc/mosquitto/certs/ca.crt&lt;br /&gt;
certfile /etc/mosquitto/certs/server.crt&lt;br /&gt;
keyfile /etc/mosquitto/certs/server.key&lt;br /&gt;
&lt;br /&gt;
listener 1883&lt;br /&gt;
allow_anonymous true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;mosquitto的测试命令：&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#测试sub是否能收到信息&lt;br /&gt;
mosquitto_pub -h localhost -p 8883 -t bl618  -m &amp;quot;aaa&amp;quot; --cafile ca.crt --insecure&lt;br /&gt;
&lt;br /&gt;
#测试pub是否能推送信息&lt;br /&gt;
mosquitto_sub -h localhost -p 8883 -t bl618 --cafile ca.crt --insecure&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTTP与HTTPS相关demo说明： ===&lt;br /&gt;
&lt;br /&gt;
==== wifi_http: ====&lt;br /&gt;
该demo会向网络服务器发送请求，根据返回结果判断http请求功能是否正常。&lt;br /&gt;
&lt;br /&gt;
前置条件为：一个可共上网的wifi,可以向串口发送指令。&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect your_wifi your_pwd&lt;br /&gt;
bouffalolab /&amp;gt;wifi_http_test www.xxx.com&lt;br /&gt;
&lt;br /&gt;
#以下为输出&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;Http client task start ...&lt;br /&gt;
Host:www.xxx.com, Server ip Address : the ip of websit server&lt;br /&gt;
Http client connect server success!&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== wifi_https: ====&lt;br /&gt;
该demo会自动发加密数据到www.baidu.com，根据结果判断加密功能是否正常&lt;br /&gt;
&lt;br /&gt;
前置条件：同上&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;wifi_https_test&lt;br /&gt;
bouffalolab /&amp;gt;dst_addr is 842C9824&lt;br /&gt;
&lt;br /&gt;
#以下为输出&lt;br /&gt;
[I: 124359488][bl_https.c:126]    HTTP/S&amp;gt; bouffalo connect fd = 0x62fd0dc0&lt;br /&gt;
[I: 124377783][bl_https.c:136]    HTTP/S&amp;gt; ret = -28&lt;br /&gt;
[I: 124598639][bl_https.c:156]    HTTP/S&amp;gt; ret = 0&lt;br /&gt;
[I: 124598987][bl_https.c:160]    HTTP/S&amp;gt; total time:471 ms&lt;br /&gt;
[I: 124679688][bl_https.c:168]    HTTP/S&amp;gt; rcv_ret = 1179&lt;br /&gt;
[I: 124680077][bl_https.c:172]    HTTP/S&amp;gt; proc_head_r 0, status_code 200, body_start_off 400&lt;br /&gt;
[I: 124680533][bl_https.c:180]    HTTP/S&amp;gt; Copy to resp @off 0, len 779, 1st char 3C&lt;br /&gt;
bl_TcpSslDisconnect end&lt;br /&gt;
[I: 124683390][bl_https.c:264]    HTTP/S&amp;gt; total time:555 ms&lt;br /&gt;
[I: 124683715][bl_https.c:265]    HTTP/S&amp;gt; test_1: status_code 200, resp_len 779&lt;br /&gt;
[I: 124684395][bl_https.c:267]    HTTP/S&amp;gt; resp body: &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;!--STATUS OK--&amp;gt;&amp;lt;html&amp;gt; &amp;lt;head&amp;gt;&amp;lt;meta http-equiv=content-type content=text/html;charset=utf-8&amp;gt;&amp;lt;meta http-equiv=X-UA-Compatible content=IE=Edge&amp;gt;&amp;lt;meta content=always name=referrer&amp;gt;&amp;lt;link rel=stylesheet type=text/css href=https://ss1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你想要更改测试服务器目标，可以在https.c源码中添加test,或者直接更改这部分代码：&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
static void test_1(void)&lt;br /&gt;
{&lt;br /&gt;
    const char *host = &amp;quot;www.baidu.com&amp;quot;;&lt;br /&gt;
    const uint8_t send_buf[] = &amp;quot;GET / HTTP/1.1\r\n&amp;quot;&lt;br /&gt;
                               &amp;quot;Host: www.baidu.com\r\n&amp;quot;&lt;br /&gt;
                               &amp;quot;User-Agent: curl/7.58.0\r\n&amp;quot;&lt;br /&gt;
                               &amp;quot;accept: application/json\r\n&amp;quot;&lt;br /&gt;
                               &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    uint8_t *buf;&lt;br /&gt;
    int resp_len;&lt;br /&gt;
    int status_code;&lt;br /&gt;
&lt;br /&gt;
    buf = malloc(16 * 1024);&lt;br /&gt;
    if (NULL == buf) {&lt;br /&gt;
        LOG_E(&amp;quot;malloc\r\n&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    resp_len = 16 * 1024;&lt;br /&gt;
&lt;br /&gt;
    uint32_t start_time = 0, stop_time = 0;&lt;br /&gt;
    start_time = xTaskGetTickCount();&lt;br /&gt;
    status_code = https_request(host, 443, send_buf, sizeof(send_buf) - 1, buf, &amp;amp;resp_len);&lt;br /&gt;
    stop_time = xTaskGetTickCount();&lt;br /&gt;
&lt;br /&gt;
    LOG_I(&amp;quot;total time:%d ms\r\n&amp;quot;, (stop_time - start_time));&lt;br /&gt;
    LOG_I(&amp;quot;test_1: status_code %d, resp_len %d\r\n&amp;quot;, status_code, resp_len);&lt;br /&gt;
    buf[resp_len] = &#039;\0&#039;;&lt;br /&gt;
    LOG_I(&amp;quot;resp body: %s\r\n&amp;quot;, buf);&lt;br /&gt;
&lt;br /&gt;
    free(buf);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;上述函数被调用用来执行测试，更改该部分代码可以实现更改测试目标的目的。&lt;br /&gt;
&lt;br /&gt;
=== TCP的Demo说明： ===&lt;br /&gt;
&lt;br /&gt;
==== wifi_tcp: ====&lt;br /&gt;
该部分代码编写了一个server.c和一个client.c,分别用于测试TCP服务端测试和客户端测试。&lt;br /&gt;
&lt;br /&gt;
前置条件：PC端和开发板共同在一个局域网内，可以向串口发送指令。&lt;br /&gt;
&lt;br /&gt;
使用picocom工具在串口中执行指令。&lt;br /&gt;
&lt;br /&gt;
server测试：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect your_wifi_id your_wifi_pwd&lt;br /&gt;
bouffalolab /&amp;gt;wifi_tcp_echo_test 3365&lt;br /&gt;
&lt;br /&gt;
#服务器建立成功&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;tcp server task start ...&lt;br /&gt;
Server ip Address : 0.0.0.0:3365&lt;br /&gt;
&lt;br /&gt;
# 执行 nc -v ipaddr port 连接板子的tcp服务器&lt;br /&gt;
&lt;br /&gt;
new client connected from (192.168.1.2, 57480)&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
recv 7 len data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;client测试：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#首先执行 nc -l -p 3365 在本地架起一个服务器&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect BL_TEST 12345678&lt;br /&gt;
bouffalolab /&amp;gt;wifi_tcp_test localip 3365&lt;br /&gt;
&lt;br /&gt;
#输出&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;tcp client task start ...&lt;br /&gt;
Server ip Address : 192.168.1.2:3365&lt;br /&gt;
TCP client connect server success!&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== UDP的demo说明： ===&lt;br /&gt;
该部分代码将使用开发板作为sta节点连接wifi并且架起一个udp服务器。&lt;br /&gt;
&lt;br /&gt;
前置条件：PC端和开发板在同一个局域网内，可以向串口发送指令。&lt;br /&gt;
&lt;br /&gt;
测试过程：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#连接开发板终端并发送指令&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect your_wifi_id 12345678&lt;br /&gt;
bouffalolab /&amp;gt;wifi_udp_echo 3365&lt;br /&gt;
bouffalolab /&amp;gt;udp server task start ...&lt;br /&gt;
&lt;br /&gt;
#服务其成功架起输出&lt;br /&gt;
ip Address : ip:3365&lt;br /&gt;
udp bind port success!&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
&lt;br /&gt;
#在PC端执行  nc -u server_ip server_port&lt;br /&gt;
#直接发送 1234567890&lt;br /&gt;
&lt;br /&gt;
#成功接受到数据&lt;br /&gt;
recv from 192.168.1.2&lt;br /&gt;
recv:X&lt;br /&gt;
recv from 192.168.1.2&lt;br /&gt;
recv:X&lt;br /&gt;
recv from 192.168.1.2&lt;br /&gt;
recv:X&lt;br /&gt;
recv from 192.168.1.2&lt;br /&gt;
recv:X&lt;br /&gt;
recv from 192.168.1.2&lt;br /&gt;
recv:1234567890&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OTA的demo说明： ===&lt;br /&gt;
&lt;br /&gt;
==== wifi_ota： ====&lt;br /&gt;
该部分代码测试了基本tcp升级固件，使用pc端作为服务器，在同一局域网下，通过命令使得开发板连接ota服务器，接收固件包。&lt;br /&gt;
&lt;br /&gt;
用于测试的固件包被放在了编译出的 build/build_out 目录下。&lt;br /&gt;
&lt;br /&gt;
前置条件：PC端和开发板在同一个局域网内，可以向串口发送指令。&lt;br /&gt;
&lt;br /&gt;
测试过程：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#该程序需要分区表，所以在编译之后需要执行make whole来烧录whole bin&lt;br /&gt;
make whole&lt;br /&gt;
cd build/build_out&lt;br /&gt;
cat wifi_ota_bl616.bin.ota | nc -nvl 3365   #在pc端架服务器并发送固件&lt;br /&gt;
&lt;br /&gt;
#向串口发送指令连接WiFi并连接服务器开始测试&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect your_ssid your_passwd&lt;br /&gt;
bouffalolab /&amp;gt;wifi_ota_test PC_ip_addr 3365&lt;br /&gt;
&lt;br /&gt;
#收到以下回复则表示测试成功&lt;br /&gt;
[STA CONSOLE] Calculated SHA256 Checksum:9F5EA3181316DA72589CD4CB0702AA25ED3094F7BED2B5898187044A0A01A077&lt;br /&gt;
[STA CONSOLE] Header SET SHA256 Checksum:9F5EA3181316DA72589CD4CB0702AA25ED3094F7BED2B5898187044A0A01A077&lt;br /&gt;
[STA CONSOLE] [OTA] [TCP] prepare OTA partition info&lt;br /&gt;
[STA CONSOLE] [OTA] [TCP] Update PARTITION, partition len is 804560&lt;br /&gt;
reboot&lt;br /&gt;
[STA CONSOLE] [OTA] [TCP] Rebooting&lt;br /&gt;
[STA CONSOLE] dynamic memory init success, ocram heap size = 263 Kbyte &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;该源码可以支持配置自动连接WIFI,可以修改源码中的该部分内容：&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;#define AUTO_CONNECT_WIFI (0)&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * Private Types&lt;br /&gt;
 ****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * Private Data&lt;br /&gt;
 ****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
struct bflb_device_s *gpio;&lt;br /&gt;
static struct bflb_device_s *uart0;&lt;br /&gt;
&lt;br /&gt;
static TaskHandle_t wifi_fw_task;&lt;br /&gt;
#if AUTO_CONNECT_WIFI&lt;br /&gt;
struct bflb_device_s *wdg;&lt;br /&gt;
static TaskHandle_t ota_task_handle;&lt;br /&gt;
#endif&lt;br /&gt;
static wifi_conf_t conf = {&lt;br /&gt;
    .country_code = &amp;quot;CN&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#if AUTO_CONNECT_WIFI&lt;br /&gt;
// clang-format off&lt;br /&gt;
/* config your wifi ssid and password */&lt;br /&gt;
static const uint8_t wifi_sta_connet[] = &amp;quot;wifi_sta_connect H3C_21A0AD\r&amp;quot;;&lt;br /&gt;
/* config your ota server and port */&lt;br /&gt;
static const uint8_t wifi_ota_test[] = &amp;quot;wifi_ota_test 192.168.123.120 3365\r&amp;quot;;&lt;br /&gt;
/* reboot command */&lt;br /&gt;
// static const uint8_t send_buf1[] = &amp;quot;reboot\r&amp;quot;;&lt;br /&gt;
// clang-format on&lt;br /&gt;
&lt;br /&gt;
extern Ring_Buffer_Type shell_rb;&lt;br /&gt;
extern void shell_release_sem(void);&lt;br /&gt;
&lt;br /&gt;
SemaphoreHandle_t sem_wifi_init_done;&lt;br /&gt;
SemaphoreHandle_t sem_wifi_connect_done;&lt;br /&gt;
SemaphoreHandle_t sem_wifi_disconnect;&lt;br /&gt;
#endif&amp;lt;/syntaxhighlight&amp;gt;将宏定义 AUTO_CONNECT_WIFI 设定为1,并修改 wifi_sta_connect[]  wifi_ota_test[] 字符串为你的对应命令即可。&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:wifi_sta&amp;diff=102</id>
		<title>Demo:wifi sta</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:wifi_sta&amp;diff=102"/>
		<updated>2025-07-23T07:25:04Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​添加MQTTS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=== 基本介绍： ===&lt;br /&gt;
该系列demo存放在SDK 的路径为：bouffalo_sdk/examples/wifi/sta 。&lt;br /&gt;
&lt;br /&gt;
该系列代码需要将开发板作为STA节点连接到WiFi或者路由器后进行一些基本的通讯数据功能性测试。&lt;br /&gt;
&lt;br /&gt;
以下该系列demo的基本功能说明。&lt;br /&gt;
&lt;br /&gt;
=== MQTT相关Demo说明： ===&lt;br /&gt;
&lt;br /&gt;
==== wifi_mqtt_pub： ====&lt;br /&gt;
该demo将开发板作为mqtt中的publisher,向节点内发布主题信息。&lt;br /&gt;
&lt;br /&gt;
要测试该节点需要以下前置：&lt;br /&gt;
&lt;br /&gt;
1.建立一个mqtt服务器&lt;br /&gt;
&lt;br /&gt;
2.使用mqttbox或者其他相关工具从服务器上订阅对应的主题。&lt;br /&gt;
&lt;br /&gt;
3.可以向串口发送指令。&lt;br /&gt;
&lt;br /&gt;
建议本地下载mosquito,在本地搭建一个mqtt服务器，或者使用emqX公用服务器。该案例的defult server是：`test.mosquitto.org:1883`&lt;br /&gt;
&lt;br /&gt;
向串口发送指令连接WIFI并订阅：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
wifi_sta_connect your_wifi_id your_passwd&lt;br /&gt;
&lt;br /&gt;
mqtts_pub $local_ip 8883   #mqtt_pub  如果不带参数会默认发送到上述的公有服务器&lt;br /&gt;
&lt;br /&gt;
#会得到以下输出：&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;mqtt_pub is ready to begin publishing the time.&lt;br /&gt;
Press ENTER to publish the current time.&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
mqtt_pub published : &amp;quot;{&amp;quot;hello mqtt by bl616/8 !&amp;quot;}&lt;br /&gt;
Now time is 2023-06-16 00:00:00&amp;quot;&lt;br /&gt;
mqtt_pub published : &amp;quot;{&amp;quot;hello mqtt by bl616/8 !&amp;quot;}&lt;br /&gt;
Now time is 2023-06-16 00:00:03&amp;quot;&lt;br /&gt;
mqtt_pub stop publish to test.mosquitto.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;订阅方会受到当前时间的字符串。&lt;br /&gt;
&lt;br /&gt;
==== wifi_mqtt_sub: ====&lt;br /&gt;
和上述一样，但是该案例是submiter ，也就是消息订阅方。&lt;br /&gt;
&lt;br /&gt;
前置条件：同上。&lt;br /&gt;
&lt;br /&gt;
同样向串口发送指令来验证：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect your_wifi_id your_pwd&lt;br /&gt;
bouffalolab /&amp;gt;mqtt_sub your_server &amp;lt;port&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#得到输出&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;mqtt_sub listening for &#039;&amp;lt;theme&amp;gt;&#039; messages.&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
Received publish(&#039;&amp;lt;theme&amp;gt;&#039;):  {&amp;quot;hello mqtt&amp;quot;}&lt;br /&gt;
Received publish(&#039;&amp;lt;theme&amp;gt;&#039;):  {&amp;quot;hello mqtt&amp;quot;}&lt;br /&gt;
mqtt_sub disconnecting from xxx.your_server&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MQTTS功能： ====&lt;br /&gt;
&#039;&#039;&#039;上述的两个Demo现已支持TLS加密功能&#039;&#039;&#039;，该加密使用&#039;&#039;&#039;TLS1.2&#039;&#039;&#039;加密套件，未验证 CN name。&lt;br /&gt;
&lt;br /&gt;
开启MQTT的选项在对应文件夹中的CmakeList中：&amp;lt;syntaxhighlight lang=&amp;quot;makefile&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
cmake_minimum_required(VERSION 3.15)&lt;br /&gt;
&lt;br /&gt;
include(proj.conf)&lt;br /&gt;
&lt;br /&gt;
find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE})&lt;br /&gt;
&lt;br /&gt;
# User&lt;br /&gt;
sdk_add_compile_definitions(-DCONFIG_CLI_CMD_ENABLE)&lt;br /&gt;
# sdk_add_compile_options(-DMQTT_USE_CUSTOM_SOCKET_HANDLE)&lt;br /&gt;
# sdk_add_compile_definitions(-DMBEDTLS_PK_PARSE_C)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sdk_add_compile_options(-DMQTT_USE_MBEDTLS)     #注释该行则不启用TLS加密，否则加密。&lt;br /&gt;
&lt;br /&gt;
target_sources(app PRIVATE&lt;br /&gt;
                   wifi_mqtt_pub.c)&lt;br /&gt;
&lt;br /&gt;
sdk_add_include_directories(.)&lt;br /&gt;
&lt;br /&gt;
sdk_set_main_file(main.c)&lt;br /&gt;
&lt;br /&gt;
project(wifi_mqtt_publisher)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 其中的CA证书，密钥等具体为： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#ca.crt：&lt;br /&gt;
-----BEGIN CERTIFICATE-----&lt;br /&gt;
MIIDwzCCAqugAwIBAgIUT2Cy6wsGGycw6WvNoHot5I+GlTQwDQYJKoZIhvcNAQEL&lt;br /&gt;
BQAwcTELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0Jl&lt;br /&gt;
aWppbmcxDzANBgNVBAoMBk15IE9yZzEWMBQGA1UECwwNQ0EgRGVwYXJ0bWVudDEV&lt;br /&gt;
MBMGA1UEAwwMTVFUVCBSb290IENBMB4XDTI1MDcxNzEwMzU1MVoXDTM1MDcxNTEw&lt;br /&gt;
MzU1MVowcTELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcM&lt;br /&gt;
B0JlaWppbmcxDzANBgNVBAoMBk15IE9yZzEWMBQGA1UECwwNQ0EgRGVwYXJ0bWVu&lt;br /&gt;
dDEVMBMGA1UEAwwMTVFUVCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A&lt;br /&gt;
MIIBCgKCAQEAzMguxj26xEFb1N5u6slSgEp62eak+dqkmq6BoxVW48V2GO62caCt&lt;br /&gt;
n7MZywknnKm1sFM9kOv/mdr4fjHF3ZhvZ4MCqu0EPy2crjROoV8ofsjMDoIp2PSh&lt;br /&gt;
VZ7wmDC5zu7ndCMX85C/vv3Ikows5sMr/r6Ieh7lgoLeXTFDbGixLM3u1vB2I/OQ&lt;br /&gt;
gepYnPVkUHmEWsRFtzwwBgbAkSlmf3UreCT/lDbcOsKGl3YY4PZtJjk3wwtJqLAE&lt;br /&gt;
M/dNJdleU9ENwwelotScu4CGex+OaPNfn1EwLgwBrX2FByYyfpw+DUTnhdXsPbGM&lt;br /&gt;
jly24NUcg7CavTJxow5ltuWLahN5oQZZ4wIDAQABo1MwUTAdBgNVHQ4EFgQUGIBW&lt;br /&gt;
MZwM5z40nEZde/GSQxszsDEwHwYDVR0jBBgwFoAUGIBWMZwM5z40nEZde/GSQxsz&lt;br /&gt;
sDEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEALp0qj9qWnc9l&lt;br /&gt;
9GWivdOHVSfIHWWuTUN7+2QXGEHZ7vyC6dPoMNvr0Wg35Wj3VLbmZm6vlIubQ0JW&lt;br /&gt;
3nt5Kru9Keh/BALAxFa6onRVdYahXWRzD1fjTMUfIpDjaRtFWE6luA3ztfj2ZtiL&lt;br /&gt;
q665MZulKQLFhIQeAXNfR7hpxaiR+qu5YVYvWQN7gigjB787Y+JUk+h3rnlZ5vPX&lt;br /&gt;
j/yf9BP2u9tK1VkF2Ir1c+Y0xcp0qomd25QOm0H/qwgEh5wnO3du8GrTS5WMlYq1&lt;br /&gt;
LJSLM7dmBKgvTPngAgewFiwNPyhtywM6Vdc/mrcNwqAcfmyV0U8oU/DReKbX4ed2&lt;br /&gt;
+zlke05LKA==&lt;br /&gt;
-----END CERTIFICATE-----&lt;br /&gt;
&lt;br /&gt;
#ca.key：&lt;br /&gt;
-----BEGIN PRIVATE KEY-----&lt;br /&gt;
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDMyC7GPbrEQVvU&lt;br /&gt;
3m7qyVKASnrZ5qT52qSaroGjFVbjxXYY7rZxoK2fsxnLCSecqbWwUz2Q6/+Z2vh+&lt;br /&gt;
McXdmG9ngwKq7QQ/LZyuNE6hXyh+yMwOginY9KFVnvCYMLnO7ud0IxfzkL++/ciS&lt;br /&gt;
jCzmwyv+voh6HuWCgt5dMUNsaLEsze7W8HYj85CB6lic9WRQeYRaxEW3PDAGBsCR&lt;br /&gt;
KWZ/dSt4JP+UNtw6woaXdhjg9m0mOTfDC0mosAQz900l2V5T0Q3DB6Wi1Jy7gIZ7&lt;br /&gt;
H45o81+fUTAuDAGtfYUHJjJ+nD4NROeF1ew9sYyOXLbg1RyDsJq9MnGjDmW25Ytq&lt;br /&gt;
E3mhBlnjAgMBAAECggEAJTvQpWLb7osjs1SuPipUwdbI942kOXmzrBxGnexnXAqv&lt;br /&gt;
KmFc8tQQPZVG/0+u0CFbU7AO5abDVqolvGw4Wc45k0yS05k8yG/2qQYBtf2jU0oX&lt;br /&gt;
MBwil7wDCZpYjJNvdVyi4M7wr+yFsKhcK6kpENwzx6HFFs8/U7ePzsoCRFfUvxxu&lt;br /&gt;
26rKP0rF5168DCTn8UMyYqEdPQ9MOD2xI6hPsJVelqu7eWRXAWrFgVH5L+xgd0mH&lt;br /&gt;
MhtidnvayrUKt5eE+FifZN9QK2rgJ9lppGw9bPANSOQ+K1O7F+HIOwSCXCD2hM2t&lt;br /&gt;
bHaQfeLfOeu32MlOMcGQIcQGqwWpI9XHWQBJO9OcgQKBgQD5azAYDJL/jRxaN4o+&lt;br /&gt;
1QXOBRuimKNT4XDDyoPA0j6uwcXQa6LbhxPAack2ocyXm4O+g/wySiO/tnPoaNUH&lt;br /&gt;
WGppGdnGuqX+JAK/35GsNb30BCXb0Gkz/bijTSm3fNKg63ZTREZlJ/KTH8/4bM+p&lt;br /&gt;
B6FIO2g+oREjvVI6pRlBiLF70wKBgQDSL3nGHRzo6FSUjGmZBJ9f7koylYT7QuE8&lt;br /&gt;
mLoHG4fMoYaVDZk8eY10Xc9gL79aO4Uf98N004qbfL5QcbCgi5DBwrrIE1eInq0Y&lt;br /&gt;
CNKtfySzg2sdCG8Ex3fhtZZyOljlc4bckTj4gmGgCuNUDhPo+k2roskSoXo0G3T/&lt;br /&gt;
gFLFHJwvsQKBgG3UqIH+j4Ce59xGVsciUQMOtsObyVg3jst40xnGuzmDNJN5wmY/&lt;br /&gt;
DhCNxMAc8ZXVMmdjgVu30BQsyM+P0jcA1SLg8kgTiuLlgpxxW5lktPfOF8m69Yii&lt;br /&gt;
cnrekL8u5SVdamZySzliJOxqds8jQzJgnMHM/zONA5okVSBj8UItalJnAoGBAM8F&lt;br /&gt;
8hSfwkTp6b0zHCOauPv9MlnmicgOVNmhuMGdbUGx62ROs5ssQpbWe5bLENfofjRB&lt;br /&gt;
juQ4JHMICFAl2woWzar7iYvd+T7Yw7dDoXdAHz8td0hucSMs8TiA6kFylPLTuobw&lt;br /&gt;
B0RG7696afT1tMiqGeyvdwuBv2MplDDBDUWW64PRAoGAXmCqgu4AgKDrg/BsKCH3&lt;br /&gt;
070IxOXc+7tVdESmWyexDyNUfBCF+6Kowl1Kw3IgIcywA19sKK2msykyIy0Om+rM&lt;br /&gt;
EaZfHaspt9srWNlzDsPy6nV5dkXZcSezKVXxJgriDk46sPlEBNKGrYPbNmSYpvrY&lt;br /&gt;
NKgGQaYrJ5ixe1aEARcF2CE=&lt;br /&gt;
-----END PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
#server.crt：&lt;br /&gt;
-----BEGIN CERTIFICATE-----&lt;br /&gt;
MIID6zCCAtOgAwIBAgIUYSb6OOUA1AaPPfdB/QhCrJFxYfIwDQYJKoZIhvcNAQEL&lt;br /&gt;
BQAwcTELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0Jl&lt;br /&gt;
aWppbmcxDzANBgNVBAoMBk15IE9yZzEWMBQGA1UECwwNQ0EgRGVwYXJ0bWVudDEV&lt;br /&gt;
MBMGA1UEAwwMTVFUVCBSb290IENBMB4XDTI1MDcyMjA2MDk0MVoXDTI2MDcyMjA2&lt;br /&gt;
MDk0MVowazELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcM&lt;br /&gt;
B0JlaWppbmcxDzANBgNVBAoMBk15IE9yZzENMAsGA1UECwwETVFUVDEYMBYGA1UE&lt;br /&gt;
AwwPMTkyLjE2OC4xNTMuMTE0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC&lt;br /&gt;
AQEAm1NDiGRlGbUKX938s9HFrTyprJ4fhjHgmVZuqy0Hj5jX5Wvq7iPDXQHUuStN&lt;br /&gt;
9rIMB31K8h8gBfTbWTALQnL/p5urvBACvLI8J3BEz8pweq61sUeqBNGFO8YnxRou&lt;br /&gt;
vRPUeel9zg4GbLIf4T6BfwKtgMoqX/ROnnUiuE8sdo/KCreB5we+ZriP+jS1gVSQ&lt;br /&gt;
NMiJFXbo08aEV8WefuQnTegjgooEbFpeq7dtHXKiDiHW5LUCj6TUGh1DcKVvlSTa&lt;br /&gt;
ur7SMCvADT0W4Mp8Q9VXFCGwJugwy6pmtOqnPHEEBxs+1EGX22XeGS6ccP5HH2bm&lt;br /&gt;
yJ1gSLI+yt0r+T0cMTsoeBR2EQIDAQABo4GAMH4wCQYDVR0TBAIwADALBgNVHQ8E&lt;br /&gt;
BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0RBAgwBocEwKiZcjAdBgNV&lt;br /&gt;
HQ4EFgQUW7r5PWIFPiDa1RcxhUUcMwMID3wwHwYDVR0jBBgwFoAUGIBWMZwM5z40&lt;br /&gt;
nEZde/GSQxszsDEwDQYJKoZIhvcNAQELBQADggEBAKWlIJWaDzhhbBy9ftUkGIis&lt;br /&gt;
EDjMvmLnkFchFFNAOWZq1yBujf3K0KqcmdgKfSearMQrK/YTHR1a39P21BSqnRpk&lt;br /&gt;
dfNZfiVvRkJAcdY9SgderklUmPoY9huxumtGEPDtrkxkyuhgpk7/9YyavgyMCMdd&lt;br /&gt;
cFIwdeBUEHPhHLw8TlhVT1UotClKbhjyRHOMrpfWXVnsa+U/UrPeqGn8uL49XPH4&lt;br /&gt;
9DqzKZPSZaPxNoAj0iHvo+7RvEl5jy+ixwRgnvdOsDteRwFFW0Kxd4Ccn4QKEgTY&lt;br /&gt;
chx6XC0/a2Lg8KwxZbmDGoj4sqJ3PltuG8GZB6Vdv0FJnjAK6cZAQE0Hyclhhbs=&lt;br /&gt;
-----END CERTIFICATE-----&lt;br /&gt;
&lt;br /&gt;
#server.key：&lt;br /&gt;
-----BEGIN PRIVATE KEY-----&lt;br /&gt;
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCbU0OIZGUZtQpf&lt;br /&gt;
3fyz0cWtPKmsnh+GMeCZVm6rLQePmNfla+ruI8NdAdS5K032sgwHfUryHyAF9NtZ&lt;br /&gt;
MAtCcv+nm6u8EAK8sjwncETPynB6rrWxR6oE0YU7xifFGi69E9R56X3ODgZssh/h&lt;br /&gt;
PoF/Aq2Ayipf9E6edSK4Tyx2j8oKt4HnB75muI/6NLWBVJA0yIkVdujTxoRXxZ5+&lt;br /&gt;
5CdN6COCigRsWl6rt20dcqIOIdbktQKPpNQaHUNwpW+VJNq6vtIwK8ANPRbgynxD&lt;br /&gt;
1VcUIbAm6DDLqma06qc8cQQHGz7UQZfbZd4ZLpxw/kcfZubInWBIsj7K3Sv5PRwx&lt;br /&gt;
Oyh4FHYRAgMBAAECgf8CjFso4a/6ImSix5sqi0Z/xEvRIsb7OW/cR1uJc2bfjdWW&lt;br /&gt;
h5Uf7Kl7EFltFq8ww1SiZGvWWd+TBj4sntBdRrjrBwkwpkXLn4ddHkc17k+Ds8B6&lt;br /&gt;
jn87lQE0LQwTlicuJiUjDhgCSWvRj+dcZEO7noLTzUoX4oPOFbd8G2oFuyL71s0l&lt;br /&gt;
4jO2poU42qsOxgBd2XIxePUc320/2a7Y0rABZJMLVx24oRzHqCLhyhRneqoqar0P&lt;br /&gt;
1hmS2tMeEr66db8U6Fr7J+P1SVt0KFSdrvEYCDHTCVf0TAZ25vYT69VznZGSok4U&lt;br /&gt;
YQkBQiFFuyGXLgiRfrX/aL7rYxj2KBRAbce/lUECgYEAyx1coRA+FyptMZLWh7ny&lt;br /&gt;
QSSq25/J7K+TPUMefIKFtKCmBRHg6gWu9YbTimXIOoq7l51xI+YT02VnEqjn9ToR&lt;br /&gt;
vkUlNRyHBzsDt2VQTH+00Slo0tn4NS9Sb8uMezHiUgKGjiQWPQqwzUG4ToG2cYkj&lt;br /&gt;
8+vcxyHK5CWkWEVjh/1sRRkCgYEAw8R9Zqic+nv+9wRV219bmqyeSw2SkDXIyQSM&lt;br /&gt;
tUBjqZHB1wh3Z+Tc0KdYSM9tymEwBJ5mx/nYxxF3gWXW0K4kuS1jtMFZscNaA2/1&lt;br /&gt;
VRweVXWBUlC/oZY1IEdLchtcQt3CfLIwQIKyikPwax0EU9YfQiTAiDNCAdBNJPF0&lt;br /&gt;
J/bMn7kCgYEAiBWbCxp7zz+Qu0cbTwJpafXsN4ueWWLlLoV6tocol/WOZhUtcP3v&lt;br /&gt;
0/bKYo6BEaADwbgtppSvMdJdtaXPC4ElhCqFnEkJuvFyMvzBSQ/DEORCpAp//vo+&lt;br /&gt;
rEJfU+b/MF0a078f2zP/cvYWSxsjJnxwxyt+1zgv3J3Pt4h+AA3t7XkCgYEAnCJh&lt;br /&gt;
VXgTQx+T2RUHGOBz4efck8VuaD/NNK3BP2nsUriiXcst2JnKl0tweRme2fMrZfOj&lt;br /&gt;
y8hz4UkIBBbh/it1tI8D34z56XIBn44yn7++XbBLBQjL3ac8FdNm08oIinftfqBr&lt;br /&gt;
JXhXxziqTfOlmOvEoG9JcxdWhLXKYTWFy73ls1kCgYEAsrPcSpF8Ce3r+izDW2TM&lt;br /&gt;
2M4arK3T7hcMItLAQQoLO7RCYIivgQQE0WV9BmbC0fVTkptDMfks5s7QcU/6vzqC&lt;br /&gt;
zPx0NowGnabNWS1vsXD4QyoOyV3gqfVhM46cWbRhxtRmMo/LGuJ8rXnHY3bgF5va&lt;br /&gt;
VJlSyLW96jWK9neR0QOTKM4=&lt;br /&gt;
-----END PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;将对应的证书和密钥保存到文件中，放在mosquitto的路径下。&#039;&#039;&#039;注意要将这些文件的所属组归给mosquitto.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
然后修改mosquito的配置文件 ，该文件储存在 /etc/mosquitto/mosquitto.conf 中，配置如下：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# Place your local configuration in /etc/mosquitto/conf.d/&lt;br /&gt;
#&lt;br /&gt;
# A full description of the configuration file is at&lt;br /&gt;
&lt;br /&gt;
log_dest file /var/log/mosquitto/mosquitto.log&lt;br /&gt;
&lt;br /&gt;
listener 8883&lt;br /&gt;
tls_version tlsv1.2&lt;br /&gt;
cafile /etc/mosquitto/certs/ca.crt&lt;br /&gt;
certfile /etc/mosquitto/certs/server.crt&lt;br /&gt;
keyfile /etc/mosquitto/certs/server.key&lt;br /&gt;
&lt;br /&gt;
listener 1883&lt;br /&gt;
allow_anonymous true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTTP与HTTPS相关demo说明： ===&lt;br /&gt;
&lt;br /&gt;
==== wifi_http: ====&lt;br /&gt;
该demo会向网络服务器发送请求，根据返回结果判断http请求功能是否正常。&lt;br /&gt;
&lt;br /&gt;
前置条件为：一个可共上网的wifi,可以向串口发送指令。&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect your_wifi your_pwd&lt;br /&gt;
bouffalolab /&amp;gt;wifi_http_test www.xxx.com&lt;br /&gt;
&lt;br /&gt;
#以下为输出&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;Http client task start ...&lt;br /&gt;
Host:www.xxx.com, Server ip Address : the ip of websit server&lt;br /&gt;
Http client connect server success!&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== wifi_https: ====&lt;br /&gt;
该demo会自动发加密数据到www.baidu.com，根据结果判断加密功能是否正常&lt;br /&gt;
&lt;br /&gt;
前置条件：同上&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;wifi_https_test&lt;br /&gt;
bouffalolab /&amp;gt;dst_addr is 842C9824&lt;br /&gt;
&lt;br /&gt;
#以下为输出&lt;br /&gt;
[I: 124359488][bl_https.c:126]    HTTP/S&amp;gt; bouffalo connect fd = 0x62fd0dc0&lt;br /&gt;
[I: 124377783][bl_https.c:136]    HTTP/S&amp;gt; ret = -28&lt;br /&gt;
[I: 124598639][bl_https.c:156]    HTTP/S&amp;gt; ret = 0&lt;br /&gt;
[I: 124598987][bl_https.c:160]    HTTP/S&amp;gt; total time:471 ms&lt;br /&gt;
[I: 124679688][bl_https.c:168]    HTTP/S&amp;gt; rcv_ret = 1179&lt;br /&gt;
[I: 124680077][bl_https.c:172]    HTTP/S&amp;gt; proc_head_r 0, status_code 200, body_start_off 400&lt;br /&gt;
[I: 124680533][bl_https.c:180]    HTTP/S&amp;gt; Copy to resp @off 0, len 779, 1st char 3C&lt;br /&gt;
bl_TcpSslDisconnect end&lt;br /&gt;
[I: 124683390][bl_https.c:264]    HTTP/S&amp;gt; total time:555 ms&lt;br /&gt;
[I: 124683715][bl_https.c:265]    HTTP/S&amp;gt; test_1: status_code 200, resp_len 779&lt;br /&gt;
[I: 124684395][bl_https.c:267]    HTTP/S&amp;gt; resp body: &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;!--STATUS OK--&amp;gt;&amp;lt;html&amp;gt; &amp;lt;head&amp;gt;&amp;lt;meta http-equiv=content-type content=text/html;charset=utf-8&amp;gt;&amp;lt;meta http-equiv=X-UA-Compatible content=IE=Edge&amp;gt;&amp;lt;meta content=always name=referrer&amp;gt;&amp;lt;link rel=stylesheet type=text/css href=https://ss1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你想要更改测试服务器目标，可以在https.c源码中添加test,或者直接更改这部分代码：&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
static void test_1(void)&lt;br /&gt;
{&lt;br /&gt;
    const char *host = &amp;quot;www.baidu.com&amp;quot;;&lt;br /&gt;
    const uint8_t send_buf[] = &amp;quot;GET / HTTP/1.1\r\n&amp;quot;&lt;br /&gt;
                               &amp;quot;Host: www.baidu.com\r\n&amp;quot;&lt;br /&gt;
                               &amp;quot;User-Agent: curl/7.58.0\r\n&amp;quot;&lt;br /&gt;
                               &amp;quot;accept: application/json\r\n&amp;quot;&lt;br /&gt;
                               &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    uint8_t *buf;&lt;br /&gt;
    int resp_len;&lt;br /&gt;
    int status_code;&lt;br /&gt;
&lt;br /&gt;
    buf = malloc(16 * 1024);&lt;br /&gt;
    if (NULL == buf) {&lt;br /&gt;
        LOG_E(&amp;quot;malloc\r\n&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    resp_len = 16 * 1024;&lt;br /&gt;
&lt;br /&gt;
    uint32_t start_time = 0, stop_time = 0;&lt;br /&gt;
    start_time = xTaskGetTickCount();&lt;br /&gt;
    status_code = https_request(host, 443, send_buf, sizeof(send_buf) - 1, buf, &amp;amp;resp_len);&lt;br /&gt;
    stop_time = xTaskGetTickCount();&lt;br /&gt;
&lt;br /&gt;
    LOG_I(&amp;quot;total time:%d ms\r\n&amp;quot;, (stop_time - start_time));&lt;br /&gt;
    LOG_I(&amp;quot;test_1: status_code %d, resp_len %d\r\n&amp;quot;, status_code, resp_len);&lt;br /&gt;
    buf[resp_len] = &#039;\0&#039;;&lt;br /&gt;
    LOG_I(&amp;quot;resp body: %s\r\n&amp;quot;, buf);&lt;br /&gt;
&lt;br /&gt;
    free(buf);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;上述函数被调用用来执行测试，更改该部分代码可以实现更改测试目标的目的。&lt;br /&gt;
&lt;br /&gt;
=== TCP的Demo说明： ===&lt;br /&gt;
&lt;br /&gt;
==== wifi_tcp: ====&lt;br /&gt;
该部分代码编写了一个server.c和一个client.c,分别用于测试TCP服务端测试和客户端测试。&lt;br /&gt;
&lt;br /&gt;
前置条件：PC端和开发板共同在一个局域网内，可以向串口发送指令。&lt;br /&gt;
&lt;br /&gt;
使用picocom工具在串口中执行指令。&lt;br /&gt;
&lt;br /&gt;
server测试：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect your_wifi_id your_wifi_pwd&lt;br /&gt;
bouffalolab /&amp;gt;wifi_tcp_echo_test 3365&lt;br /&gt;
&lt;br /&gt;
#服务器建立成功&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;tcp server task start ...&lt;br /&gt;
Server ip Address : 0.0.0.0:3365&lt;br /&gt;
&lt;br /&gt;
# 执行 nc -v ipaddr port 连接板子的tcp服务器&lt;br /&gt;
&lt;br /&gt;
new client connected from (192.168.1.2, 57480)&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
recv 7 len data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;client测试：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#首先执行 nc -l -p 3365 在本地架起一个服务器&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect BL_TEST 12345678&lt;br /&gt;
bouffalolab /&amp;gt;wifi_tcp_test localip 3365&lt;br /&gt;
&lt;br /&gt;
#输出&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;tcp client task start ...&lt;br /&gt;
Server ip Address : 192.168.1.2:3365&lt;br /&gt;
TCP client connect server success!&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== UDP的demo说明： ===&lt;br /&gt;
该部分代码将使用开发板作为sta节点连接wifi并且架起一个udp服务器。&lt;br /&gt;
&lt;br /&gt;
前置条件：PC端和开发板在同一个局域网内，可以向串口发送指令。&lt;br /&gt;
&lt;br /&gt;
测试过程：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#连接开发板终端并发送指令&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect your_wifi_id 12345678&lt;br /&gt;
bouffalolab /&amp;gt;wifi_udp_echo 3365&lt;br /&gt;
bouffalolab /&amp;gt;udp server task start ...&lt;br /&gt;
&lt;br /&gt;
#服务其成功架起输出&lt;br /&gt;
ip Address : ip:3365&lt;br /&gt;
udp bind port success!&lt;br /&gt;
Press CTRL-C to exit.&lt;br /&gt;
&lt;br /&gt;
#在PC端执行  nc -u server_ip server_port&lt;br /&gt;
#直接发送 1234567890&lt;br /&gt;
&lt;br /&gt;
#成功接受到数据&lt;br /&gt;
recv from 192.168.1.2&lt;br /&gt;
recv:X&lt;br /&gt;
recv from 192.168.1.2&lt;br /&gt;
recv:X&lt;br /&gt;
recv from 192.168.1.2&lt;br /&gt;
recv:X&lt;br /&gt;
recv from 192.168.1.2&lt;br /&gt;
recv:X&lt;br /&gt;
recv from 192.168.1.2&lt;br /&gt;
recv:1234567890&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OTA的demo说明： ===&lt;br /&gt;
&lt;br /&gt;
==== wifi_ota： ====&lt;br /&gt;
该部分代码测试了基本tcp升级固件，使用pc端作为服务器，在同一局域网下，通过命令使得开发板连接ota服务器，接收固件包。&lt;br /&gt;
&lt;br /&gt;
用于测试的固件包被放在了编译出的 build/build_out 目录下。&lt;br /&gt;
&lt;br /&gt;
前置条件：PC端和开发板在同一个局域网内，可以向串口发送指令。&lt;br /&gt;
&lt;br /&gt;
测试过程：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#该程序需要分区表，所以在编译之后需要执行make whole来烧录whole bin&lt;br /&gt;
make whole&lt;br /&gt;
cd build/build_out&lt;br /&gt;
cat wifi_ota_bl616.bin.ota | nc -nvl 3365   #在pc端架服务器并发送固件&lt;br /&gt;
&lt;br /&gt;
#向串口发送指令连接WiFi并连接服务器开始测试&lt;br /&gt;
bouffalolab /&amp;gt;wifi_sta_connect your_ssid your_passwd&lt;br /&gt;
bouffalolab /&amp;gt;wifi_ota_test PC_ip_addr 3365&lt;br /&gt;
&lt;br /&gt;
#收到以下回复则表示测试成功&lt;br /&gt;
[STA CONSOLE] Calculated SHA256 Checksum:9F5EA3181316DA72589CD4CB0702AA25ED3094F7BED2B5898187044A0A01A077&lt;br /&gt;
[STA CONSOLE] Header SET SHA256 Checksum:9F5EA3181316DA72589CD4CB0702AA25ED3094F7BED2B5898187044A0A01A077&lt;br /&gt;
[STA CONSOLE] [OTA] [TCP] prepare OTA partition info&lt;br /&gt;
[STA CONSOLE] [OTA] [TCP] Update PARTITION, partition len is 804560&lt;br /&gt;
reboot&lt;br /&gt;
[STA CONSOLE] [OTA] [TCP] Rebooting&lt;br /&gt;
[STA CONSOLE] dynamic memory init success, ocram heap size = 263 Kbyte &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;该源码可以支持配置自动连接WIFI,可以修改源码中的该部分内容：&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;#define AUTO_CONNECT_WIFI (0)&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * Private Types&lt;br /&gt;
 ****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/****************************************************************************&lt;br /&gt;
 * Private Data&lt;br /&gt;
 ****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
struct bflb_device_s *gpio;&lt;br /&gt;
static struct bflb_device_s *uart0;&lt;br /&gt;
&lt;br /&gt;
static TaskHandle_t wifi_fw_task;&lt;br /&gt;
#if AUTO_CONNECT_WIFI&lt;br /&gt;
struct bflb_device_s *wdg;&lt;br /&gt;
static TaskHandle_t ota_task_handle;&lt;br /&gt;
#endif&lt;br /&gt;
static wifi_conf_t conf = {&lt;br /&gt;
    .country_code = &amp;quot;CN&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#if AUTO_CONNECT_WIFI&lt;br /&gt;
// clang-format off&lt;br /&gt;
/* config your wifi ssid and password */&lt;br /&gt;
static const uint8_t wifi_sta_connet[] = &amp;quot;wifi_sta_connect H3C_21A0AD\r&amp;quot;;&lt;br /&gt;
/* config your ota server and port */&lt;br /&gt;
static const uint8_t wifi_ota_test[] = &amp;quot;wifi_ota_test 192.168.123.120 3365\r&amp;quot;;&lt;br /&gt;
/* reboot command */&lt;br /&gt;
// static const uint8_t send_buf1[] = &amp;quot;reboot\r&amp;quot;;&lt;br /&gt;
// clang-format on&lt;br /&gt;
&lt;br /&gt;
extern Ring_Buffer_Type shell_rb;&lt;br /&gt;
extern void shell_release_sem(void);&lt;br /&gt;
&lt;br /&gt;
SemaphoreHandle_t sem_wifi_init_done;&lt;br /&gt;
SemaphoreHandle_t sem_wifi_connect_done;&lt;br /&gt;
SemaphoreHandle_t sem_wifi_disconnect;&lt;br /&gt;
#endif&amp;lt;/syntaxhighlight&amp;gt;将宏定义 AUTO_CONNECT_WIFI 设定为1,并修改 wifi_sta_connect[]  wifi_ota_test[] 字符串为你的对应命令即可。&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:DMA&amp;diff=101</id>
		<title>Demo:DMA</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:DMA&amp;diff=101"/>
		<updated>2025-07-17T01:35:15Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Demo介绍： ===&lt;br /&gt;
这部分代码保存在SDK下的：/examples/peripherals/dma/ 中。展示了不同模式下的dma运行情况，测试dma外设的功能完整性。&lt;br /&gt;
&lt;br /&gt;
在该SDK中，dma的搬运行为被构建成一个LLI，系统根据LLI不断向下搬运直到最终节点。&lt;br /&gt;
&lt;br /&gt;
=== dma_normal: ===&lt;br /&gt;
该部分代码测试了内存到内存的基本dma运送。共搬运数据三组，字节对齐为32位。搬运模式为一次性搬运。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;数据字节对齐式初始化：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
这里这里以32位对齐是为了配合后面DMA读取。&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
static __attribute((aligned(32))) uint8_t src1_buffer[DMA_BUFFER_LENGTH];&lt;br /&gt;
static __attribute((aligned(32))) uint8_t src2_buffer[DMA_BUFFER_LENGTH];&lt;br /&gt;
static __attribute((aligned(32))) uint8_t src3_buffer[DMA_BUFFER_LENGTH];&lt;br /&gt;
&lt;br /&gt;
static __attribute((aligned(32))) uint8_t dst1_buffer[DMA_BUFFER_LENGTH];&lt;br /&gt;
static __attribute((aligned(32))) uint8_t dst2_buffer[DMA_BUFFER_LENGTH];&lt;br /&gt;
static __attribute((aligned(32))) uint8_t dst3_buffer[DMA_BUFFER_LENGTH];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;DMA配置解析：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
方向配置为：内存到内存；&lt;br /&gt;
&lt;br /&gt;
优先级都配置为： 0，是最高优先级；&lt;br /&gt;
&lt;br /&gt;
目标和源数据指针都为递增；&lt;br /&gt;
&lt;br /&gt;
突发传输次数配置都为 1；&lt;br /&gt;
&lt;br /&gt;
数据宽度都为 32位置。&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    config.direction = DMA_MEMORY_TO_MEMORY;&lt;br /&gt;
    config.src_req = 0;&lt;br /&gt;
    config.dst_req = 0;&lt;br /&gt;
    config.src_addr_inc = DMA_ADDR_INCREMENT_ENABLE;&lt;br /&gt;
    config.dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE;&lt;br /&gt;
    config.src_burst_count = DMA_BURST_INCR1;&lt;br /&gt;
    config.dst_burst_count = DMA_BURST_INCR1;&lt;br /&gt;
    config.src_width = DMA_DATA_WIDTH_32BIT;&lt;br /&gt;
    config.dst_width = DMA_DATA_WIDTH_32BIT;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;突发次数：&#039;&#039;&#039; ====&lt;br /&gt;
突发次数就是突发传输，是指在DMA占用总线时，一个周期里读或者写的次数。注意，虽然双方都配置了突发次数，但是&#039;&#039;&#039;并不是同时进行而是先读后写&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
比如，源数据的突发传输次数设定为4,目标写的突发次数为2,则是先读取四次，然后再写入两次。&#039;&#039;&#039;&#039;&#039;这里的突发读/写每次都会出发指针的递增&#039;&#039;&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;部分输出：&#039;&#039;&#039; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
dma memory case:&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
copy finished with time=353us&lt;br /&gt;
case end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dma_normal_cycle: ===&lt;br /&gt;
该部分代码和上述代码的配置一致，但是该代码为循环搬运。&lt;br /&gt;
&lt;br /&gt;
不同的地方在于：&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    int used_count = bflb_dma_channel_lli_reload(dma0_ch0, lli, 20, transfers, 3);&lt;br /&gt;
    bflb_dma_channel_lli_link_head(dma0_ch0, lli, used_count);      //该函数将链表进行了头尾相接&lt;br /&gt;
    bflb_dma_channel_start(dma0_ch0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;链表头尾相接变成了环&#039;&#039;&#039;，所以程序将会重复循环搬运构建的链表内的所有item。&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;部分输出：&#039;&#039;&#039; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
tc done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;按照demo,应该触发一百次中断函数，所以应该有100次 tc done&lt;br /&gt;
&lt;br /&gt;
=== dma_reduce_or_add: ===&lt;br /&gt;
这部分代码主要展示了两个模式在不同的情况下的应用，并且展示了普通模式下当目标数据和源数据宽度不同时应该怎么传输数据和当应该使用模式但没有使用时会产生什么样的负面效果。&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;Add与Reduce模式说明：&#039;&#039;&#039; ====&lt;br /&gt;
Add和Reduce模式从狭义来判断是当目标数据宽度和源数据宽度不匹配时使用。&lt;br /&gt;
&lt;br /&gt;
但事实并不仅仅如此，&#039;&#039;&#039;本demo在第一段代码的配置中就展示了即使数据宽度不匹配也可以在normal模式下通过设置配置来运行&#039;&#039;&#039;：&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    config.direction = DMA_MEMORY_TO_MEMORY;&lt;br /&gt;
    config.src_req = 0;&lt;br /&gt;
    config.dst_req = 0;&lt;br /&gt;
    config.src_addr_inc = DMA_ADDR_INCREMENT_ENABLE;&lt;br /&gt;
    config.dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE;&lt;br /&gt;
    config.src_burst_count = DMA_BURST_INCR1;&lt;br /&gt;
    config.dst_burst_count = DMA_BURST_INCR4;&lt;br /&gt;
    config.src_width = DMA_DATA_WIDTH_32BIT;&lt;br /&gt;
    config.dst_width = DMA_DATA_WIDTH_8BIT;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过设定 burst 突发次数来配合宽度，最终使得：&#039;&#039;&#039;源宽度*突发次数 = 目标宽度*突发次数&#039;&#039;&#039; &amp;lt;big&amp;gt;则可以完整的将数据正确的传输过去&amp;lt;/big&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;那什么情况下使用Add和Reduce？&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
答案是要&#039;&#039;&#039;参考数据总量&#039;&#039;&#039;，比如：&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    /* Disable reduce mode and enable add mode, src_width = 8bit, dst_width = 32bit, nbytes = 65, transfer length = nbytes + 3 = 68 byte, multiple of dst_width */&lt;br /&gt;
    bflb_dma_feature_control(dma0_ch0, DMA_CMD_SET_REDUCE_MODE, 0);&lt;br /&gt;
    bflb_dma_feature_control(dma0_ch0, DMA_CMD_SET_ADD_MODE, 1);&lt;br /&gt;
&lt;br /&gt;
    config.src_burst_count = DMA_BURST_INCR4;&lt;br /&gt;
    config.dst_burst_count = DMA_BURST_INCR1;&lt;br /&gt;
    config.src_width = DMA_DATA_WIDTH_8BIT;&lt;br /&gt;
    config.dst_width = DMA_DATA_WIDTH_32BIT;&lt;br /&gt;
    bflb_dma_channel_init(dma0_ch0, &amp;amp;config);&lt;br /&gt;
&lt;br /&gt;
    bflb_dma_channel_tcint_mask(dma0_ch0, false);&lt;br /&gt;
&lt;br /&gt;
    transfers[0].nbytes = DMA_TRANSFER_LENGTH + 1;  //这里更改设置总传输量为65字节&lt;br /&gt;
    bflb_dma_channel_lli_reload(dma0_ch0, lli, 20, transfers, 1);&lt;br /&gt;
&lt;br /&gt;
    bflb_dma_channel_start(dma0_ch0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;当目标数据宽度是32位4字节，而源数据的宽度是8位一字节，&#039;&#039;&#039;拿65/4 = 16 余下 1,也就是说最后一次传输会仅仅传输一字节数据向一个宽度为四字节的变量&#039;&#039;&#039;。假设这里不是变量而是寄存器，那么就有可能写不进去（可能识别错误）。那么&amp;lt;big&amp;gt;&#039;&#039;&#039;Add在这里的作用就是：字节对齐&#039;&#039;&#039;&amp;lt;/big&amp;gt;。它会自动补全后面的数据，也就是补出来3字节的数据，&#039;&#039;这就是什么注释中说最后的实际传输数据是65 + 3= 68 byte。&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
而Reduce模式，在本demo中仅仅是测试，没有给出实际的需求场景。&lt;br /&gt;
&lt;br /&gt;
在实际场景中的应用一般是在如下情况：假设当目标宽度为32位，数据源宽度为8位,读取总量设定为61字节。 61 / 4 = 15 余下 1。此时必须再次读取，但是读取的四字节中只有一字节要使用，假设寄存器读取后就会复位，那么这里就会错误操作。所以reduce模式就可以在这种情况下使用，它会规定用户设定的传输总量为最大读取字节数，&amp;lt;big&amp;gt;&#039;&#039;&#039;reduce的作用就是：防止过量读取。&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在配置上可以参考这个：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!模式&lt;br /&gt;
!适用场景&lt;br /&gt;
!配置公式&lt;br /&gt;
!效果&lt;br /&gt;
|-&lt;br /&gt;
|Reduce&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;源宽度 &amp;gt; 目标宽度  ||  不希望过度读取&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|nbytes = 期望 + 目标宽度&lt;br /&gt;
|实际传输 = 期望&lt;br /&gt;
|-&lt;br /&gt;
|Add&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;目标宽度 &amp;gt; 源宽度  ||  需要字节对齐写入数据&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|nbytes = 期望&lt;br /&gt;
|实际传输 = 对齐(期望)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 部分输出： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
===========================&lt;br /&gt;
uart  sig1:ffffffff, sig2:0000f32f&lt;br /&gt;
clock gen1:9ffffffd, gen2:0fff0c11&lt;br /&gt;
xtal:40000000Hz(crystal)&lt;br /&gt;
board init done&lt;br /&gt;
===========================&lt;br /&gt;
dma memory case:&lt;br /&gt;
tc done&lt;br /&gt;
Check over&lt;br /&gt;
&lt;br /&gt;
tc done&lt;br /&gt;
Check over&lt;br /&gt;
&lt;br /&gt;
tc done&lt;br /&gt;
Correct, meaningless data. index: 65, src: 0x41, dst: 0x31&lt;br /&gt;
Correct, meaningless data. index: 66, src: 0x42, dst: 0x32&lt;br /&gt;
Correct, meaningless data. index: 67, src: 0x43, dst: 0x33&lt;br /&gt;
Check over&lt;br /&gt;
&lt;br /&gt;
tc done&lt;br /&gt;
Check over&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;可以看到在最终的没有添加add模式的情况下，出现了无意义数据。&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Demo:Btble&amp;diff=100</id>
		<title>Demo:Btble</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Demo:Btble&amp;diff=100"/>
		<updated>2025-07-16T08:30:29Z</updated>

		<summary type="html">&lt;p&gt;武楷轩：​添加blemesh_cli&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Demo介绍： ==&lt;br /&gt;
&#039;&#039;&#039;这部分Demo主要是蓝牙通讯相关功能的实例代码，这些demo保存在SDK的 example/btble路径下。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== blemesh_cli: ==&lt;br /&gt;
&lt;br /&gt;
=== 基本介绍： ===&lt;br /&gt;
该demo创建了一个 Bluetooth mesh 网络，通过向串口发送指令进行初始化后，就可以通过手机APP在mesh网络中进行添加并连接。&lt;br /&gt;
&lt;br /&gt;
DEMO命令和输出：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_init              #初始化bluemesh网络&lt;br /&gt;
#输出：&lt;br /&gt;
Init successfully &lt;br /&gt;
Env[LOCAL_NAME] Data len[10], setting_env_cb&lt;br /&gt;
Use pb-adv or pb-gatt to enable advertising&lt;br /&gt;
&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_pb 2 1            &lt;br /&gt;
#输出：&lt;br /&gt;
PB-GATT enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;执行完上述命令后，就可以使用手机APP进行NODE的添加和连接。&lt;br /&gt;
&lt;br /&gt;
添加的步骤如下：&amp;lt;gallery&amp;gt;&lt;br /&gt;
文件:APPopen.png|step1&lt;br /&gt;
文件:Meshnode2.png|step2&lt;br /&gt;
文件:Meshnode3.png|step3&lt;br /&gt;
文件:Meshnode4.png|step4&lt;br /&gt;
文件:Meshnode5.png|step5&lt;br /&gt;
文件:Meshnode6.png|ste6&lt;br /&gt;
文件:Meshnode7.png|step7&lt;br /&gt;
文件:Meshnode8.png|step8&lt;br /&gt;
文件:Meshnode9.png|step9&lt;br /&gt;
文件:Meshnode10.png|step10&lt;br /&gt;
文件:Meshnode11.png|step11&lt;br /&gt;
文件:Meshnode12.png|step12&lt;br /&gt;
文件:Meshnode13.png|step13&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 如何使用配网器 Provisioner 将新设备添加进网络中： ===&lt;br /&gt;
大概流程如下：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.打开未配网设备 ---- 2.启动配网器Provisioner ---- 3.监听设备广播 ---- 4.添加设备到网络 ---- 5.获取设备信息 ---- 6.分配密钥&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
provisioner设备编译时，必须更改一个编译选项：&lt;br /&gt;
&lt;br /&gt;
CONFIG_BT_MESH_PROVISIONER=1&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤1：打开未配网设备并且输入以下命令： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
blemesh_init        # 初始化Mesh协议栈&lt;br /&gt;
blemesh_pb 1 1      # 开启PB-ADV和PB-GATT配网承载&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤2： 打开配网器设备输入以下命令： ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_pvnr_init             #初始化Provisioner&lt;br /&gt;
#得到输出：&lt;br /&gt;
    .........&lt;br /&gt;
    Local node provisioned, net_idx 0x0000 address 0x0001&lt;br /&gt;
&lt;br /&gt;
    Network key:8fe7deea92943001567251dc1f9b0f03&lt;br /&gt;
&lt;br /&gt;
    Dev key:89c2f18f9f286661c6bbb1430d7aadb7&lt;br /&gt;
&lt;br /&gt;
    Provisioning completed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0x0000&amp;lt;/code&amp;gt;：网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;address 0x0001&amp;lt;/code&amp;gt;：Provisioner自身地址&lt;br /&gt;
* &amp;lt;code&amp;gt;Network key&amp;lt;/code&amp;gt;：网络层加密密钥&lt;br /&gt;
* &amp;lt;code&amp;gt;Dev key&amp;lt;/code&amp;gt;：设备专属配置密钥&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤3：打开广播 ====&lt;br /&gt;
执行以下命令：&lt;br /&gt;
 blemesh_beacon_listen 0x01  # 开启广播监听&lt;br /&gt;
&lt;br /&gt;
* 扫描周围广播Mesh信标的设备&lt;br /&gt;
* 捕获并显示未配网设备的UUID（如：&amp;lt;code&amp;gt;07af000011112222333318b905de96c2&amp;lt;/code&amp;gt;）&lt;br /&gt;
* UUID包含设备身份信息（厂商ID、产品ID等）&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤4：在配网器设备上执行 添加设备到网络命令 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;blemesh_provision_adv 07af000011112222333318b905de96c2 0 3 0&lt;br /&gt;
#输出&lt;br /&gt;
    P1：“07af000011112222333318b905de96c2&amp;quot; is UUID information.&lt;br /&gt;
    P2：0：net_idx&lt;br /&gt;
    P3：3： assign node unicast address。&lt;br /&gt;
    P4：0：attention_duration&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;UUID&amp;lt;/code&amp;gt;：目标设备的唯一标识&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0&amp;lt;/code&amp;gt;：使用的网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;address 3&amp;lt;/code&amp;gt;：分配给设备的单播地址(0x0003)&lt;br /&gt;
* &amp;lt;code&amp;gt;attention_duration 0&amp;lt;/code&amp;gt;：配网指示时长（0=无提示）&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤5：获取设备信息 ====&lt;br /&gt;
执行的命令与输出内容：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt; blemesh_get_comp 0x0000 0x0003 0x00&lt;br /&gt;
#输出：&lt;br /&gt;
P1：net index.&lt;br /&gt;
&lt;br /&gt;
P2：dst address.&lt;br /&gt;
&lt;br /&gt;
P3：page number.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net_idx 0x0000&amp;lt;/code&amp;gt;：网络索引&lt;br /&gt;
* &amp;lt;code&amp;gt;dst 0x0003&amp;lt;/code&amp;gt;：目标设备地址&lt;br /&gt;
* &amp;lt;code&amp;gt;page 0x00&amp;lt;/code&amp;gt;：组成数据页码&lt;br /&gt;
&lt;br /&gt;
==== 执行步骤6：分配密钥key ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
bouffalolab /&amp;gt;  blemesh_app_key_add 0x0000 0x0003 0x0000 0x0000&lt;br /&gt;
#输出&lt;br /&gt;
P1：net index.&lt;br /&gt;
&lt;br /&gt;
P2：dst address.&lt;br /&gt;
&lt;br /&gt;
P3：Network key index。&lt;br /&gt;
&lt;br /&gt;
P4：Application key index.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>武楷轩</name></author>
	</entry>
</feed>