diff --git a/docs/source/api_reference/utils/index.rst b/docs/source/api_reference/utils/index.rst deleted file mode 100644 index 4b4fc1dd..00000000 --- a/docs/source/api_reference/utils/index.rst +++ /dev/null @@ -1,9 +0,0 @@ -======================= -Utils -======================= - -.. toctree:: - :maxdepth: 1 - - LIBC - VLIBC \ No newline at end of file diff --git a/docs/source/api_reference/utils/libc.rst b/docs/source/api_reference/utils/libc.rst deleted file mode 100644 index ecbfe37e..00000000 --- a/docs/source/api_reference/utils/libc.rst +++ /dev/null @@ -1,120 +0,0 @@ -LIBC -============ - -简介 ------------- - -- LIBC 中实现了一个vsnprintf,用以避开使用完整的c库,减少代码体积。 - -.. note:: LIBC 中浮点打印只能最大支持到7位小数精度 - -配置LIBC相关功能 -------------------- - -如果需要配置LIBC的相关功能需要在对应的工程目录下 `proj.conf` 文件中添加对应的代码,举例如下: - -.. code-block:: cmake - :linenos: - - # 使能浮点打印 - set(CONFIG_VSNPRINTF_FLOAT 1) - -格式化控制字符 ----------------- - -.. list-table:: - :header-rows: 1 - - * - proj.conf 配置项 - - 功能描述 - * - CONFIG_VLIBC - - 使能 **VLIBC** 库,默认使用 **LIBC** ,不配置 **CONFIG_VLIBC** 或配置为 **0** 使能 **LIBC** - * - CONFIG_VSNPRINTF_FLOAT - - 使能格式化输出 (%f, %F) 浮点数格式化支持 - * - CONFIG_VSNPRINTF_FLOAT_EX - - 使能格式化输出 (%e, %g, %E, %G) 浮点数扩展格式化支持 - * - CONFIG_VSNPRINTF_LONG_LONG - - 使能格式化输出 (%lld,%lli,%llo,%llx,%llX,%llu) 长整型格式化支持 - -.. list-table:: - :header-rows: 1 - - * - 格式化控制字符 (specifier) - - 支持情况 - * - %s - - ✔️ - * - %c - - ✔️ - * - %d - - ✔️ - * - %i - - ✔️ - * - %u - - ✔️ - * - %x (%X) - - ✔️ - * - %o - - ✔️ - * - %b - - ✔️ - * - %f (%F) - - ✔️ - * - %e (%E) - - ✔️ - * - %g (%G) - - ✔️ - * - %a (%A) - - ❌ - * - %p - - ✔️ - * - %n - - ❌ - -.. list-table:: - :header-rows: 1 - - * - 格式化控制变量长度字符 (length) - - 支持情况 - * - l - - ✔️ - * - ll - - ✔️ - * - h - - ✔️ - * - hh - - ✔️ - * - t - - ✔️ - * - j - - ✔️ - * - z - - ✔️ - -.. list-table:: - :header-rows: 1 - - * - 格式化控制标志字符 (flags) - - 支持情况 - * - 0 - - ✔️ - * - \- - - ✔️ - * - \+ - - ✔️ - * - ' ' (空格) - - ✔️ - * - # - - ✔️ - -格式化输出格式 ----------------- -.. code-block:: c - :linenos: - - /* 格式化输出控制字符格式 */ - /* %[flags][width][.precision][length][specifier] */ - printf("%+12.9f\r\n", var) - printf("%-12lld\r\n", var) - printf("%#x\r\n", var) - printf("%08x\r\n", var) - printf("% 8x\r\n", var) \ No newline at end of file diff --git a/docs/source/api_reference/utils/vlibc.rst b/docs/source/api_reference/utils/vlibc.rst deleted file mode 100644 index a29e8dd5..00000000 --- a/docs/source/api_reference/utils/vlibc.rst +++ /dev/null @@ -1,195 +0,0 @@ -VLIBC -============ - -简介 ------------- - -- VLIBC 是适用于MCU使用的C标准库 STDIO的重新实现,与标准的STDIO库具有相同的API以及相同的使用方法。 -- VLIBC 支持文件操作,诸如fopen、fwrite、fprintf等API,与Fatfs文件系统对接,为其他依赖标准C库文件操作的组件提供支持。 -- VLIBC 同时支持对外设进行操作,例如将UART当做文件进行处理,使用fprintf进行输出。 -- VLIBC 体积小、移植极简、同时可以裁剪掉对Fatfs的依赖,仅仅当做一个体积小的printf库使用。 - -.. note:: VLIBC 中浮点打印只能最大支持到11位小数精度 - -配置VLIBC相关功能 --------------------- - -如果需要配置VLIBC的相关功能需要在对应的工程目录下 `proj.conf` 文件中添加对应的代码,举例如下: - -.. code-block:: cmake - :linenos: - - # 使能浮点打印 - set(CONFIG_VSNPRINTF_FLOAT 1) - -格式化控制字符 ------------------ - -.. list-table:: - :header-rows: 1 - - * - proj.conf 配置项 - - 功能描述 - * - CONFIG_VLIBC - - 使能VLIBC库,默认使用LIBC - * - CONFIG_VLIBC_FATFS,需要启用FATFS相关功能 - - 使能VLIBC FATFS接口 - * - CONFIG_VSNPRINTF_FLOAT - - 使能格式化输出 (%f, %F) 浮点数格式化支持 - * - CONFIG_VSNPRINTF_FLOAT_EX - - 使能格式化输出 (%e, %g, %E, %G) 浮点数扩展格式化支持 - * - CONFIG_VSNPRINTF_LONG_LONG - - 使能格式化输出 (%lld,%lli,%llo,%llx,%llX,%llu) 长整型格式化支持 - * - CONFIG_VSNPRINTF_WRITEBACK - - 使能格式化字符 (%n) 字符统计支持 - -.. list-table:: - :header-rows: 1 - - * - 格式化控制字符 (specifier) - - 支持情况 - * - %s - - ✔️ - * - %c - - ✔️ - * - %d - - ✔️ - * - %i - - ✔️ - * - %u - - ✔️ - * - %x (%X) - - ✔️ - * - %o - - ✔️ - * - %b - - ✔️ - * - %f (%F) - - ✔️ - * - %e (%E) - - ✔️ - * - %g (%G) - - ✔️ - * - %a (%A) - - ❌ - * - %p - - ✔️ - * - %n - - ✔️ - -.. list-table:: - :header-rows: 1 - - * - 格式化控制变量长度字符 (length) - - 支持情况 - * - l - - ✔️ - * - ll - - ✔️ - * - h - - ✔️ - * - hh - - ✔️ - * - t - - ✔️ - * - j - - ✔️ - * - z - - ✔️ - -.. list-table:: - :header-rows: 1 - - * - 格式化控制标志字符 (flags) - - 支持情况 - * - 0 - - ✔️ - * - \- - - ✔️ - * - \+ - - ✔️ - * - ' ' (空格) - - ✔️ - * - # - - ✔️ - -格式化输出格式 --------------------- - -.. code-block:: c - :linenos: - - /* 格式化输出控制字符格式 */ - /* %[flags][width][.precision][length][specifier] */ - printf("%+12.9f\r\n", var) - printf("%-12lld\r\n", var) - printf("%#x\r\n", var) - printf("%08x\r\n", var) - printf("% 8x\r\n", var) - -IO 接口移植 ---------------- - -.. code-block:: c - :linenos: - - #define IOCONSOLE_IO ((uint32_t)0x00000001) - #define IOCONSOLE_NAME "console" - - struct bflb_device_s *uart0 = NULL; - - uint32_t __vlibc_io_init(const char *name, uint8_t mode) - { - (void)mode; - if (strcmp(name, IOCONSOLE_NAME) == 0) { - return IOCONSOLE_IO; - } else { - } - - return ENOENT; - } - - uint32_t __vlibc_io_deinit(struct __vlibc_io *io) - { - if (io->dev == IOCONSOLE_IO) { - return IOCONSOLE_IO; - } else { - } - - return EOF; - } - - size_t __vlibc_io_mem2dev(struct __vlibc_io *io, const void *ptr, size_t size) - { - if (io->dev == IOCONSOLE_IO) { - for (size_t i = 0; i < size; i++) { - bflb_uart_putchar(uart0, ((char *)ptr)[i]); - } - return size; - } else { - } - - return 0; - } - - void main(){ - - board_init(); - - uart0 = bflb_device_get_by_name("uart0"); - - vlibc_stdout = vlibc_fopen("CLICCFG = (((CLIC->CLICINFO & CLIC_INFO_CLICINTCTLBITS_Msk) >> CLIC_INFO_CLICINTCTLBITS_Pos) << CLIC_CLICCFG_NLBIT_Pos); + + /* Every interrupt should be clear by software*/ + for (i = 0; i < IRQn_LAST; i++) { + CLIC->CLICINT[i].IE = 0; + CLIC->CLICINT[i].IP = 0; + CLIC->CLICINT[i].ATTR = 1; /* use vector interrupt */ + } + + /* tspend interrupt will be clear auto*/ + /* tspend use positive interrupt */ + CLIC->CLICINT[MSOFT_IRQn].ATTR = 0x3; + + csi_dcache_enable(); + csi_icache_enable(); + + /* enable preload $ AMR for D$ */ + __set_MHINT(0x000c); + + /* disable mexstatus SPUSHEN and SPSWAPEN for ipush/ipop*/ + uint32_t mexstatus = __get_MEXSTATUS(); + mexstatus &= ~(0x3 << 16); + __set_MEXSTATUS(mexstatus); + +根据上述信息我们知道, M0 一定会在某个时刻,向这两个寄存器写入 ``IPC_SYNC_FLAG``, 从而让 D0 运行起来。而 LP 是没有条件限制的,M0 控制运行就可以了。 + +board_init +------------ + +然后就是进入 ``main`` 函数了, ``main`` 函数一开始会调用 ``board_init`` 去初始化一些内容,这里我们只需要关心 M0, 因为在此其他两个核还没有开始运行。 \ No newline at end of file diff --git a/docs/source/notes/note_flash_tool.rst b/docs/source/notes/note_flash_tool.rst new file mode 100644 index 00000000..41da7fd7 --- /dev/null +++ b/docs/source/notes/note_flash_tool.rst @@ -0,0 +1,21 @@ +Flash tool 差异 +======================= + +当前,我们提供了以下 flash tool: + +- Bouffalo Lab DevCube (GUI + CMD(bflb_mcu_tool + bflb_iot_tool)) +- bouffalo_flash_cube (GUI + CMD) + +Bouffalo Lab DevCube 会将用户的运行固件(不包含bootheader),根据界面上的 clock 和 flash 配置生成 bootheader 并与固件打包成 whole img bin, +iot 和 mcu 主要区别是烧录的文件种类不一样, iot 在烧录时除了运行固件还有 boot2/dts/mfg/media 等等。 + +而 bouffalo_flash_cube 则是直接烧录 bin 文件,如果是烧录运行固件,则是烧录 whole img bin,whole img bin 不再由工具生成,而是代码自动在固件前面增加 bootheader,后续修改非常方便。 +如果想要增加 bin 文件烧录,比如 boot2/dts/mfg/media ,则直接在 **Flash prog cfg.ini** 文件添加即可,到此 bouffalo_flash_cube 就不再有其他功能了。 + +你可能会遇到以下情况: + +- iot/mcu sdk 的单核固件(无bootheader),请用 Bouffalo Lab DevCube +- iot/mcu sdk 的单核固件(带bootheader),两者都可以 +- iot/mcu sdk 多核固件,请用 Bouffalo Lab DevCube +- BouffaloSDK 的单核固件(带bootheader),两者都可以 +- BouffaloSDK 多核固件,请用 bouffalo_flash_cube,不准使用 Bouffalo Lab DevCube \ No newline at end of file