Demo:Basical case:修订间差异

来自Bouffalo Lab Docs
跳转到导航 跳转到搜索
武楷轩留言 | 贡献
efuse
武楷轩留言 | 贡献
无编辑摘要
第459行: 第459行:
case finished!
case finished!


</syntaxhighlight>
== Demo:i2s_es8311 ==
该Demo的主要用途是实现音频数据采集和播放。主要功能是初始化并配置 I2S 接口和 ES8311 音频编解码器,以实现音频数据的传输和处理。
保存在SDK下:bouffalo_sdk/examples/peripherals/i2s/i2s_es8311
=== 代码解读: ===
# '''硬件初始化''':调用 <code>board_init()</code> 初始化硬件板级配置。初始化 GPIO 引脚<code>i2s_gpio_init()</code>,为 I2S 和 I2C 接口分配功能引脚。
# '''主时钟输出''':调用 <code>mclk_out_init()</code> 配置 I2S 的主时钟输出,为外部音频设备ES8311提供时钟信号。
# '''ES8311 音频编解码器初始化''':配置 ES8311 的工作模式。调用 <code>es8311_init()</code> 初始化 ES8311,并设置音量。启动 ES8311 的 ADC 和 DAC 模块。
# '''I2S 和 DMA 初始化''':调用 <code>i2s_dma_init()</code> 初始化 I2S 接口和 DMA 通道。配置 DMA 通道,启动 DMA 通道,开始音频数据的传输和接收。
=== 示例输出: ===
<syntaxhighlight lang="bash" line="1">
===========================
es8311 init
read chip id failed!
SET: volume:70%
i2s init
dma init
dma lli init
tx dma lli num: 2
rx dma lli num: 2
tc done
rx done
tc done
rx done
tc done
rx done
tc done
rx done
</syntaxhighlight>
</syntaxhighlight>

2025年8月11日 (一) 08:03的版本

前言

该页面将介绍一些较为简单基础的测试case 功能,目前包括 freertos;log等级输出;boot2;这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。

源码编译:

在对应 Case 的文件夹下有一个 README.md 文件,该文件中根据不同的开发板型号有不同编译的参数,例如 bl616 :

- BL616/BL618

```
make CHIP=bl616 BOARD=bl616dk
```
#以上为README文件中的内容,根据内容直接执行对应make编译指令即可

make如果成功,你会在终端看到:

Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin(示例) 代表生成了对应可供烧录的固件

开发板烧录:

执行make命令后,在该文件夹下会生成一个build目录,在文件夹中有一个生成的固件 freertos_bl616.bin ,该文件用于烧录直接使用(类似于keil生成的.hex文件)。

其具体路径为 .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin

下载烧录工具:

下载BLDevCube工具:下载后解压即可直接使用。

https://dev.bouffalolab.com/

烧录具体步骤:

Step1:打开DevCube选择对应开发板型号。

Step2:选择对应的 .bin 文件,选择对应的串口。

注意:要选择IOT并勾选enable

Step3:

按住boot键按一下复位键(按复位时boot键不松开),然后点击Create & Download。查看下方的输出信息是否烧录成功。

Demo:FreeRTOS

在Bouffalo SDK上使用FreeRTOS APP

源码介绍:

该文件的源码在 bouffalo_sdk/examples/freertos/main.c中,该测试 demo 简单测试了一些组件,包括Semaphore,Mutex,Queue,Priority 的基本简单测试。

测试分为两个阶段:

阶段一以消费者生产者模型测试信号量信号队列组件,共生成三个Task。阶段结束后Task自动销毁。

阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试互斥量,途中高优先级的任务将启动并占用CPU一段时间以此测试抢占任务调度

源码部分输出:

[FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test =====
[FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks...
[FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task...
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started
[FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success
[FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1)
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501)
[FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001)
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty
.....
[FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test =====
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change
[FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change
[FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task...
[FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks...
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex
.....
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex
[FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running
[FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5
.....
[FREERTOS_TEST CONSOLE] ===== END PHASE 2 =====
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired.
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change
[FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.

Demo:bflog

Demo介绍:

该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下,主要测试该开发板不同级别的log输出功能;

filter对输出日志的过滤功能。bflog分为五个级别,分别为:

日志等级 说明 基本应用场景
FATL 致命错误(Fatal) 系统无法继续运行的灾难性事件(如核心崩溃、数据损坏),需立即人工干预并终止程序。
ERRO 错误(Error) 影响当前操作的关键错误(如功能失效、外部服务异常),但系统仍可部分运行,需尽快处理。
WARN 警告(Warning) 非关键性异常或潜在风险(如配置降级、资源不足),需关注但无需立即行动。
INFO 信息(Info) 常规运行状态记录(如服务启动、关键操作完成),用于监控系统健康状态。
DBUG 调试(Debug) 开发/测试阶段的详细运行细节(如变量值、逻辑分支),用于定位问题原因。
TRAC 跟踪(Trace) 最细粒度的执行路径追踪(如函数调用栈、循环过程),用于深度分析复杂逻辑。

barebone_sync:

该部分主要是裸机测试了以上的各个等级log输出,filter过滤。

部分输出:

===========================
uart  sig1:ffffffff, sig2:0000f32f
clock gen1:9ffffffd, gen2:0fff0c11
xtal:40000000Hz(crystal)
board init done
===========================

============================== enable all output

[FATL][     25338][2022-12-16 17:51:40][main.c:main:130]<MAIN> hello world this is fatal error
[ERRO][     25858][2022-12-16 17:51:40][main.c:main:131]<MAIN> hello world this is error
[WARN][     26355][2022-12-16 17:51:40][main.c:main:132]<MAIN> hello world this is warning
[INFO][     26864][2022-12-16 17:51:40][main.c:main:133]<MAIN> hello world this is information
[DBUG][     27374][2022-12-16 17:51:40][main.c:main:134]<MAIN> hello world this is degug information
[TRAC][     27934][2022-12-16 17:51:40][main.c:main:135]<MAIN> hello world this is trace information
[FATL][     28492][2022-12-16 17:51:40][log_test.c:test_log:13]<TEST> hello test this is fatal error
[ERRO][     29049][2022-12-16 17:51:40][log_test.c:test_log:14]<TEST> hello test this is error
[WARN][     29580][2022-12-16 17:51:40][log_test.c:test_log:15]<TEST> hello test this is warning
[INFO][     30119][2022-12-16 17:51:40][log_test.c:test_log:16]<TEST> hello test this is information
[DBUG][     30660][2022-12-16 17:51:40][log_test.c:test_log:17]<TEST> hello test this is degug information
[TRAC][     31248][2022-12-16 17:51:40][log_test.c:test_log:18]<TEST> hello test this is trace information

============================== enable only MAIN output

[FATL][   1031983][2022-12-16 17:51:41][log_test.c:test_log:13]<TEST> hello test this is fatal error
[ERRO][   1032537][2022-12-16 17:51:41][log_test.c:test_log:14]<TEST> hello test this is error
[WARN][   1033066][2022-12-16 17:51:41][log_test.c:test_log:15]<TEST> hello test this is warning
[INFO][   1033606][2022-12-16 17:51:41][log_test.c:test_log:16]<TEST> hello test this is information
[DBUG][   1034146][2022-12-16 17:51:41][log_test.c:test_log:17]<TEST> hello test this is degug information
[TRAC][   1034736][2022-12-16 17:51:41][log_test.c:test_log:18]<TEST> hello test this is trace information

============================== disable all output

freertos_async:

该部分测试了在FreeRTOS下log的输出是否正常。

该case创建了两个任务,消费者和生产者,从信号队列中进行获取和放入的经典场景来测试log。

消费者任务和生产者任务具体代码放在同目录下的: thread_consumer; thread_producer;中。

部分输出:

Demo:helloworld

Demo介绍:

该demo测试基本日志等级输出,该Demo是对bflog加了一层封装,比如控制日志输出等级,控制是否使用严重等级颜色输出。

保存路径: bouffalo_sdk/examples/helloworld

在当前默认情况下的输出如下:

===========================
uart  sig1:ffffffff, sig2:0000f32f
clock gen1:9ffffffd, gen2:0fff0c11
xtal:40000000Hz(crystal)
board init done
===========================
[F][MAIN] hello world fatal
[E][MAIN] hello world error
[W][MAIN] hello world warning
[I][MAIN] hello world information
hello world fatal raw
hello world error raw
hello world warning raw
hello world information raw

通过代码对应可以看到部分代码没有输出,部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出:

#if (CONFIG_LOG_LEVEL >= 4)
#define LOG_D(...)  BFLOG_D((void *)&__bflog_recorder, __VA_ARGS__)
#define LOG_RD(...) BFLOG_RD((void *)&__bflog_recorder, __VA_ARGS__)
#else
#define LOG_D(...)  ((void)0)
#define LOG_RD(...) ((void)0)
#endif

#if (CONFIG_LOG_LEVEL >= 5)
#define LOG_T(...)  BFLOG_T((void *)&__bflog_recorder, __VA_ARGS__)
#define LOG_RT(...) BFLOG_RT((void *)&__bflog_recorder, __VA_ARGS__)
#else
#define LOG_T(...)  ((void)0)
#define LOG_RT(...) ((void)0)
#endif

是否有颜色则取决于是否带有R,在引用文件中可以看到:

#define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)

以上配置可以在同级目录下的 proj.conf 中。

Demo:log_dbg_assert

这部分代码和Demo:helloworld 基本一致,但是多了测试断言输出的功能。

保存在 SDK 下的: bouffalo_sdk/examples/log_dbg_assert

在代码中先进行了一个阶乘的递归函数,每一次递归以及判读啊都会输出断言信息以此测试断言输出。

示例输出:

[I][MAIN] message = "hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui"
[I][MAIN] message (size: 138):
    00000000: 68 65 6c 6c 6f 6b 73 7a  68 64 66 6f 69 61 73 6a 'hellokszhdfoiasj'
    00000010: 64 6b 6a 6e 73 6b 6a 78  6e 76 75 69 6f 6c 61 73 'dkjnskjxnvuiolas'
    00000020: 68 64 66 6f 69 6e 61 73  6b 6a 6c 64 66 6e 76 6b 'hdfoinaskjldfnvk'
    00000030: 6c 61 73 6a 68 64 66 69  32 31 33 34 38 39 6f 37 'lasjhdfi213489o7'
    00000040: 31 32 33 34 35 38 39 30  37 33 32 39 38 64 66 6c '1234589073298dfl'
    00000050: 3b 61 73 6a 64 6c 66 6e  6b 6a 7a 78 6e 63 76 68 ';asjdlfnkjzxncvh'
    00000060: 61 73 64 6c 6b 66 6c 6a  68 61 73 6a 6b 6c 64 6a 'asdlkfljhasjkldj'
    00000070: 68 6e 76 6a 6b 61 73 6c  6e 64 66 76 6b 6c 6a 61 'hnvjkaslndfvklja'
    00000080: 73 68 64 6c 69 66 68 75  69 00                   'shdlifhui.'
[I][MAIN] 3 * a = 6 (0x6)
[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)
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = true
[I][MAIN] 1 = 1 (0x1)
[I][MAIN] n * factorial(n - 1) = 2 (0x2)
[I][MAIN] n * factorial(n - 1) = 6 (0x6)
[I][MAIN] n * factorial(n - 1) = 24 (0x18)
[I][MAIN] factorial(4) = 24 (0x18)
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = true
[I][MAIN] 1 = 1 (0x1)

.......

 1 == factorial(4) but 1 = 1 , factorial(4) = 24
error handler
[F][MAIN] hello world fatal
[E][MAIN] hello world error
[W][MAIN] hello world warning
[I][MAIN] hello world information
hello world fatal raw
hello world error raw
hello world warning raw
hello world information raw
[F][MAIN] hello world fatal
[E][MAIN] hello world error
[W][MAIN] hello world warning
[I][MAIN] hello world information

Demo:boot2 isp

这部分代码是一个bootloader程序,具备 安全启动双分区更新压缩支持多核管理 等工业级特性。

该demo存放在 SDK 下的:/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。

主要功能

  1. 分区表:读取并验证分区表(pt_table_stuff),确定活动分区(active_id)支持 A/B 双分区设计,实现无缝固件更新和回滚处理分区条目,包括固件位置、大小、版本号
  2. 固件加载与启动:该程序会根据分区表加载固件到内存支持压缩固件:XZ 格式的解压blsp_boot2_check_xz_fw 多核支持: BLSP_BOOT2_CPU_GROUP_MAX 定义 CPU 数量
  3. 固件更新:OTA 更新:将新固件从临时分区复制到主分区防回滚(Anti-Rollback):防止降级到不安全版本支持 USB/UART 烧录模式,对应代码:bflb_eflash_loader_main
  4. 安全:SHA-256 校验 具有固件完整性检查

您可以在开发板存在其他 App 的同时烧录该 bin ,这并不会覆盖掉你的程序,而是只为开发板更换 bootloader.

Demo:mbedtls

Demo介绍:

这段代码对tls中的加密功能进行了全面的自检测,保证mbedtls库可以正常在平台上运行。

保存在 SDK 下的 bouffalo_sdk/examples/mbedtls

ECDH测试

函数:mbedtls_ecdh_test

测试内容:客户端和服务器分别生成公私钥对。客户端和服务器分别计算共享密钥。验证客户端和服务器计算的共享密钥是否一致

ECDSA测试

函数:mbedtls_ecdsa_test

测试内容:生成 ECDSA 密钥对。使用私钥对哈希值进行签名,生成签名。使用公钥验证签名的正确性。

涉及的算法:ECDSA数字签名;哈希算法:SHA-256。

AES测试

函数:mbedtls_aes_test

测试内容:测试 AES 的 ECB、CBC 和 CTR三种模式。验证解密后的数据是否与原始数据一致。

SHA测试

函数:mbedtls_sha_test

测试内容:测试 SHA-1、SHA-256 和 SHA-512 三种哈希算法。对输入数据进行哈希计算,输出哈希值

示例输出:

===========================
  SHA-1 test #1: passed
  SHA-1 test #2: passed
  SHA-1 test #3: passed

  SHA-224 test #1: passed
  SHA-224 test #2: passed
  SHA-224 test #3: passed
  SHA-256 test #1: passed
  SHA-256 test #2: passed
  SHA-256 test #3: passed

  SHA-384 test #1: passed
  SHA-384 test #2: passed
  SHA-384 test #3: passed
  SHA-512 test #1: passed
  SHA-512 test #2: passed
  SHA-512 test #3: passed
=========== ecdh test ================
setup rng ... ok
select ecp group SECP256R1 ... ok
Get public key time=33ms
1. ecdh client generate public parameter:
     04 BC C2 58 06 F0 C1 A2 AC 83 C2 4F C5 CD 9C ED
     A8 C3 8D C1 CF 3E 5B 52 0C 81 E1 50 15 D2 FE A1
     AE 30 62 A9 6F E3 72 97 3B E0 12 A4 EC C2 2F 22
     63 E3 AC 81 91
     
..........

aes ctr 192 block:1000 enc cost time:331 us
aes ctr 192 block:1000 dec cost time:329 us
test aes ctr 256 
aes ctr 256 block:1000 enc cost time:354 us
aes ctr 256 block:1000 dec cost time:354 us

=========== sha test ================
sha1 block:1000 cost time:415 us
sha256 block:1000 cost time:268 us
sha512 block:1000 cost time:236 us
mbedtls test success

Demo:memheap

Demo介绍:

该demo主要测试申请和释放 内存memory 的功能是否正常。在当前代码下,程序会不断申请释放 无休止直到将内存消耗殆尽。

保存在 SDK 下的: bouffalo_sdk/examples/memheap

示例输出:

ptr :hello123456789123456789123456789
get memory :411520 byte
free memory :411520 byte
remain 25244 byte
ptr :hello123456789123456789123456789
get memory :411648 byte
free memory :411648 byte
remain 25116 byte
ptr :hello123456789123456789123456789
get memory :411776 byte
free memory :411776 byte
remain 24988 byte

......

ptr :hello123456789123456789123456789
get memory :433920 byte
free memory :433920 byte
remain 2844 byte
ptr :hello123456789123456789123456789
get memory :434048 byte
free memory :434048 byte
tlsf malloc 434176 bytes failed at function bflb_malloc using heap base:0x62fc5554
remain 436900 byte
try to get 434176 byte memory failed!
memheap test fail

Demo:partition

Demo介绍:

该demo主要测试分区表获取和输出。所以这里主要要烧录whole bin,否则没有烧录分区表会导致失败。

示例输出:

======= PtTable_Config @0x62fc3cc8=======
magicCode 0x54504642; version 0x0000; entryCnt 8; age 0; crc32 0xE38928F3
idx  type device active_index     name   Address[0]  Address[1]  Length[0]   Length[1]   age
[00]  16     0         0        Boot2  0x00000000  0x00000000  0x0000e000  0x00000000  0
[01]  00     0         0           FW  0x00010000  0x00210000  0x00200000  0x00168000  0
[02]  10     0         0          mfg  0x00210000  0x00000000  0x00168000  0x00000000  0
[03]  02     0         0        media  0x00378000  0x00000000  0x00071000  0x00000000  0
[04]  03     0         0          PSM  0x003e9000  0x00000000  0x00008000  0x00000000  0
[05]  04     0         0          KEY  0x003f1000  0x00000000  0x00002000  0x00000000  0
[06]  05     0         0         DATA  0x003f3000  0x00000000  0x00005000  0x00000000  0
[07]  06     0         0      factory  0x003f8000  0x00000000  0x00008000  0x00000000  0

其中: 索引的 0 和 1 分别代表不同的区,一个是活跃的当前正在使用的,另一个是备份的用于当升级失败回滚的。

Demo:efuse_trim

Demo介绍:

该Demo主要用于验证efuse中储存的修剪数值是否正确,这些修剪值用于矫正一些模块。

保存在SDK下 : bouffalo_sdk/examples/peripherals/efuse/efuse_trim

代码解读:

  1. 初始化和设备获取
    • 调用 board_init() 初始化硬件板级配置。
    • 使用 bflb_device_get_by_name("ef_ctrl") 获取 eFuse 控制设备的句柄。
  2. 修剪值读取和验证
    • 定义了一个数组 trim_list,然后遍历 trim_list,调用 bflb_ef_ctrl_read_common_trim 读取每个修剪值。
    • 如果修剪值有效,则进一步验证其奇偶校验。如果校验通过,打印修剪值;否则提示校验错误。
    • 如果修剪值无效,提示未找到。

示例输出:

===========================
uart  sig1:ffffffff, sig2:0000f32f
clock gen1:9ffffffd, gen2:0fff0c11
xtal:40000000Hz(crystal)
board init done
===========================

eFuse read trim value case!
trim rc32m value=108!
trim rc32k value=273!
trim tsen value=2149!
case finished!

Demo:i2s_es8311

该Demo的主要用途是实现音频数据采集和播放。主要功能是初始化并配置 I2S 接口和 ES8311 音频编解码器,以实现音频数据的传输和处理。

保存在SDK下:bouffalo_sdk/examples/peripherals/i2s/i2s_es8311

代码解读:

  1. 硬件初始化:调用 board_init() 初始化硬件板级配置。初始化 GPIO 引脚i2s_gpio_init(),为 I2S 和 I2C 接口分配功能引脚。
  2. 主时钟输出:调用 mclk_out_init() 配置 I2S 的主时钟输出,为外部音频设备ES8311提供时钟信号。
  3. ES8311 音频编解码器初始化:配置 ES8311 的工作模式。调用 es8311_init() 初始化 ES8311,并设置音量。启动 ES8311 的 ADC 和 DAC 模块。
  4. I2S 和 DMA 初始化:调用 i2s_dma_init() 初始化 I2S 接口和 DMA 通道。配置 DMA 通道,启动 DMA 通道,开始音频数据的传输和接收。

示例输出:

===========================
es8311 init
read chip id failed!
SET: volume:70%
i2s init
dma init
dma lli init
tx dma lli num: 2 
rx dma lli num: 2 
tc done
rx done
tc done
rx done
tc done
rx done
tc done
rx done