[doc] update flash,usb,pm,fatfs rst

This commit is contained in:
jzlv 2021-10-14 18:54:16 +08:00
parent d66a28da5c
commit 8b587dbed2
546 changed files with 65199 additions and 460 deletions

View file

@ -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
- **烧录**

View file

@ -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 电平转换芯片

View file

@ -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

View file

@ -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 处于同一个电源域的 ITCMDTCM 等 RAM 不可使用,只有 64K 的 OCTAM 可以保存数据,可以通过内部 RTC 进行唤醒,或者使用 GPIO 引脚(在 GPIO 电源域没有关闭的情况下)唤醒
- PDS 模式: 根据不同的模式关闭不同的电源域,当关闭了 CPU 电源域时ITCMDTCM RAM 不可使用,只有 64K 的 OCRAM 可以使用
4. HBN : HBN 模式,关闭了芯片上绝大多数电源域,关闭了 CPU 以及 64K OCRAM只有位于 AON 域的 4K RAM 可以保存数据,可以通过内部 RTC 进行唤醒,或者使用特定的唤醒引脚(位于 AON 域的引脚)唤醒
- HBN 模式: 根据不同的模式关闭不同的电源域ITCMDTCM 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.2375V0.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

View file

@ -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

View file

@ -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>

View file

@ -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 盘大小为 256K64 个扇区,每个扇区 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 盘大小 256Kflash 物理地址从 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

View file

@ -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:

View file

@ -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 表示读写成功,否则读写错误

View file

@ -0,0 +1,9 @@
=======================
XIP FLASH 示例
=======================
.. toctree::
:maxdepth: 1
XIP FLASH - 数据读写 <flash_demo>