mirror of
https://github.com/Fishwaldo/bl_mcu_sdk.git
synced 2025-07-18 18:58:38 +00:00
[doc] update flash,usb,pm,fatfs rst
This commit is contained in:
parent
d66a28da5c
commit
8b587dbed2
546 changed files with 65199 additions and 460 deletions
|
@ -147,13 +147,13 @@ BLE server 软件实现
|
|||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=ble_peripheral SUPPORT_FREERTOS=y SUPPORT_FLOAT=y SUPPORT_BLE=y
|
||||
$ make BOARD=bl706_iot APP=ble_peripheral SUPPORT_FLOAT=y
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=ble_central SUPPORT_FREERTOS=y SUPPORT_FLOAT=y SUPPORT_BLE=y
|
||||
$ make BOARD=bl706_iot APP=ble_central SUPPORT_FLOAT=y
|
||||
|
||||
|
||||
- **烧录**
|
||||
|
|
|
@ -12,13 +12,13 @@ Bouffalo Lab 为 IAP 功能应用提供了相应的 boot2_iap.bin 文件,并
|
|||
用户可以配合 Dev Cube 图形界面烧写软件,将已有的 boot2_iap.bin 文件烧录进目标板,烧录
|
||||
一次之后,就可以通过 IAP 功能,在线更新用户代码。
|
||||
|
||||
bl_mcu_sdk 开源了 boot2_iap 的软件源码,用户可以到 examples/boot2_iap 查阅代码,并完成编译烧写。编译烧写过程可以参考《快速开发指南》介绍。
|
||||
bl_mcu_sdk 开源了 boot2_iap 的软件源码,用户可以到 ``examples/boot2_iap`` 查阅代码,并完成编译烧写。编译烧写过程可以参考《快速开发指南》介绍。
|
||||
|
||||
准备工具
|
||||
-----------------------
|
||||
|
||||
- 最新版本的 Dev Cube
|
||||
- Bl706 开发板
|
||||
- BL706 开发板
|
||||
- TTL-USB 电平转换芯片
|
||||
|
||||
|
||||
|
|
|
@ -1,2 +1,161 @@
|
|||
Fatfs 文件系统读写
|
||||
====================
|
||||
FatFs 文件系统读写(SD 卡)
|
||||
===========================
|
||||
|
||||
本 demo 主要演示使用 spi 驱动 sd 卡并挂载 fatfs 文件系统的例子。其中 fatfs api 见 `Fatfs 官网 <http://elm-chan.org/fsw/ff/00index_e.html>`_。
|
||||
|
||||
准备工具
|
||||
-----------------------
|
||||
|
||||
- 一张 class10 的 sd 卡和 sd 卡转spi 转接板
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 基于 BL706_AVB 开发板,连接方式如下
|
||||
|
||||
::
|
||||
|
||||
GPIO function GPIO pin
|
||||
----------------------------------
|
||||
SD_CS <--> GPIO10
|
||||
SPI_SCK <--> GPIO19
|
||||
SPI_MISO <--> GPIO20
|
||||
SPI_MOSI <--> GPIO21
|
||||
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/spi/spi_dma_sd``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_SPI_CLOCK_SOURCE ROOT_CLOCK_SOURCE_BCLK
|
||||
#define BSP_SPI_CLOCK_DIV 0
|
||||
|
||||
- 配置 ``SPI`` 设备时钟源,见 ``bsp/board/bl706_avb/clock_config.h``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO19_FUNC GPIO_FUN_SPI
|
||||
#define CONFIG_GPIO20_FUNC GPIO_FUN_SPI
|
||||
#define CONFIG_GPIO21_FUNC GPIO_FUN_SPI
|
||||
|
||||
- 配置 ``SPI`` 设备复用引脚,见 ``bsp/board/bl706_avb/pinmux_config.h``,,如有改动,请自行修改
|
||||
|
||||
.. note:: 为适配 bl702_avb 硬件, SPI 的 MOSI 和 MISO 默认进行了调换,如果想要恢复默认,修改 ``drivers/bl702_driver/hal_drv/default_config/spi_config.h`` 中 ``SPI_SWAP_ENABLE`` 为 0
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_USING_SPI0
|
||||
|
||||
#if defined(BSP_USING_SPI0)
|
||||
#ifndef SPI0_CONFIG
|
||||
#define SPI0_CONFIG \
|
||||
{ \
|
||||
.id = 0, \
|
||||
.clk = 18000000,\
|
||||
.mode = SPI_MASTER_MODE, \
|
||||
.direction = SPI_MSB_BYTE0_DIRECTION_FIRST, \
|
||||
.clk_polaraity = SPI_POLARITY_LOW, \
|
||||
.clk_phase = SPI_PHASE_1EDGE, \
|
||||
.datasize = SPI_DATASIZE_8BIT, \
|
||||
.fifo_threshold = 4, \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
- 使能 ``BSP_USING_SPI0`` 并配置 ``SPI`` 设备配置,见 ``bsp/board/bl706_avb/peripheral_config.h``
|
||||
|
||||
.. note:: sd卡的频率不能过高,所以设置成 18M 比较合适
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_USING_DMA0_CH3
|
||||
#define BSP_USING_DMA0_CH4
|
||||
|
||||
#if defined(BSP_USING_DMA0_CH3)
|
||||
#ifndef DMA0_CH3_CONFIG
|
||||
#define DMA0_CH3_CONFIG \
|
||||
{ \
|
||||
.id = 0, \
|
||||
.ch = 3, \
|
||||
.direction = DMA_MEMORY_TO_PERIPH, \
|
||||
.transfer_mode = DMA_LLI_ONCE_MODE, \
|
||||
.src_req = DMA_REQUEST_NONE, \
|
||||
.dst_req = DMA_REQUEST_SPI0_TX, \
|
||||
.src_width = DMA_TRANSFER_WIDTH_8BIT, \
|
||||
.dst_width = DMA_TRANSFER_WIDTH_8BIT, \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(BSP_USING_DMA0_CH4)
|
||||
#ifndef DMA0_CH4_CONFIG
|
||||
#define DMA0_CH4_CONFIG \
|
||||
{ \
|
||||
.id = 0, \
|
||||
.ch = 4, \
|
||||
.direction = DMA_PERIPH_TO_MEMORY, \
|
||||
.transfer_mode = DMA_LLI_ONCE_MODE, \
|
||||
.src_req = DMA_REQUEST_SPI0_RX, \
|
||||
.dst_req = DMA_REQUEST_NONE, \
|
||||
.src_width = DMA_TRANSFER_WIDTH_8BIT, \
|
||||
.dst_width = DMA_TRANSFER_WIDTH_8BIT, \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
- 使能 ``BSP_USING_DMA0_CH3``, ``BSP_USING_DMA0_CH4`` 并配置 ``DMA`` 设备配置,见 ``bsp/board/bl706_avb/peripheral_config.h``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
void fatfs_sd_driver_register(void)
|
||||
{
|
||||
FATFS_DiskioDriverTypeDef sdDiskioDriver;
|
||||
|
||||
memset(&sdDiskioDriver, 0, sizeof(FATFS_DiskioDriverTypeDef));
|
||||
|
||||
sdDiskioDriver.MMC_disk_status = sd_disk_status;
|
||||
sdDiskioDriver.MMC_disk_initialize = sd_disk_initialize;
|
||||
sdDiskioDriver.MMC_disk_write = sd_disk_write;
|
||||
sdDiskioDriver.MMC_disk_read = sd_disk_read;
|
||||
sdDiskioDriver.MMC_disk_ioctl = sd_disk_ioctl;
|
||||
sdDiskioDriver.Translate_Result_Code = Translate_Result_Code;
|
||||
disk_driver_callback_init(&sdDiskioDriver);
|
||||
}
|
||||
|
||||
- 实现 fatfs 需要的底层接口
|
||||
|
||||
剩余代码见 main.c。
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
打开项目中提供的工程文件:spi_dma_sd.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_avb APP=spi_dma_sd
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 3.2 MiB |
Binary file not shown.
After Width: | Height: | Size: 1.9 MiB |
Binary file not shown.
Before Width: | Height: | Size: 28 KiB |
|
@ -1,95 +1,258 @@
|
|||
LowPower 低功耗评估
|
||||
Power Management
|
||||
=========================
|
||||
|
||||
简介
|
||||
------------------------
|
||||
本 demo 主要演示 bl 系列 mcu 低功耗性能。具体低功耗介绍请参考 `BL702/704/706 参考手册 <https://dev.bouffalolab.com/media/upload/doc/BL702_BL704_706_RM_zh_CN_1.1.pdf>`_。
|
||||
|
||||
博流系列芯片拥有丰富的低功耗特性,以适配不同的低功耗应用场合。为了方便用户快速的评测使用 bl 系列 MCU 低功耗性能 bl_mcu_sdk 提供了一套抽象的低功耗接口,将低功耗等级分为四个等级,分别为
|
||||
低功耗模式:
|
||||
|
||||
1. Running : Running 为 CPU 正常运行时的功耗,由客户应用代码执行的功能决定功耗。
|
||||
- Running : Running 为 CPU 正常运行时的功耗,由客户应用代码执行的功能决定功耗。
|
||||
|
||||
2. WFI :WFI 模式,CPU 的 clock 处于被 Gating 状态,CPU 停止运行,当用户退出WFI模式的时候程序将会继续运行。
|
||||
- WFI 模式:CPU 的 clock 处于被 Gating 状态,CPU 停止运行,当用户退出WFI模式的时候程序将会继续运行。
|
||||
|
||||
3. PDS : PDS 模式,关闭了芯片上大多数电源域,同时关闭了 CPU,和 CPU 处于同一个电源域的 ITCM,DTCM 等 RAM 不可使用,只有 64K 的 OCTAM 可以保存数据,可以通过内部 RTC 进行唤醒,或者使用 GPIO 引脚(在 GPIO 电源域没有关闭的情况下)唤醒。
|
||||
- PDS 模式: 根据不同的模式关闭不同的电源域,当关闭了 CPU 电源域时,ITCM,DTCM RAM 不可使用,只有 64K 的 OCRAM 可以使用。
|
||||
|
||||
4. HBN : HBN 模式,关闭了芯片上绝大多数电源域,关闭了 CPU 以及 64K OCRAM,只有位于 AON 域的 4K RAM 可以保存数据,可以通过内部 RTC 进行唤醒,或者使用特定的唤醒引脚(位于 AON 域的引脚)唤醒。
|
||||
- HBN 模式: 根据不同的模式关闭不同的电源域,ITCM,DTCM OCRAM RAM 无法使用,在 hbn0 下位于 AON 域的 4K RAM 可以使用,其他 hbn 模式下 4K RAM 也不可使用。
|
||||
|
||||
|
||||
bl_mcu_sdk 提供了一个简单的低功耗参考示例(bl_mcu_sdk examples/power/lowpower_test/),旨在帮助用户快速评估低功耗功能,如果需要进一步适配自身的低功耗场景,采取不同的低功耗策略,请查阅相关 datasheet 或者寻找 Boufflao Lab 的技术支持。
|
||||
在该示例中,外设及 CPU 的时钟选择均是晶振 32M。基于该示例的功耗测量结果如下表所示:
|
||||
演示内容:
|
||||
|
||||
+------------+------------+------------+---------------------+---------------------------+
|
||||
|模式 |参考电流 |对应基础模式|唤醒源 |备注 |
|
||||
+============+============+============+=====================+===========================+
|
||||
|Running |5.68 mA |Run | |所有外设时钟都打开 |
|
||||
+------------+------------+------------+---------------------+---------------------------+
|
||||
|WFI |3.14 mA |WFI |任意中断 |除串口外,其它外设时钟关闭 |
|
||||
+------------+------------+------------+---------------------+---------------------------+
|
||||
|PDS |10 uA |PDS 31 |内部RTC/引脚中断 |64K OCRAM保存数据 |
|
||||
+------------+------------+------------+---------------------+---------------------------+
|
||||
|HBN |1 uA |HBN 1 |内部RTC/引脚中断 |4K AON RAM保存数据 |
|
||||
+------------+------------+------------+---------------------+---------------------------+
|
||||
- pds3 使用 gpio10 外部中断下降沿唤醒
|
||||
- pds31 使用 pds 唤醒脚 (gpio6) 唤醒
|
||||
- pds31 使用 pds timer 唤醒
|
||||
- hbn0 使用 acomp (gpio11) 唤醒
|
||||
- hbn1 使用 rtc 唤醒
|
||||
- hbn2 使用 hbn 唤醒脚 (gpio12) 唤醒
|
||||
|
||||
.. note:: 高级别的唤醒源可以唤醒低级别的功耗模式,比如 hbn 唤醒脚可以唤醒所有的低功耗模式。
|
||||
|
||||
|
||||
上表中的参考电流是通过示例固件测试得出的。符合 bl70x 系列 MCU 的 spec 的描述,run wfi pds hbn 四种等级的定义简化了原先的 hbn level 以及 pds level 的设定。
|
||||
准备工具
|
||||
-----------------------
|
||||
|
||||
见 bl702_bl704_bl706_DS_EN_Combo_1.9.pdf page 28
|
||||
|
||||
.. figure:: img/powerTable.png
|
||||
|
||||
|
||||
**低功耗示例测试方法**
|
||||
------------------------
|
||||
|
||||
**编译低功耗示例代码**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
在工程目录下键入 ``make APP=lowpower_test SUPPORT_SHELL=y BOARD=bl706_lp`` 完成低功耗示例 bl706 的编译。或者直接使用 CDK 工程,完成编译下载
|
||||
您可以参考本文档《快速开发指南》来获取更多编译烧写的信息。
|
||||
|
||||
当编译并烧写成功后,连接串口到电脑端,并复位芯片,Xshell 会出现如下图所示的页面。
|
||||
|
||||
.. figure:: img/xShell_lowpower.png
|
||||
|
||||
.. note::当前 demo 仅仅只是测试三种低功耗模式的使用,如果需要测试达到手册中描述的,需要很多步骤,具体步骤请与我们联系。
|
||||
|
||||
**准备低功耗测试所需的硬件环境**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- 可以串联电流表到电源端的电路板
|
||||
- 电流表
|
||||
- 一台 PC 主机(运行 Windows 或者 Linux 系统)
|
||||
- TTL 转 USB
|
||||
|
||||
如下图所示,将电流表串联进入 bl706 模组的供电线路,通过 PC 端的串口调试助手软件,下发不同的低功耗指令,使得 bl706 进入对应的低功耗模式
|
||||
观察电流表示值,完成评估。
|
||||
- pc控制端使用串口终端软件:xshell 或者 mobaxterm
|
||||
- 可以串联电流表到电源端的电路板
|
||||
- 电流表
|
||||
- TTL 转 USB
|
||||
- 滑动变阻器
|
||||
|
||||
.. figure:: img/lowpower_arch.png
|
||||
|
||||
**使用 Xshell 开始评估低功耗性能**
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
用户可以通过在 Xshell 输入下述指令,进入对应的低功耗模式。
|
||||
|
||||
``run``
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
- 复位芯片之后,默认进入 run 模式,没有进入任何低功耗模式,芯片实际在运行 while(1); 语句。
|
||||
本 demo 基于 BL706_LP 开发板,连接方式如下
|
||||
|
||||
``wfi``
|
||||
::
|
||||
|
||||
GPIO function GPIO pin
|
||||
----------------------------------
|
||||
PDS_WAKEUP <--> GPIO6
|
||||
EXTI <--> GPIO10
|
||||
ADC <--> GPIO11
|
||||
HBN_WAKEUP <--> GPIO12
|
||||
UART0_TX <--> GPIO14
|
||||
UART0_RX <--> GPIO15
|
||||
|
||||
软件实现
|
||||
-------------------------
|
||||
|
||||
软件基于 shell 进行调试,如何注册 shell 命令这里不再说明。
|
||||
|
||||
PDS 模式
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
- 软件代码见 ``examples/pm/pds_mode_wakeup``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO6_FUNC GPIO_FUN_WAKEUP
|
||||
|
||||
- pds 唤醒脚配置,pds3 和 pds31 使用,见 ``bsp/board/bl706_lp/pinmux_config.h``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO10_FUNC GPIO_FUN_GPIO_EXTI_FALLING_EDGE
|
||||
|
||||
- 外部中断引脚配置,pds3 使用,见 ``bsp/board/bl706_lp/pinmux_config.h``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO12_FUNC GPIO_FUN_WAKEUP
|
||||
|
||||
- hbn 唤醒脚配置,pds3 和 pds31 使用,见 ``bsp/board/bl706_lp/pinmux_config.h``
|
||||
|
||||
|
||||
- 进入 wfi 模式,后面不加任何参数,进入之后,CPU 处于 clock gating 状态,降低功耗
|
||||
- 进入 wfi 模式后,任何中断会唤醒,例如 uart 中断。在 Xshell 中敲击回车会触发 BL706 UART RX 中断,因此可以通过此方法唤醒 wfi 低功耗模式。
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
``pds sleeptime``
|
||||
gpio_attach_irq(GPIO_PIN_10, gpio_int_callback);
|
||||
gpio_irq_enable(GPIO_PIN_10, ENABLE); //only used for level3
|
||||
|
||||
- 注册 gpio10 外部中断回调函数并使能
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
int pds3_enter(int argc, char *argv[])
|
||||
{
|
||||
MSG("gpio wake up case,enter pds3 mode\r\n");
|
||||
bflb_platform_delay_ms(50);
|
||||
|
||||
pm_pds_mode_enter(PM_PDS_LEVEL_3, 0); /*hbn、pds、exti gpio can wakeup*/
|
||||
BL_CASE_SUCCESS; /*level 3 can run here*/
|
||||
return 0;
|
||||
}
|
||||
int pds31_enter(int argc, char *argv[])
|
||||
{
|
||||
int second = 0;
|
||||
|
||||
if (argc == 2) {
|
||||
second = atoi(argv[1]);
|
||||
} else {
|
||||
second = 0;
|
||||
}
|
||||
MSG("gpio wake up case,enter pds31 mode\r\n");
|
||||
bflb_platform_delay_ms(50);
|
||||
|
||||
pm_pds_mode_enter(PM_PDS_LEVEL_31, second); /*hbn、pds gpio can wakeup*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
SHELL_CMD_EXPORT(pds3_enter, pds3 gpio wakeup test)
|
||||
SHELL_CMD_EXPORT(pds31_enter, pds31 gpio wakeup test)
|
||||
|
||||
- 注册进入 pds3 和 pds31 的命令
|
||||
|
||||
HBN 模式
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
- 软件代码见 ``examples/pm/hbn_mode_wakeup``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO11_FUNC GPIO_FUN_ADC
|
||||
|
||||
- adc 引脚配置,hbn0 下 acomp 使用,见 ``bsp/board/bl706_lp/pinmux_config.h``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO12_FUNC GPIO_FUN_WAKEUP
|
||||
|
||||
- hbn 唤醒脚配置,hbn0、hbn1、hbn2 使用,见 ``bsp/board/bl706_lp/pinmux_config.h``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
int hbn0_enter(int argc, char *argv[])
|
||||
{
|
||||
acomp_device_t acomp_device;
|
||||
acomp_device.id = 0;
|
||||
acomp_device.pos_ch = ACOMP_CHANNEL_ADC_CHANNEL3; /*from gpio11 adc func*/
|
||||
acomp_device.neg_ch = ACOMP_CHANNEL_0P375VBAT;
|
||||
acomp_device.pos_hysteresis_vol = ACOMP_HYSTERESIS_VOLT_50MV;
|
||||
acomp_device.neg_hysteresis_vol = ACOMP_HYSTERESIS_VOLT_50MV;
|
||||
acomp_init(&acomp_device);
|
||||
bflb_platform_delay_ms(50); /*delay for acomp*/
|
||||
|
||||
for (uint32_t i = 0; i < 30; i++) {
|
||||
MSG("status:%d\r\n", acomp_get_result(&acomp_device));
|
||||
bflb_platform_delay_ms(100);
|
||||
}
|
||||
|
||||
MSG("acomp wake up case,enter hbn0 mode\r\n");
|
||||
bflb_platform_delay_ms(50);
|
||||
|
||||
/** cpu will wakeup when acomp status change
|
||||
* please note that if you set gpio9-gpio12 with GPIO_FUN_WAKEUP,it will also wakeup this level
|
||||
* rtc can wakeup this level when sleep time do not equal 0
|
||||
**/
|
||||
pm_hbn_mode_enter(PM_HBN_LEVEL_0, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hbn1_enter(int argc, char *argv[])
|
||||
{
|
||||
int second = 0;
|
||||
|
||||
if (argc == 2) {
|
||||
second = atoi(argv[1]);
|
||||
} else {
|
||||
second = 1;
|
||||
}
|
||||
|
||||
MSG("rtc wake up case,enter hbn1 mode\r\n");
|
||||
bflb_platform_delay_ms(50);
|
||||
/** cpu will wakeup when rtc sleep time timeout
|
||||
* please note that if you set gpio9-gpio12 with GPIO_FUN_WAKEUP,it will also wakeup this level
|
||||
**/
|
||||
pm_hbn_mode_enter(PM_HBN_LEVEL_1, second);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hbn2_enter(int argc, char *argv[])
|
||||
{
|
||||
MSG("gpio wake up case,enter hbn2 mode\r\n");
|
||||
bflb_platform_delay_ms(50);
|
||||
|
||||
/*cpu will wakeup when you set gpio9-gpio12 with GPIO_FUN_WAKEUP
|
||||
* rtc can not wakeup level2
|
||||
**/
|
||||
pm_hbn_mode_enter(PM_HBN_LEVEL_2, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
- 注册进入 hbn0、hbn1、hbn2 的命令
|
||||
|
||||
|
||||
- pds 可以选择带一个 sleeptime 的参数,决定其内部 RTC 唤醒时间。如果指令不带此参数,那么默认不使用 RTC 内部唤醒,目前的固件仅支持上电复位唤醒。
|
||||
- 如果指令包含 sleeptime 参数,pds 将会在``sleeptime * clock_period`` 的时刻被唤醒,表现为复位芯片,重新打印起始报文。
|
||||
- 进入低功耗模式后,RTC 的时钟是 32K,因此 sleeptime 为 32768 时,表现为睡眠 1S 后唤醒。
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
``hbn sleeptime``
|
||||
- **CDK 编译**
|
||||
|
||||
暂无,用户可以自己添加
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_lp APP=pds_mode_wakeup
|
||||
$ make BOARD=bl706_lp APP=hbn_mode_wakeup
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
|
||||
- hbn 可以选择带一个 sleeptime 的参数,决定其内部 RTC 唤醒时间。如果指令不带此参数,那么默认不使用 RTC 内部唤醒,目前的固件仅支持上电复位唤醒。
|
||||
- 如果指令包含 sleeptime 参数,hbn 将会在``sleeptime * clock_period`` 的时刻被唤醒,表现为复位芯片,重新打印起始报文。
|
||||
- 进入低功耗模式后,RTC 的时钟是 32K,因此 sleeptime 为 32768 时,表现为睡眠 1S 后唤醒。
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
- 首先唤醒脚唤醒方式默认均为下降沿唤醒,所以需要将 GPIO6、GPIO10、GPIO12 引脚外接电阻到 3.3V。
|
||||
- acomp 变化电压阈值在 1.2375V,所以需要使用滑动电阻器,调整到 1.2375V(0.375VBAT)后再使用。
|
||||
- 打开终端,并按下 TAB 键可以列出命令。
|
||||
- 输入需要执行命令回车即可运行。
|
||||
|
||||
**PDS 模式**
|
||||
|
||||
.. figure:: img/lowpower_pds.gif
|
||||
:alt:
|
||||
|
||||
|
||||
**HBN 模式**
|
||||
|
||||
.. figure:: img/lowpower_hbn.gif
|
||||
:alt:
|
||||
|
||||
详细测试结果见 `BL702/704/706 数据手册 page 28 <https://dev.bouffalolab.com/media/upload/doc/BL702_BL704_BL706_DS_zh_CN_Combo_1.9.pdf>`_。
|
||||
|
||||
.. figure:: img/powerTable.png
|
||||
|
|
|
@ -190,7 +190,7 @@ SHELL 命令注册
|
|||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=shell SUPPORT_SHELL=y
|
||||
$ make BOARD=bl706_iot APP=shell
|
||||
|
||||
- **烧录**
|
||||
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 4.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
Binary file not shown.
After Width: | Height: | Size: 88 MiB |
|
@ -6,7 +6,7 @@ USB Device 应用
|
|||
:maxdepth: 1
|
||||
|
||||
CDC - 虚拟串口<usbd_cdc>
|
||||
MSC - U 盘<usbd_msc>
|
||||
MSC - U 盘升级<usbd_msc>
|
||||
HID - 键盘&鼠标<usbd_hid>
|
||||
VIDEO - 摄像头<usbd_video>
|
||||
AUDIO - 麦克风<usbd_audio>
|
|
@ -1,2 +1,136 @@
|
|||
MSC - U 盘
|
||||
MSC - U 盘升级
|
||||
====================
|
||||
|
||||
本 demo 主要演示使用 usb 将 xip flash 模拟成 u 盘设备,将其作为一个 BootLoader 使用,用来升级固件。
|
||||
|
||||
USB大容量存储设备类(The USB mass storage device class)是一种计算机和移动设备之间的传输协议,它允许一个通用串行总线(USB)设备来访问主机的计算设备,使两者之间进行文件传输。
|
||||
|
||||
MSC 协议介绍参考 `USB 官方文档 <https://www.usb.org/documents>`_。
|
||||
|
||||
bootloader 我们将其编译后烧录在 flash 0x2000 开始的物理地址,工具默认也是这个地址。
|
||||
|
||||
.. figure:: img/usb_msc.png
|
||||
|
||||
我们使用 flash 物理地址 0x0000c000 (48K) 开始的地方,用来模拟 u 盘,u 盘大小为 256K(64 个扇区,每个扇区 4KB ),根据文件系统格式,可以知道,数据的地址在 u 盘的第 10 个扇区(0x16000),也即 APP 的入口地址。BootLoader 与 APP 分区表如下:
|
||||
|
||||
.. figure:: img/usb_msc2.png
|
||||
|
||||
准备工具
|
||||
-----------------------
|
||||
|
||||
- 一根 usb 数据线
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
- 内部 flash 不需要额外电路
|
||||
- 外部 flash 需要连接 flash 控制器接口
|
||||
|
||||
|
||||
::
|
||||
|
||||
GPIO function GPIO pin
|
||||
----------------------------------
|
||||
USB_DP <--> GPIO7
|
||||
USB_DM <--> GPIO8
|
||||
UART0_TX <--> GPIO14
|
||||
BOOTLOADER_PIN <--> GPIO15
|
||||
|
||||
软件实现
|
||||
-------------------------
|
||||
|
||||
- 软件代码见 ``examples/usb/usb_msc_flash_boot``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BLOCK_SIZE 4096
|
||||
#define BLOCK_COUNT 64
|
||||
#define FLASH_ADDR 0x0000c000 /*addr start from 48k */
|
||||
void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
|
||||
{
|
||||
*block_num = BLOCK_COUNT;
|
||||
*block_size = BLOCK_SIZE;
|
||||
}
|
||||
int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length)
|
||||
{
|
||||
flash_read(FLASH_ADDR + sector * BLOCK_SIZE, buffer, length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length)
|
||||
{
|
||||
flash_erase(FLASH_ADDR + sector * BLOCK_SIZE, BLOCK_SIZE);
|
||||
flash_write(FLASH_ADDR + sector * BLOCK_SIZE, buffer, length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
- 实现 usb msc 需要的底层接口,u 盘大小 256K,flash 物理地址从 0x0000c000 开始。
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
gpio_set_mode(GPIO_PIN_15, GPIO_INPUT_PD_MODE);
|
||||
|
||||
if (gpio_read(GPIO_PIN_15)) {
|
||||
MSG("*************Welcome to usb msc boot,update your app bin*************\r\n");
|
||||
|
||||
usbd_desc_register(msc_ram_descriptor);
|
||||
usbd_msc_class_init(MSC_OUT_EP, MSC_IN_EP);
|
||||
|
||||
usb_fs = usb_dc_init();
|
||||
|
||||
if (usb_fs) {
|
||||
device_control(usb_fs, DEVICE_CTRL_SET_INT, (void *)(USB_EP4_DATA_OUT_IT | USB_EP5_DATA_IN_IT));
|
||||
}
|
||||
while (!usb_device_is_configured()) {
|
||||
}
|
||||
} else {
|
||||
uint8_t bin_header;
|
||||
flash_read(FLASH_ADDR + 10 * BLOCK_SIZE, &bin_header, 1);
|
||||
if ((bin_header == 0x00) && (bin_header == 0xff)) {
|
||||
MSG("*************Illegal bin!! Please update your bin*************\r\n");
|
||||
while (1) {
|
||||
}
|
||||
}
|
||||
|
||||
MSG("*************Let's go to application*************\r\n");
|
||||
bflb_platform_delay_ms(20);
|
||||
bflb_platform_deinit();
|
||||
hal_jump2app(FLASH_ADDR + 10 * BLOCK_SIZE);
|
||||
}
|
||||
|
||||
- 配置 GPIO15 作为输入模式,默认拉低,拉高进入 u 盘升级。
|
||||
- 如果 GPIO15 为高,则进入 u 盘 升级程序。
|
||||
- 如果 GPIO15 为低,则表示不需要升级直接进入 app,此时需要修改内存映射地址,将逻辑地址映射的物理地址(flash offset )从 0x2000 改成实际 app 存储在 flash 的地址为:FLASH_ADDR + 10 * BLOCK_SIZE。
|
||||
- ``hal_jump2app`` 中对物理地址进行了判断,bootloader 程序预留 48K,物理地址小于 4M。
|
||||
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
暂无,用户可以自己添加
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=usb_msc_flash_boot
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
- 将 GPIO15 拉高,然后使用 USB 数据线插到电脑上,识别出一个 U 盘。
|
||||
- 将编译的 APP bin 文件拖入 U 盘。
|
||||
- 拔下 USB ,拉低 GPIO15,供电以后进入 APP 。
|
||||
|
||||
.. figure:: img/usb_msc3.gif
|
|
@ -85,9 +85,7 @@ BL706 AVB + GC0308摄像头模块 + windows 相机
|
|||
#define CONFIG_GPIO30_FUNC GPIO_FUN_CAM
|
||||
#define CONFIG_GPIO31_FUNC GPIO_FUN_CAM
|
||||
|
||||
- 使用到的 GPIO 配置见 ``bsp/board/bl706_avb/pinmux_config.h``,默认提供了该 demo 的引脚配置
|
||||
|
||||
.. note:: ``bsp/board/bl706_avb/pinmux_config.h`` 当前给所有的示例 demo 使用,所以,需要先选定 ``PINMUX_SELECT`` 为 ``PINMUX_UVC``,开启 UVC demo
|
||||
- 使用到的 GPIO 配置见 ``bsp/board/bl706_avb/pinmux_config.h``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
XIP FLASH - 数据读写
|
||||
======================
|
||||
|
||||
本 demo 主要演示 xip flash 基本的数据读写功能。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
- 内部 flash 不需要额外电路
|
||||
- 外部 flash 需要连接 flash 控制器接口
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/flash/flash_rw``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* erase 0x00010000 16k flash */
|
||||
flash_erase(0x00010000, 16 * 1024);
|
||||
|
||||
/* write 0x00010000 flash data */
|
||||
flash_write(0x00010000, writeTestData, sizeof(writeTestData));
|
||||
|
||||
memset(readTestData, 0, 256);
|
||||
|
||||
/* read 0x00010000 flash data */
|
||||
flash_read(0x00010000, readTestData, sizeof(readTestData));
|
||||
|
||||
- 擦除 flash 物理地址 0x00010000 开始的 16K 内容
|
||||
- 从flash 物理地址 0x00010000 开始写入用户数据
|
||||
- 从flash 物理地址 0x00010000 开始读取用户数据
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
打开项目中提供的工程文件:flash_rw.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=flash_rw
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
打开串口,如果显示 case success 表示读写成功,否则读写错误
|
|
@ -0,0 +1,9 @@
|
|||
=======================
|
||||
XIP FLASH 示例
|
||||
=======================
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
XIP FLASH - 数据读写 <flash_demo>
|
Loading…
Add table
Add a link
Reference in a new issue