From 24d03e890b12638190a9be8b0ccec1c31e6fbe9d Mon Sep 17 00:00:00 2001 From: jzlv Date: Fri, 24 Feb 2023 21:35:25 +0800 Subject: [PATCH] [doc] update demo rst --- .../source/api_reference/components/bflog.rst | 482 ------------------ .../source/api_reference/components/fatfs.rst | 2 - .../api_reference/components/freertos.rst | 2 - .../components/img/bflog_log.png | Bin 121323 -> 0 bytes .../source/api_reference/components/index.rst | 12 - docs/source/api_reference/components/lua.rst | 31 -- .../source/api_reference/components/shell.rst | 2 - docs/source/get_started/flash_prog.rst | 8 +- docs/source/get_started/linux_wsl.rst | 34 +- docs/source/get_started/repo.rst | 8 +- docs/source/get_started/windows_cmd.rst | 14 +- docs/source/notes/note_dma.rst | 2 +- docs/source/samples/components/freertos.rst | 72 --- docs/source/samples/components/index.rst | 10 - .../samples/peripherals/adc/adc_dma.rst | 137 +++++ .../samples/peripherals/adc/adc_int.rst | 97 ++++ .../samples/peripherals/adc/adc_poll.rst | 11 +- .../peripherals/adc/adc_poll_diff_mode.rst | 90 ++++ .../samples/peripherals/adc/adc_tsen.rst | 75 +++ .../samples/peripherals/adc/adc_vbat.rst | 86 ++++ docs/source/samples/peripherals/adc/index.rst | 91 +++- .../samples/peripherals/dac/dac_dma.rst | 100 ++++ .../samples/peripherals/dac/dac_polling.rst | 21 +- docs/source/samples/peripherals/dac/index.rst | 26 +- .../peripherals/gpio/gpio_input_output.rst | 58 +++ .../peripherals/gpio/gpio_interrupt.rst | 52 ++ .../source/samples/peripherals/gpio/index.rst | 22 + .../samples/peripherals/i2c/i2c_10_bit.rst | 92 ++++ .../samples/peripherals/i2c/i2c_eeprom.rst | 120 +++++ .../peripherals/i2c/i2c_eeprom_dma.rst | 202 ++++++++ .../peripherals/i2c/i2c_eeprom_interrupt.rst | 210 ++++++++ docs/source/samples/peripherals/i2c/index.rst | 34 ++ docs/source/samples/peripherals/index.rst | 4 + docs/source/samples/peripherals/ir/index.rst | 34 ++ docs/source/samples/peripherals/ir/ir_nec.rst | 115 +++++ docs/source/samples/peripherals/ir/ir_rc5.rst | 115 +++++ docs/source/samples/peripherals/ir/ir_swm.rst | 105 ++++ .../samples/peripherals/ir/ir_tx_dma.rst | 151 ++++++ .../samples/peripherals/iso11898/index.rst | 32 ++ .../iso11898/iso11898_selftest.rst | 68 +++ .../samples/peripherals/uart/uart_dma.rst | 6 - .../samples/peripherals/uart/uart_poll.rst | 6 - 42 files changed, 2148 insertions(+), 691 deletions(-) delete mode 100644 docs/source/api_reference/components/bflog.rst delete mode 100644 docs/source/api_reference/components/fatfs.rst delete mode 100644 docs/source/api_reference/components/freertos.rst delete mode 100644 docs/source/api_reference/components/img/bflog_log.png delete mode 100644 docs/source/api_reference/components/index.rst delete mode 100644 docs/source/api_reference/components/lua.rst delete mode 100644 docs/source/api_reference/components/shell.rst delete mode 100644 docs/source/samples/components/freertos.rst delete mode 100644 docs/source/samples/components/index.rst create mode 100644 docs/source/samples/peripherals/adc/adc_dma.rst create mode 100644 docs/source/samples/peripherals/adc/adc_int.rst create mode 100644 docs/source/samples/peripherals/adc/adc_poll_diff_mode.rst create mode 100644 docs/source/samples/peripherals/adc/adc_tsen.rst create mode 100644 docs/source/samples/peripherals/adc/adc_vbat.rst create mode 100644 docs/source/samples/peripherals/dac/dac_dma.rst create mode 100644 docs/source/samples/peripherals/gpio/gpio_input_output.rst create mode 100644 docs/source/samples/peripherals/gpio/gpio_interrupt.rst create mode 100644 docs/source/samples/peripherals/gpio/index.rst create mode 100644 docs/source/samples/peripherals/i2c/i2c_10_bit.rst create mode 100644 docs/source/samples/peripherals/i2c/i2c_eeprom.rst create mode 100644 docs/source/samples/peripherals/i2c/i2c_eeprom_dma.rst create mode 100644 docs/source/samples/peripherals/i2c/i2c_eeprom_interrupt.rst create mode 100644 docs/source/samples/peripherals/i2c/index.rst create mode 100644 docs/source/samples/peripherals/ir/index.rst create mode 100644 docs/source/samples/peripherals/ir/ir_nec.rst create mode 100644 docs/source/samples/peripherals/ir/ir_rc5.rst create mode 100644 docs/source/samples/peripherals/ir/ir_swm.rst create mode 100644 docs/source/samples/peripherals/ir/ir_tx_dma.rst create mode 100644 docs/source/samples/peripherals/iso11898/index.rst create mode 100644 docs/source/samples/peripherals/iso11898/iso11898_selftest.rst diff --git a/docs/source/api_reference/components/bflog.rst b/docs/source/api_reference/components/bflog.rst deleted file mode 100644 index 5297eb8f..00000000 --- a/docs/source/api_reference/components/bflog.rst +++ /dev/null @@ -1,482 +0,0 @@ -BFLOG -============= - -简介 ------------- - -- BFLOG 是一个移植简单,功能多样的多线程日志记录库 -- 具有同步异步两种工作模式,异步模式如果缓冲区溢出会将最早的一条记录完整删除 -- 总体三部分、记录器、定向输出、格式化器 -- 一个记录器可多重定向输出,可同时输出到缓冲区、IO外设、文件、文件大小划分、文件时间划分 -- 定向到文件输出,支持设定保留数量,支持按文件大小划分,支持按时间划分 -- 每个定向输出可单独设定格式化器、输出等级、TAG标签过滤、输出方式、颜色 -- 格式化器支持简单格式、用户自定义格式、YAML格式(实现中)、CSV格式(规划中) -- 六级日志等级控制, FATAL、ERROR、WARNING、INFO、DEBUG、TRACE -- 支持等级、TAG标签、函数、行数、文件名、TICK数、TIME、线程信息输出 -- 支持等级、TAG标签过滤功能 -- 可对不需要的等级、功能、标签进行裁剪,缩小代码体积 - -.. figure:: img/bflog_log.png - :align: center - - log 样式 - -配置BFLOG相关功能 -------------------- - -如果需要配置BFLOG的相关功能需要在对应的工程目录下 `proj.conf` 文件中添加对应的代码,举例如下: - -以下是一个不支持文件输出的 `proj.conf` 配置 - -.. code-block:: cmake - :linenos: - - # 使能 BFLOG - set(CONFIG_BFLOG 1) - # 使能参数检查, 可不开启 - set(CONFIG_BFLOG_DEBUG 1) - -此外在 `proj.conf` 配置中添加以下配置可以使用用户的 **bflog_user.h** 配置文件,配置文件默认为 **bflog_default.h** - -.. code-block:: cmake - :linenos: - - # 使能 BFLOG_USER 配置文件 - set(CONFIG_BFLOG_USER 1) - -Macros ------------- - -BFLOG_CSI -^^^^^^^^^^^^^^^^^^^^ - -Control Sequence Introducer -用于控制终端 - -.. code-block:: c - :linenos: - - #define BFLOG_CSI_START "\033[" - #define BFLOG_CSI_CUU "A" - #define BFLOG_CSI_CUD "B" - #define BFLOG_CSI_CUF "C" - #define BFLOG_CSI_CUB "D" - #define BFLOG_CSI_CNL "E" - #define BFLOG_CSI_CPL "F" - #define BFLOG_CSI_CHA "G" - #define BFLOG_CSI_CUP "H" - #define BFLOG_CSI_ED "J" - #define BFLOG_CSI_EL "K" - #define BFLOG_CSI_SU "S" - #define BFLOG_CSI_SD "T" - #define BFLOG_CSI_SGR "m" - -BFLOG_SGR -^^^^^^^^^^^^^^^^^^^^ - -Select Graphic Rendition -用于文字图形 - -.. code-block:: c - :linenos: - - #define BFLOG_SGR_RESET "0" - #define BFLOG_SGR_BOLD "1" - #define BFLOG_SGR_FAINT "2" - #define BFLOG_SGR_ITALICS "3" - #define BFLOG_SGR_UNDERLINE "4" - #define BFLOG_SGR_BLINKS "5" - #define BFLOG_SGR_BLINKR "6" - #define BFLOG_SGR_REVERSE "7" - #define BFLOG_SGR_HIDE "8" - #define BFLOG_SGR_STRIKE "9" - #define BFLOG_SGR_NORMAL "22" - #define BFLOG_SGR_FG_BLACK "30" - #define BFLOG_SGR_FG_RED "31" - #define BFLOG_SGR_FG_GREEN "32" - #define BFLOG_SGR_FG_YELLOW "33" - #define BFLOG_SGR_FG_BLUE "34" - #define BFLOG_SGR_FG_MAGENTA "35" - #define BFLOG_SGR_FG_CYAN "36" - #define BFLOG_SGR_FG_WHITE "37" - #define BFLOG_SGR_BG_BLACK "40" - #define BFLOG_SGR_BG_RED "41" - #define BFLOG_SGR_BG_GREEN "42" - #define BFLOG_SGR_BG_YELLOW "43" - #define BFLOG_SGR_BG_BLUE "44" - #define BFLOG_SGR_BG_MAGENTA "45" - #define BFLOG_SGR_BG_CYAN "46" - #define BFLOG_SGR_BG_WHITE "47" - -BFLOG_COLOR -^^^^^^^^^^^^^^^^^^^^ - -一系列颜色用于配置使用 - -.. code-block:: c - :linenos: - - #define BFLOG_COLOR_START BFLOG_CSI_START - #define BFLOG_COLOR_END BFLOG_CSI_SGR - #define BFLOG_CLOLR_SEP ";" - #define BFLOG_COLOR_DEFAULT - #define BFLOG_COLOR_RESET BFLOG_SGR_RESET BFLOG_CLOLR_SEP - #define BFLOG_COLOR_FG_NONE - #define BFLOG_COLOR_FG_BLACK BFLOG_SGR_FG_BLACK BFLOG_CLOLR_SEP - #define BFLOG_COLOR_FG_RED BFLOG_SGR_FG_RED BFLOG_CLOLR_SEP - #define BFLOG_COLOR_FG_GREEN BFLOG_SGR_FG_GREEN BFLOG_CLOLR_SEP - #define BFLOG_COLOR_FG_YELLOW BFLOG_SGR_FG_YELLOW BFLOG_CLOLR_SEP - #define BFLOG_COLOR_FG_BLUE BFLOG_SGR_FG_BLUE BFLOG_CLOLR_SEP - #define BFLOG_COLOR_FG_MAGENTA BFLOG_SGR_FG_MAGENTA BFLOG_CLOLR_SEP - #define BFLOG_COLOR_FG_CYAN BFLOG_SGR_FG_CYAN BFLOG_CLOLR_SEP - #define BFLOG_COLOR_FG_WHITE BFLOG_SGR_FG_WHITE BFLOG_CLOLR_SEP - #define BFLOG_COLOR_BG_NONE - #define BFLOG_COLOR_BG_BLACK BFLOG_SGR_BG_BLACK BFLOG_CLOLR_SEP - #define BFLOG_COLOR_BG_RED BFLOG_SGR_BG_RED BFLOG_CLOLR_SEP - #define BFLOG_COLOR_BG_GREEN BFLOG_SGR_BG_GREEN BFLOG_CLOLR_SEP - #define BFLOG_COLOR_BG_YELLOW BFLOG_SGR_BG_YELLOW BFLOG_CLOLR_SEP - #define BFLOG_COLOR_BG_BLUE BFLOG_SGR_BG_BLUE BFLOG_CLOLR_SEP - #define BFLOG_COLOR_BG_MAGENTA BFLOG_SGR_BG_MAGENTA BFLOG_CLOLR_SEP - #define BFLOG_COLOR_BG_CYAN BFLOG_SGR_BG_CYAN BFLOG_CLOLR_SEP - #define BFLOG_COLOR_BG_WHITE BFLOG_SGR_BG_WHITE BFLOG_CLOLR_SEP - -BFLOG_COLOR_CONTROL -^^^^^^^^^^^^^^^^^^^^ - -默认配置的各等级LOG颜色 - -.. code-block:: c - :linenos: - - #ifndef BFLOG_COLOR_FATAL - #define BFLOG_COLOR_FATAL BFLOG_COLOR_FG_MAGENTA BFLOG_COLOR_BG_NONE BFLOG_SGR_BLINKS - #endif - - #ifndef BFLOG_COLOR_ERROR - #define BFLOG_COLOR_ERROR BFLOG_COLOR_FG_RED BFLOG_COLOR_BG_NONE BFLOG_SGR_NORMAL - #endif - - #ifndef BFLOG_COLOR_WARN - #define BFLOG_COLOR_WARN BFLOG_COLOR_FG_YELLOW BFLOG_COLOR_BG_NONE BFLOG_SGR_NORMAL - #endif - - #ifndef BFLOG_COLOR_INFO - #define BFLOG_COLOR_INFO BFLOG_COLOR_FG_NONE BFLOG_COLOR_BG_NONE BFLOG_SGR_RESET - #endif - - #ifndef BFLOG_COLOR_DEBUG - #define BFLOG_COLOR_DEBUG BFLOG_COLOR_FG_WHITE BFLOG_COLOR_BG_NONE BFLOG_SGR_NORMAL - #endif - - #ifndef BFLOG_COLOR_TRACE - #define BFLOG_COLOR_TRACE BFLOG_COLOR_FG_WHITE BFLOG_COLOR_BG_NONE BFLOG_SGR_FAINT - #endif - -BFLOG_LEVEL_STRING -^^^^^^^^^^^^^^^^^^^^ - -默认配置的各等级提示信息 - -.. code-block:: c - :linenos: - - #ifndef BFLOG_LEVEL_FATAL_STRING - #define BFLOG_LEVEL_FATAL_STRING "FATL" - #endif - - #ifndef BFLOG_LEVEL_ERROR_STRING - #define BFLOG_LEVEL_ERROR_STRING "ERRO" - #endif - - #ifndef BFLOG_LEVEL_WARN_STRING - #define BFLOG_LEVEL_WARN_STRING "WARN" - #endif - - #ifndef BFLOG_LEVEL_INFO_STRING - #define BFLOG_LEVEL_INFO_STRING "INFO" - #endif - - #ifndef BFLOG_LEVEL_DEBUG_STRING - #define BFLOG_LEVEL_DEBUG_STRING "DBUG" - #endif - - #ifndef BFLOG_LEVEL_TRACE_STRING - #define BFLOG_LEVEL_TRACE_STRING "TRAC" - #endif - -BFLOG_LEVEL -^^^^^^^^^^^^^^^^^^^^ - -用于配置 recorder 和 direct 的 LOG等级 - -.. code-block:: c - :linenos: - - #define BFLOG_LEVEL_FATAL 0x00 /*!< level fatal, create a panic */ - #define BFLOG_LEVEL_ERROR 0x01 /*!< level error */ - #define BFLOG_LEVEL_WARN 0x02 /*!< level warning */ - #define BFLOG_LEVEL_INFO 0x03 /*!< level information */ - #define BFLOG_LEVEL_DEBUG 0x04 /*!< level debug */ - #define BFLOG_LEVEL_TRACE 0x05 /*!< level trace information */ - - -BFLOG_FLAG -^^^^^^^^^^^^^^^^^^^^ - -用于配置 recorder 和 direct 的功能 - -.. code-block:: c - :linenos: - - #define BFLOG_FLAG_LEVEL ((uint8_t)0x01) /*!< supported print level */ - #define BFLOG_FLAG_TAG ((uint8_t)0x02) /*!< supported record tag */ - #define BFLOG_FLAG_FUNC ((uint8_t)0x04) /*!< supported record function */ - #define BFLOG_FLAG_LINE ((uint8_t)0x08) /*!< supported record line */ - #define BFLOG_FLAG_FILE ((uint8_t)0x10) /*!< supported record file */ - #define BFLOG_FLAG_CLK ((uint8_t)0x20) /*!< supported record clock */ - #define BFLOG_FLAG_TIME ((uint8_t)0x40) /*!< supported record time */ - #define BFLOG_FLAG_THREAD ((uint8_t)0x80) /*!< supported record thread */ - - -BFLOG_MODE -^^^^^^^^^^^^^^^^^^^^ - -用于配置 recorder 的模式 - -.. code-block:: c - :linenos: - - #define BFLOG_MODE_SYNC ((uint8_t)0x00) - #define BFLOG_MODE_ASYNC ((uint8_t)0x01) - -BFLOG_COMMAND -^^^^^^^^^^^^^^^^^^^^ - -用于 bflog_control 第二个参数 - -.. code-block:: c - :linenos: - - #define BFLOG_CMD_FLAG ((uint32_t)0x01) - #define BFLOG_CMD_LEVEL ((uint32_t)0x02) - #define BFLOG_CMD_QUEUE_POOL ((uint32_t)0x03) - #define BFLOG_CMD_QUEUE_SIZE ((uint32_t)0x04) - #define BFLOG_CMD_QUEUE_RST ((uint32_t)0x05) - #define BFLOG_CMD_ENTER_CRITICAL ((uint32_t)0x06) - #define BFLOG_CMD_EXIT_CRITICAL ((uint32_t)0x07) - #define BFLOG_CMD_FLUSH_NOTICE ((uint32_t)0x08) - #define BFLOG_CMD_MODE ((uint32_t)0x09) - -BFLOG_DIRECT_COMMAND -^^^^^^^^^^^^^^^^^^^^ - -用于 bflog_direct_control 第二个参数 - -.. code-block:: c - :linenos: - - #define BFLOG_DIRECT_CMD_ILLEGAL ((uint32_t)0x00) - #define BFLOG_DIRECT_CMD_LEVEL ((uint32_t)0x02) - #define BFLOG_DIRECT_CMD_LOCK ((uint32_t)0x06) - #define BFLOG_DIRECT_CMD_UNLOCK ((uint32_t)0x07) - #define BFLOG_DIRECT_CMD_COLOR ((uint32_t)0x0A) - -BFLOG_DIRECT_COMMAND -^^^^^^^^^^^^^^^^^^^^ - -用于 bflog_direct_create 第二个参数 - -.. code-block:: c - :linenos: - - #define BFLOG_DIRECT_TYPE_ILLEGAL ((uint8_t)0x00) - #define BFLOG_DIRECT_TYPE_BUFFER ((uint8_t)0x01) - #define BFLOG_DIRECT_TYPE_STREAM ((uint8_t)0x02) - #define BFLOG_DIRECT_TYPE_FILE ((uint8_t)0x03) - #define BFLOG_DIRECT_TYPE_FILE_TIME ((uint8_t)0x04) - #define BFLOG_DIRECT_TYPE_FILE_SIZE ((uint8_t)0x05) - -BFLOG_DIRECT_COLOR -^^^^^^^^^^^^^^^^^^^^ - -用于 bflog_direct_create 第三个参数 - -.. code-block:: c - :linenos: - - #define BFLOG_DIRECT_COLOR_DISABLE ((uint8_t)0) - #define BFLOG_DIRECT_COLOR_ENABLE ((uint8_t)1) - -BFLOG_LAYOUT_TYPE -^^^^^^^^^^^^^^^^^^^^ - -用于 bflog_layout_create 第二个参数 - -.. code-block:: c - :linenos: - - #define BFLOG_LAYOUT_TYPE_SIMPLE ((uint8_t)0) - #define BFLOG_LAYOUT_TYPE_FORMAT ((uint8_t)1) - #define BFLOG_LAYOUT_TYPE_YAML ((uint8_t)2) - -Port Functions ------------- - -bflog_clock -^^^^^^^^^^^^^^^^^^^^ - -获取当前cpu时钟数 - -.. code-block:: c - :linenos: - - uint64_t bflog_clock(void); - -bflog_time -^^^^^^^^^^^^^^^^^^^^ - -获取当前UTC时间戳 - -.. code-block:: c - :linenos: - - uint32_t bflog_time(void); - -bflog_thread -^^^^^^^^^^^^^^^^^^^^ - -获取当前线程名称 - -.. code-block:: c - :linenos: - - char *bflog_thread(void); - -Global Functions ------------- - -bflog_global_filter -^^^^^^^^^^^^^^^^^^^^ - -用于对标签过滤器进行全局的开关,会影响所有的recorder和direct - -.. code-block:: c - :linenos: - - int bflog_global_filter(void *tag_string, uint8_t enable); - -.. list-table:: - :widths: 10 10 - :header-rows: 1 - - * - parameter - - description - * - tag_string - - 标签字符串的指针 - * - enable - - 是否使能 - - -Recorder Functions ------------- - -recorder负责收集日志, 具有illegal、ready、running、suspend四种状态 -running状态可以收集日志, ready、suspend状态可以对其进行配置 -除level配置操作外, 其他配置操作必须在ready、suspend下 - -bflog_create -^^^^^^^^^^^^^^^^^^^^ - -创建一个recorder, 需要定义一个bflog_t结构体并将其指针传入,定义一块内存数组用于换冲 -成功返回0,失败返回-1 - -.. code-block:: c - :linenos: - - int bflog_create(bflog_t *log, void *pool, uint16_t size, uint8_t mode); - -.. list-table:: - :widths: 10 10 - :header-rows: 1 - - * - parameter - - description - * - log - - recorder 指针 - * - pool - - 用于缓冲的数组 - * - size - - 用户缓冲的数组大小 - * - mode - - BFLOG_MODE - -bflog_delete -^^^^^^^^^^^^^^^^^^^^ - -删除一个recorder -处于ready、suspend -线程安全的 -成功返回0,失败返回-1 - -.. code-block:: c - :linenos: - - int bflog_delete(bflog_t *log); - -.. list-table:: - :widths: 10 10 - :header-rows: 1 - - * - parameter - - description - * - log - - recorder 指针 - -bflog_append -^^^^^^^^^^^^^^^^^^^^ - -将一个direct添加到此recorder -处于ready、suspend -线程安全的 -成功返回0,失败返回-1 - -.. code-block:: c - :linenos: - - int bflog_append(bflog_t *log, bflog_direct_t *direct); - -.. list-table:: - :widths: 10 10 - :header-rows: 1 - - * - parameter - - description - * - log - - recorder 指针 - * - direct - - direct 指针 - -bflog_remove -^^^^^^^^^^^^^^^^^^^^ - -将一个direct从recorder移除 -处于ready、suspend -线程安全的 -成功返回0,失败返回-1 - -.. code-block:: c - :linenos: - - int bflog_remove(bflog_t *log, bflog_direct_t *direct); - -.. list-table:: - :widths: 10 10 - :header-rows: 1 - - * - parameter - - description - * - log - - recorder 指针 - * - direct - - direct 指针 - diff --git a/docs/source/api_reference/components/fatfs.rst b/docs/source/api_reference/components/fatfs.rst deleted file mode 100644 index 9bc77ac9..00000000 --- a/docs/source/api_reference/components/fatfs.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fatfs -============= \ No newline at end of file diff --git a/docs/source/api_reference/components/freertos.rst b/docs/source/api_reference/components/freertos.rst deleted file mode 100644 index 96ff86db..00000000 --- a/docs/source/api_reference/components/freertos.rst +++ /dev/null @@ -1,2 +0,0 @@ -FreeRTOS -============= \ No newline at end of file diff --git a/docs/source/api_reference/components/img/bflog_log.png b/docs/source/api_reference/components/img/bflog_log.png deleted file mode 100644 index a415d781b52ca2e14fbfb930c5bedd54d1bf400c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121323 zcmZU)Wl$YW7d3i-LpW$~cXtl%?(V_eU4s+c-8Jyw5}W|RA-JC4?(XjP@z$;H)~&if z#;Ut#_Vn!Dy?d=SQ7TH($O!ld00014Rz^Y%0D$@Rd7ch}{@l03MhSc#;GJc3+yDS{ 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�>i@b8C0j{34qoIQ~rOW}Y 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

V#q@S9r^wWYkRte*!8;ApCO-C-vy>Jji3T==)! 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 - Fatfs - FreeRTOS - LUA - Shell diff --git a/docs/source/api_reference/components/lua.rst b/docs/source/api_reference/components/lua.rst deleted file mode 100644 index bca44090..00000000 --- a/docs/source/api_reference/components/lua.rst +++ /dev/null @@ -1,31 +0,0 @@ -LUA -============= - -简介 ------------- -- 目前移植完成的LUA版本是5.4.4 -- LUA5.4中数字全部为number类型,但对应到c隐式分成浮点型和整形,需要在luaconf中配置浮点型和整形对应的类型 -- LUA交互式编程(REPL)还未移植完成 - -不兼容项 ------------- - -.. list-table:: - :header-rows: 1 - - * - 不兼容项名称 - - 描述 - * - string.format %p - - 输出始终为0x????????形式 - * - string.format %q - - 不支持浮点变量 - * - string.format %f - - 输出最大小数位数11位,更高位数会丢失精度 - * - string.format %a - - 不支持p-计数法 - * - os.getenv - - 返回为NULL - * - os.tmpname - - 返回为NULL - * - 文件操作的读取 - - 不支持”n”读取单独读数字 diff --git a/docs/source/api_reference/components/shell.rst b/docs/source/api_reference/components/shell.rst deleted file mode 100644 index 4b2034f2..00000000 --- a/docs/source/api_reference/components/shell.rst +++ /dev/null @@ -1,2 +0,0 @@ -Shell -============= \ No newline at end of file diff --git a/docs/source/get_started/flash_prog.rst b/docs/source/get_started/flash_prog.rst index cc74d328..4e26157a 100644 --- a/docs/source/get_started/flash_prog.rst +++ b/docs/source/get_started/flash_prog.rst @@ -20,13 +20,13 @@ Flash prog cfg.ini 的使用 # 0: not use isp mode, #1: isp mode boot2_isp_mode = 0 - [firmware] + [FW] filedir = ./build/build_out/xxx*_$(CHIPNAME).bin address = 0x0000 - **cfg** 表示烧录时的一些配置,正常不需要改动 -- **firmware** 要烧录的应用固件,必须使用 **firmware** 名称。 +- **FW** 要烧录的应用固件,必须使用 **FW** 名称。 - **filedir** 表示应用固件所在相对路径,正常来说是编译完后放在 `build/build_out` 目录。 ``_$(CHIPNAME).bin`` 是必须要的后缀,用于区分不同芯片。 ``xxx`` 表示应用固件名称,与 `CMakeLists.txt` 中 `project(xxx)` 中名称一致。 ``*`` 表示正则匹配,可用可不用。 - **address** 必须使用 0 地址 @@ -46,7 +46,7 @@ Flash prog cfg.ini 的使用 # 0: not use isp mode, #1: isp mode boot2_isp_mode = 0 - [firmware] + [FW] filedir = ./build/build_out/xxx*_$(CHIPNAME).bin address = 0x10000 @@ -63,7 +63,7 @@ Flash prog cfg.ini 的使用 address = 0x210000 - **cfg** 表示烧录时的一些配置,正常不需要改动 -- **firmware** 要烧录的应用固件,必须使用 **firmware** 名称。 +- **FW** 要烧录的应用固件,必须使用 **FW** 名称。 - **filedir** 表示应用固件所在相对路径,正常来说是编译完后放在 `build/build_out` 目录。 ``_$(CHIPNAME).bin`` 是必须要的后缀,用于区分不同芯片。 ``xxx`` 表示应用固件名称,与 `CMakeLists.txt` 中 `project(xxx)` 中名称一致。 - **address** 由 `partition_xxx.toml` 指定 diff --git a/docs/source/get_started/linux_wsl.rst b/docs/source/get_started/linux_wsl.rst index 07bb433c..63b97839 100644 --- a/docs/source/get_started/linux_wsl.rst +++ b/docs/source/get_started/linux_wsl.rst @@ -3,7 +3,7 @@ Build with Linux or WSL ================================ -本节主要介绍如何在 Linux 或者 WSL 下使用 **命令行** 进行开发。Windows 下如何安装 WSL 请自行百度。 +本节主要介绍如何在 Linux 或者 WSL 下使用 **命令行** 进行开发。Windows 下如何安装 WSL 以及 WSL1/WSL2 下如何使用串口请自行百度。 环境搭建 ----------------- @@ -67,22 +67,6 @@ Build with Linux or WSL Supported LTO compression algorithms: zlib gcc version 10.2.0 (Xuantie-900 elf newlib gcc Toolchain V2.2.5 B-20220323) - -- 在 linux 中,有严格的权限限制,通常一个用户对应一个权限,所以如果提示下面信息,表示需要设置权限。因此,我们将使用到的工具都设置好权限即可 - -.. figure:: img/cmake_error.png - :align: center - -进入 sdk 根目录,输入: - -.. code-block:: bash - :linenos: - - $ cd bouffalo_sdk - $ chmod 777 +x tools/cmake/bin/cmake - $ chmod 777 +x tools/bflb_tools/bflb_fw_post_proc/bflb_fw_post_proc - $ chmod 777 +x tools/bflb_tools/bouffalo_flash_cube/BLFlashCommand - 编译 ------------- @@ -94,7 +78,7 @@ Build with Linux or WSL :linenos: $ cd examples/helloworld - $ make CHIP=chip_name BOARD=board_name ## chip_name 为芯片型号,可以填写 bl602、bl702、bl616、bl808、bl606p, board_name 为开发板名称,详见 bsp/board 目录 + $ make CHIP=chip_name BOARD=board_name ## chip_name 为芯片型号,可以填写 bl702、bl616、bl808、bl606p, board_name 为开发板名称,详见 bsp/board 目录 - 使用 ninja 编译 @@ -102,14 +86,22 @@ Build with Linux or WSL :linenos: $ cd examples/helloworld - $ make ninja CHIP=chip_name BOARD=board_name ## chip_name 为芯片型号,可以填写 bl602、bl702、bl616、bl808、bl606p, board_name 为开发板名称,详见 bsp/board 目录 + $ make ninja CHIP=chip_name BOARD=board_name ## chip_name 为芯片型号,可以填写 bl702、bl616、bl808、bl606p, board_name 为开发板名称,详见 bsp/board 目录 .. note :: 如果使用 BL808 或者 BL606P,需要在上面基础上添加 CPU_ID=id ,id 可以为 m0 或者 d0 -- 烧录 +烧录 +------------- .. code-block:: bash :linenos: $ cd examples/helloworld - $ make flash CHIP=chip_name COMX=port_name ## port_name 为串口号名称,比如 linux 中/dev/ttyACMx,wsl 中对应使用 /dev/ttySx + $ make flash CHIP=chip_name COMX=port_name ## port_name 为串口号名称,比如 linux 中/dev/ttyACMx + +.. note :: 如果使用 BL808 或者 BL606P,需要在上面基础上添加 CPU_ID=id ,id 可以为 m0 或者 d0 + +调试 +------------- + +推荐使用 eclipse + cklink 调试,参考 :ref:`eclipse_gcc`,也可以使用命令行调试,这里不做介绍 \ No newline at end of file diff --git a/docs/source/get_started/repo.rst b/docs/source/get_started/repo.rst index 14197477..569d4f93 100644 --- a/docs/source/get_started/repo.rst +++ b/docs/source/get_started/repo.rst @@ -25,13 +25,7 @@ Repo 是谷歌用 Python 脚本写的调用 git 的一个脚本,可以实现 下载代码 ---------- -- 获取 SDK (只包含 BL616/BL618 版本) - -.. code-block:: bash - :linenos: - - repo init -u https://gerrit.bouffalolab.com/bouffalo/manifest/bouffalo_sdk -b master -m bl616-public.xml - +请与公司联系,申请账号。 同步代码 ---------- diff --git a/docs/source/get_started/windows_cmd.rst b/docs/source/get_started/windows_cmd.rst index 1371de2c..b4c0a6ea 100644 --- a/docs/source/get_started/windows_cmd.rst +++ b/docs/source/get_started/windows_cmd.rst @@ -73,7 +73,7 @@ Build with Windows CMD :linenos: $ cd .\examples\helloworld\ - $ make CHIP=chip_name BOARD=board_name ## chip_name 为芯片型号,可以填写 bl602、bl702、bl616、bl808、bl606p, board_name 为开发板名称,详见 bsp/board 目录 + $ make CHIP=chip_name BOARD=board_name ## chip_name 为芯片型号,可以填写 bl702、bl616、bl808、bl606p, board_name 为开发板名称,详见 bsp/board 目录 - 使用 ninja 编译 @@ -81,14 +81,22 @@ Build with Windows CMD :linenos: $ cd .\examples\helloworld\ - $ make ninja CHIP=chip_name BOARD=board_name ## chip_name 为芯片型号,可以填写 bl602、bl702、bl616、bl808、bl606p, board_name 为开发板名称,详见 bsp/board 目录 + $ make ninja CHIP=chip_name BOARD=board_name ## chip_name 为芯片型号,可以填写 bl702、bl616、bl808、bl606p, board_name 为开发板名称,详见 bsp/board 目录 .. note :: 如果使用 BL808 或者 BL606P,需要在上面基础上添加 CPU_ID=id ,id 可以为 m0 或者 d0 -- 烧录 +烧录 +------------- .. code-block:: bash :linenos: $ cd examples/helloworld $ make flash CHIP=chip_name COMX=port_name ## port_name 为串口号名称,比如 COM5 + +.. note :: 如果使用 BL808 或者 BL606P,需要在上面基础上添加 CPU_ID=id ,id 可以为 m0 或者 d0 + +调试 +------------- + +推荐使用 eclipse + cklink 调试,参考 :ref:`eclipse_gcc`,也可以使用命令行调试,这里不做介绍 \ No newline at end of file diff --git a/docs/source/notes/note_dma.rst b/docs/source/notes/note_dma.rst index 85d1bcf7..3f11253a 100644 --- a/docs/source/notes/note_dma.rst +++ b/docs/source/notes/note_dma.rst @@ -23,7 +23,7 @@ OK,那么当我们开始研究链表配置之前,我们需要了解一些前 支持长度不限制 -------------------- -由于每个 dma 链表最多支持 4905,假设位宽用的是字节,那么一个链表最多传输 4095 字节,很显然这个不能满足我们需求,性能太低。那么如何提高传输长度呢? +由于每个 dma 链表最多支持 4095,假设位宽用的是字节,那么一个链表最多传输 4095 字节,很显然这个不能满足我们需求,性能太低。那么如何提高传输长度呢? 我们可以使用多个链表,串接起来,这样就能够支持更大的传输长度了,并且传输的地址是连续的,dma 链表连接如图所示: diff --git a/docs/source/samples/components/freertos.rst b/docs/source/samples/components/freertos.rst deleted file mode 100644 index f807df0e..00000000 --- a/docs/source/samples/components/freertos.rst +++ /dev/null @@ -1,72 +0,0 @@ -FreeRTOS -==================== - -本 demo 主要演示 FreeRTOS 基本功能:任务创建和任务切换、信号量、内存管理。更详细的代码请参考 **examples/freertos**。 - -内存管理 ---------------- - -FreeRTOS 内存管理默认使用 heap5, 可以管理多块内存,并调用 ``vPortDefineHeapRegions`` 进行初始化。 - -中断管理 ---------------- - -FreeRTOS 为 RISC-V 提供了统一的中断和异常入口,名为 ``freertos_risc_v_trap_handler``,该函数主要作用如下: - -- 压栈 -- 根据 mcause 查找 `mtimer` 中断,并执行 ``xTaskIncrementTick`` -- 根据 mcause 查找 `ecall` 异常,并执行 ``vTaskSwitchContext`` -- 根据 mcause,如果是非 `ecall` 异常,则执行 ``exception_entry``;如果是非 `mtimer` 中断,则执行 ``portasmHANDLE_INTERRUPT``, ``portasmHANDLE_INTERRUPT`` 实际调用 ``interrupt_entry``。 -- 出栈 - -那么问题来了,是如何统一中断和异常的呢? - -通常 RISC-V SOC 中断支持 vector 模式和 direct 模式,博流系列芯片都使用了 vector 模式,在 `startup/start.S` 文件中可以看到 - -.. code-block:: C - :linenos: - - /* mtvec: for all exceptions and non-vector mode IRQs */ - la a0, default_trap_handler - ori a0, a0, 3 - csrw mtvec, a0 - - /* mtvt: for all vector mode IRQs */ - la a0, __Vectors - csrw mtvt, a0 - -在 `startup/interrupt` 中可以找到 ``__Vectors``: - -.. code-block:: C - :linenos: - - const pFunc __Vectors[] __attribute__((section(".init"), aligned(64))) = { - default_interrupt_handler, /* */ - default_interrupt_handler, /* */ - default_interrupt_handler, /* */ - .... - }; - -此时还没有跟 ``freertos_risc_v_trap_handler`` 扯上关系,在 `freertos/CMakelist.txt` 中配置了 ``freertos_risc_v_trap_handler`` 和 ``default_interrupt_handler`` 之间的关系。那么当中断触发时, -调用 ``default_interrupt_handler`` 其实就是调用 ``freertos_risc_v_trap_handler`` 了。 - -.. code-block:: C - :linenos: - - sdk_add_compile_definitions(-DportasmHANDLE_INTERRUPT=interrupt_entry -Ddefault_interrupt_handler=freertos_risc_v_trap_handler) - -在 `portASM.S` 文件中 ``xPortStartFirstTask`` 函数又重新配置了 ``mtvec`` 为 ``freertos_risc_v_trap_handler``,这个时候,中断和异常就统一使用 ``freertos_risc_v_trap_handler`` 函数了。 - -编译和烧录 ------------------------------ - -- **命令行编译** - -参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` - -- **烧录** - -参考 :ref:`bl_dev_cube` - -实验现象 ------------------------------ \ No newline at end of file diff --git a/docs/source/samples/components/index.rst b/docs/source/samples/components/index.rst deleted file mode 100644 index ec31c931..00000000 --- a/docs/source/samples/components/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -======================= -Components -======================= - -组件例程如果没有特殊说明,则表示适用于博流所有系列芯片。 - -.. toctree:: - :maxdepth: 1 - - FreeRTOS diff --git a/docs/source/samples/peripherals/adc/adc_dma.rst b/docs/source/samples/peripherals/adc/adc_dma.rst new file mode 100644 index 00000000..efa7c71c --- /dev/null +++ b/docs/source/samples/peripherals/adc/adc_dma.rst @@ -0,0 +1,137 @@ +ADC - dma +==================== + +本 demo 主要演示 adc dma 单端模式下读取电压值。默认扫描通道 0 ~ 通道10。 **需要注意,有些芯片不一定支持全部通道**。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_adc_gpio_init`` 。 + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/adc/adc_dma** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 ADC IP 时钟,并选择 ADC 时钟源和分频(ADC 时钟必须小于等于 500K)。 + +.. code-block:: C + :linenos: + + board_adc_gpio_init(); + +- 配置相关引脚为 `ADC` 功能 + +.. code-block:: C + :linenos: + + adc = bflb_device_get_by_name("adc"); + + /* adc clock = XCLK / 2 / 32 */ + struct bflb_adc_config_s cfg; + cfg.clk_div = ADC_CLK_DIV_32; + cfg.scan_conv_mode = true; + cfg.continuous_conv_mode = true; + cfg.differential_mode = false; + cfg.resolution = ADC_RESOLUTION_16B; + cfg.vref = ADC_VREF_3P2V; + + bflb_adc_init(adc, &cfg); + +- 获取 `adc` 句柄,并初始化 adc 配置,设置 adc 采样频率为 500K + +.. code-block:: C + :linenos: + + bflb_adc_channel_config(adc, chan, TEST_ADC_CHANNELS); + +- 配置 adc 通道信息,使用的通道数通过 `TEST_ADC_CHANNELS` 可配,默认开启通道 0 ~ 10,根据 ``board_adc_gpio_init`` 需要选择性关闭其他通道。 + +.. code-block:: C + :linenos: + + bflb_adc_link_rxdma(adc, true); + +- 使能 adc rx dma 功能 + +.. code-block:: C + :linenos: + + dma0_ch0 = bflb_device_get_by_name("dma0_ch0"); + + struct bflb_dma_channel_config_s config; + + config.direction = DMA_PERIPH_TO_MEMORY; + config.src_req = DMA_REQUEST_ADC; + config.dst_req = DMA_REQUEST_NONE; + config.src_addr_inc = DMA_ADDR_INCREMENT_DISABLE; + config.dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE; + config.src_burst_count = DMA_BURST_INCR1; + config.dst_burst_count = DMA_BURST_INCR1; + config.src_width = DMA_DATA_WIDTH_32BIT; + config.dst_width = DMA_DATA_WIDTH_32BIT; + bflb_dma_channel_init(dma0_ch0, &config); + + bflb_dma_channel_irq_attach(dma0_ch0, dma0_ch0_isr, NULL); + +- 配置 `DMA CH0` 为 `ADC RX` +- 注册 dma 通道中断 + +.. code-block:: C + :linenos: + + struct bflb_dma_channel_lli_pool_s lli[1]; /* max trasnfer size 4064 * 1 */ + struct bflb_dma_channel_lli_transfer_s transfers[1]; + + memset(raw_data, 0, sizeof(raw_data)); + + transfers[0].src_addr = (uint32_t)DMA_ADDR_ADC_RDR; + transfers[0].dst_addr = (uint32_t)raw_data; + transfers[0].nbytes = sizeof(raw_data); + + bflb_dma_channel_lli_reload(dma0_ch0, lli, 1, transfers, 1); + bflb_dma_channel_start(dma0_ch0); + + bflb_adc_start_conversion(adc); + + while (dma_tc_flag0 != 1) { + bflb_mtimer_delay_ms(1); + } + + bflb_adc_stop_conversion(adc); + + +- 分配一块 lli 内存池,个数为1,最多可以传输 4064 * 1 字节 +- 配置一块内存进行传输 +- 调用 ``bflb_dma_channel_lli_reload`` 初始化 +- 调用 ``bflb_dma_channel_start`` 启动传输 +- 调用 ``bflb_adc_start_conversion`` 启用 adc 的转换 +- 等待传输完成并进入中断 +- 调用 ``bflb_adc_stop_conversion`` 停止 adc 转换 + +.. code-block:: C + :linenos: + + for (size_t j = 0; j < TEST_ADC_CHANNELS * TEST_COUNT; j++) { + struct bflb_adc_result_s result; + printf("raw data:%08x\r\n", raw_data[j]); + bflb_adc_parse_result(adc, &raw_data[j], &result, 1); + printf("pos chan %d,%d mv \r\n", result.pos_chan, result.millivolt); + } + +- 调用 ``bflb_adc_parse_result`` 对 adc 的转换结果进行解析,解析的值保存到 ``result`` 结构体中 +- 打印通道号和电压值 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- +打印 raw data,通道号以及通道对应的电压值。 \ No newline at end of file diff --git a/docs/source/samples/peripherals/adc/adc_int.rst b/docs/source/samples/peripherals/adc/adc_int.rst new file mode 100644 index 00000000..2b676775 --- /dev/null +++ b/docs/source/samples/peripherals/adc/adc_int.rst @@ -0,0 +1,97 @@ +ADC - int +==================== + +本 demo 主要演示 adc 中断模式下读取电压值。默认扫描通道 0 ~ 通道10。 **需要注意,有些芯片不一定支持全部通道**。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_adc_gpio_init`` 。 + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/adc/adc_int** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 ADC IP 时钟,并选择 ADC 时钟源和分频(ADC 时钟必须小于等于 500K)。 + +.. code-block:: C + :linenos: + + board_adc_gpio_init(); + +- 配置相关引脚为 `ADC` 功能 + +.. code-block:: C + :linenos: + + adc = bflb_device_get_by_name("adc"); + + /* adc clock = XCLK / 2 / 32 */ + struct bflb_adc_config_s cfg; + cfg.clk_div = ADC_CLK_DIV_32; + cfg.scan_conv_mode = true; + cfg.continuous_conv_mode = false; + cfg.differential_mode = false; + cfg.resolution = ADC_RESOLUTION_16B; + cfg.vref = ADC_VREF_3P2V; + + bflb_adc_init(adc, &cfg); + +- 获取 `adc` 句柄,并初始化 adc 配置,设置 adc 采样频率为 500K + +.. code-block:: C + :linenos: + + bflb_adc_channel_config(adc, chan, TEST_ADC_CHANNELS); + +- 配置 adc 通道信息,使用的对数根据 `TEST_ADC_CHANNELS` 可配,默认开启通道 0 ~ 10,根据 ``board_adc_gpio_init`` 需要选择性关闭其他通道。 + +.. code-block:: C + :linenos: + + bflb_adc_rxint_mask(adc, false); + bflb_irq_attach(adc->irq_num, adc_isr, NULL); + bflb_irq_enable(adc->irq_num); + +- 调用 `bflb_adc_rxint_mask` 打开 adc 转换完成中断 +- 调用 `bflb_irq_attach` 连接中断处理函数 +- 调用 `bflb_irq_enable` 使能中断 + +.. code-block:: C + :linenos: + + for (size_t i = 0; i < TEST_COUNT; i++) { + read_count = 0; + bflb_adc_start_conversion(adc); + + while (read_count < TEST_ADC_CHANNELS) { + bflb_mtimer_delay_ms(1); + } + for (size_t j = 0; j < TEST_ADC_CHANNELS; j++) { + struct bflb_adc_result_s result; + printf("raw data:%08x\r\n", raw_data[j]); + bflb_adc_parse_result(adc, (uint32_t *)&raw_data[j], &result, 1); + printf("pos chan %d,%d mv \r\n", result.pos_chan, result.millivolt); + } + bflb_adc_stop_conversion(adc); + bflb_mtimer_delay_ms(100); + } + +- 调用 ``bflb_adc_start_conversion(adc)`` 启用 adc 的转换 +- 调用 ``bflb_adc_parse_result(adc, (uint32_t *)&raw_data[j], &result, 1)`` 对 adc 的转换结果进行解析,解析的值保存到 ``result`` 结构体中 +- 调用 ``bflb_adc_stop_conversion(adc)`` 停止 adc 转换 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- +打印 raw data,通道号以及通道对应的电压值。 \ No newline at end of file diff --git a/docs/source/samples/peripherals/adc/adc_poll.rst b/docs/source/samples/peripherals/adc/adc_poll.rst index fde28cbe..d4972579 100644 --- a/docs/source/samples/peripherals/adc/adc_poll.rst +++ b/docs/source/samples/peripherals/adc/adc_poll.rst @@ -18,7 +18,7 @@ ADC - poll board_init(); -- ``board_init`` 中会开启 ADC IP 时钟,并选择 ADC 时钟源和分频。 +- ``board_init`` 中会开启 ADC IP 时钟,并选择 ADC 时钟源和分频(ADC 时钟必须小于等于 500K)。 .. code-block:: C :linenos: @@ -83,13 +83,8 @@ ADC - poll 编译和烧录 ----------------------------- -- **命令行编译** - 参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` -- **烧录** - -参考 :ref:`bl_dev_cube` - 实验现象 ------------------------------ \ No newline at end of file +----------------------------- +打印 raw data,通道号以及通道对应的电压值。 \ No newline at end of file diff --git a/docs/source/samples/peripherals/adc/adc_poll_diff_mode.rst b/docs/source/samples/peripherals/adc/adc_poll_diff_mode.rst new file mode 100644 index 00000000..f895f704 --- /dev/null +++ b/docs/source/samples/peripherals/adc/adc_poll_diff_mode.rst @@ -0,0 +1,90 @@ +ADC - poll_diff_mode +==================== + +本 demo 主要演示 adc poll 差分模式下读取通道 2 和 通道 3 的电压值。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_adc_gpio_init`` 。 + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/adc/adc_poll_diff_mode** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 ADC IP 时钟,并选择 ADC 时钟源和分频(ADC 时钟必须小于等于 500K)。 + +.. code-block:: C + :linenos: + + board_adc_gpio_init(); + +- 配置相关引脚为 `ADC` 功能 + +.. code-block:: C + :linenos: + + adc = bflb_device_get_by_name("adc"); + + /* adc clock = XCLK / 2 / 32 */ + struct bflb_adc_config_s cfg; + cfg.clk_div = ADC_CLK_DIV_32; + cfg.scan_conv_mode = true; + cfg.continuous_conv_mode = false; + cfg.differential_mode = true; + cfg.resolution = ADC_RESOLUTION_16B; + cfg.vref = ADC_VREF_3P2V; + + bflb_adc_init(adc, &cfg); + +- 获取 `adc` 句柄,并初始化 adc 配置,设置 adc 采样频率为 500K + +.. code-block:: C + :linenos: + + bflb_adc_channel_config(adc, chan, TEST_ADC_CHANNELS); + +- 配置通道 2 和 通道 3 信息。 + +.. code-block:: C + :linenos: + + for (uint32_t i = 0; i < TEST_COUNT; i++) { + bflb_adc_start_conversion(adc); + + while (bflb_adc_get_count(adc) < TEST_ADC_CHANNELS) { + bflb_mtimer_delay_ms(1); + } + + for (size_t j = 0; j < TEST_ADC_CHANNELS; j++) { + struct bflb_adc_result_s result; + uint32_t raw_data = bflb_adc_read_raw(adc); + printf("raw data:%08x\r\n", raw_data); + bflb_adc_parse_result(adc, &raw_data, &result, 1); + printf("pos chan %d,neg chan %d,%d mv \r\n", result.pos_chan, result.neg_chan, result.millivolt); + } + + bflb_adc_stop_conversion(adc); + bflb_mtimer_delay_ms(100); + } + +- 调用 ``bflb_adc_start_conversion(adc)`` 启用 adc 的转换 +- 调用 ``bflb_adc_get_count(adc)`` 读取转换完成的个数 +- 调用 ``bflb_adc_read_raw(adc)`` 读取一次 adc 的转换值 +- 调用 ``bflb_adc_parse_result(adc, &raw_data, &result, 1)`` 对 adc 的转换结果进行解析,解析的值保存到 ``result`` 结构体中 +- 调用 ``bflb_adc_stop_conversion(adc)`` 停止 adc 转换 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- +打印 raw data,正极和负极通道号以及对应的电压差值。 \ No newline at end of file diff --git a/docs/source/samples/peripherals/adc/adc_tsen.rst b/docs/source/samples/peripherals/adc/adc_tsen.rst new file mode 100644 index 00000000..e7312c15 --- /dev/null +++ b/docs/source/samples/peripherals/adc/adc_tsen.rst @@ -0,0 +1,75 @@ +ADC - tsen +==================== + +本 demo 主要演示通过 adc 测量二极管的电压差,计算得到环境温度。 + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/adc/adc_tsen** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 ADC IP 时钟,并选择 ADC 时钟源和分频(ADC 时钟必须小于等于 500K)。 + +.. code-block:: C + :linenos: + + adc = bflb_device_get_by_name("adc"); + + /* adc clock = XCLK / 2 / 32 */ + struct bflb_adc_config_s cfg; + cfg.clk_div = ADC_CLK_DIV_32; + cfg.scan_conv_mode = false; + cfg.continuous_conv_mode = false; + cfg.differential_mode = false; + cfg.resolution = ADC_RESOLUTION_16B; + cfg.vref = ADC_VREF_2P0V; + + struct bflb_adc_channel_s chan; + + chan.pos_chan = ADC_CHANNEL_TSEN_P; + chan.neg_chan = ADC_CHANNEL_GND; + + bflb_adc_init(adc, &cfg); + +- 获取 `adc` 句柄,并初始化 adc 配置(参考电压必须设置为2.0V),设置 adc 采样频率为 500K。 + +.. code-block:: C + :linenos: + + bflb_adc_channel_config(adc, chan, 1); + +- 配置 adc 通道信息。 + +.. code-block:: C + :linenos: + + bflb_adc_tsen_init(adc, ADC_TSEN_MOD_INTERNAL_DIODE); + +- 开启 tsen 功能,使用内部二极管测量电压值。 + +.. code-block:: C + :linenos: + + for (i = 0; i < 50; i++) { + average_filter += bflb_adc_tsen_get_temp(adc); + bflb_mtimer_delay_ms(10); + } + + printf("temp = %d\r\n", (uint32_t)(average_filter / 50.0)); + average_filter = 0; + +- 调用 ``bflb_adc_tsen_get_temp(adc)`` 获取 adc tsen 计算得到的环境温度值。 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- +打印计算得到的环境温度。 \ No newline at end of file diff --git a/docs/source/samples/peripherals/adc/adc_vbat.rst b/docs/source/samples/peripherals/adc/adc_vbat.rst new file mode 100644 index 00000000..26942594 --- /dev/null +++ b/docs/source/samples/peripherals/adc/adc_vbat.rst @@ -0,0 +1,86 @@ +ADC - vbat +==================== + +本 demo 主要演示 adc 测量芯片 VDD33 的电压值。 + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/adc/adc_vbat** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 ADC IP 时钟,并选择 ADC 时钟源和分频(ADC 时钟必须小于等于 500K)。 + +.. code-block:: C + :linenos: + + adc = bflb_device_get_by_name("adc"); + + /* adc clock = XCLK / 2 / 32 */ + struct bflb_adc_config_s cfg; + cfg.clk_div = ADC_CLK_DIV_32; + cfg.scan_conv_mode = false; + cfg.continuous_conv_mode = false; + cfg.differential_mode = false; + cfg.resolution = ADC_RESOLUTION_16B; + cfg.vref = ADC_VREF_3P2V; + + struct bflb_adc_channel_s chan; + + chan.pos_chan = ADC_CHANNEL_VABT_HALF; + chan.neg_chan = ADC_CHANNEL_GND; + + bflb_adc_init(adc, &cfg); + +- 获取 `adc` 句柄,并初始化 adc 配置,设置 adc 采样频率为 500K。 + +.. code-block:: C + :linenos: + + bflb_adc_channel_config(adc, chan, 1); + +- 配置 adc 通道信息。 + +.. code-block:: C + :linenos: + + bflb_adc_vbat_enable(adc); + +- 开启 vbat 功能。 + +.. code-block:: C + :linenos: + + struct bflb_adc_result_s result; + for (uint16_t i = 0; i < 10; i++) { + bflb_adc_start_conversion(adc); + while (bflb_adc_get_count(adc) == 0) { + bflb_mtimer_delay_ms(1); + } + uint32_t raw_data = bflb_adc_read_raw(adc); + + bflb_adc_parse_result(adc, &raw_data, &result, 1); + printf("vBat = %d mV\r\n", (uint32_t)(result.millivolt * 2)); + bflb_adc_stop_conversion(adc); + + bflb_mtimer_delay_ms(500); + } + +- 调用 ``bflb_adc_start_conversion(adc)`` 启用 adc 的转换 +- 调用 ``bflb_adc_get_count(adc)`` 读取转换完成的个数 +- 调用 ``bflb_adc_read_raw(adc)`` 读取一次 adc 的转换值 +- 调用 ``bflb_adc_parse_result(adc, &raw_data, &result, 1)`` 对 adc 的转换结果进行解析,解析的值保存到 ``result`` 结构体中 +- 调用 ``bflb_adc_stop_conversion(adc)`` 停止 adc 转换 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- +打印芯片 VDD33 的电压值。 \ No newline at end of file diff --git a/docs/source/samples/peripherals/adc/index.rst b/docs/source/samples/peripherals/adc/index.rst index d1f74688..8cd48702 100644 --- a/docs/source/samples/peripherals/adc/index.rst +++ b/docs/source/samples/peripherals/adc/index.rst @@ -5,4 +5,93 @@ ADC .. toctree:: :maxdepth: 1 - ADC - poll \ No newline at end of file + ADC - poll + ADC - dma + ADC - interrupt + ADC - poll_diff_mode + ADC - temperature sensor + ADC - vbat + + +ADC 各通道对应的 GPIO 如下表: + +.. table:: GPIO 口 + :widths: 30, 30, 40 + :width: 80% + :align: center + + +----------+-----------+---------------------------+ + | 名称 | 芯片系列 | GPIO | + +==========+===========+===========================+ + | Channel0 | BL702 | GPIO 8 | + + +-----------+---------------------------+ + | | BL808 | GPIO 17 | + + +-----------+---------------------------+ + | | BL616 | GPIO 20 | + +----------+-----------+---------------------------+ + | Channel1 | BL702 | GPIO 15 | + + +-----------+---------------------------+ + | | BL808 | GPIO 5 | + + +-----------+---------------------------+ + | | BL616 | GPIO 19 | + +----------+-----------+---------------------------+ + | Channel2 | BL702 | GPIO 17 | + + +-----------+---------------------------+ + | | BL808 | GPIO 4 | + + +-----------+---------------------------+ + | | BL616 | GPIO 2(Bootstrap 引脚) | + +----------+-----------+---------------------------+ + | Channel3 | BL702 | GPIO 11 | + + +-----------+---------------------------+ + | | BL808 | GPIO 11 | + + +-----------+---------------------------+ + | | BL616 | GPIO 3 | + +----------+-----------+---------------------------+ + | Channel4 | BL702 | GPIO 12 | + + +-----------+---------------------------+ + | | BL808 | GPIO 6 | + + +-----------+---------------------------+ + | | BL616 | GPIO 14 | + +----------+-----------+---------------------------+ + | Channel5 | BL702 | GPIO 14 | + + +-----------+---------------------------+ + | | BL808 | GPIO 40 | + + +-----------+---------------------------+ + | | BL616 | GPIO 13 | + +----------+-----------+---------------------------+ + | Channel6 | BL702 | GPIO 7 | + + +-----------+---------------------------+ + | | BL808 | GPIO 12 | + + +-----------+---------------------------+ + | | BL616 | GPIO 12 | + +----------+-----------+---------------------------+ + | Channel7 | BL702 | GPIO 9 | + + +-----------+---------------------------+ + | | BL808 | GPIO 13 | + + +-----------+---------------------------+ + | | BL616 | GPIO 10 | + +----------+-----------+---------------------------+ + | Channel8 | BL702 | GPIO 18 | + + +-----------+---------------------------+ + | | BL808 | GPIO 16 | + + +-----------+---------------------------+ + | | BL616 | GPIO 1 | + +----------+-----------+---------------------------+ + | Channel9 | BL702 | GPIO 19 | + + +-----------+---------------------------+ + | | BL808 | GPIO 18 | + + +-----------+---------------------------+ + | | BL616 | GPIO 0 | + +----------+-----------+---------------------------+ + | Channel10| BL702 | GPIO 20 | + + +-----------+---------------------------+ + | | BL808 | GPIO 19 | + + +-----------+---------------------------+ + | | BL616 | GPIO 27 | + +----------+-----------+---------------------------+ + | Channel11| BL702 | GPIO 21 | + + +-----------+---------------------------+ + | | BL808 | GPIO 34 | + + +-----------+---------------------------+ + | | BL616 | GPIO 28 | + +----------+-----------+---------------------------+ diff --git a/docs/source/samples/peripherals/dac/dac_dma.rst b/docs/source/samples/peripherals/dac/dac_dma.rst new file mode 100644 index 00000000..f666c36c --- /dev/null +++ b/docs/source/samples/peripherals/dac/dac_dma.rst @@ -0,0 +1,100 @@ +DAC - dma +==================== + +本 demo 主要介绍基于 DAC DMA 模式生成正弦波。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_dac_gpio_init`` 。 + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/dac/dac_dma** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 DAC IP 时钟,并选择 DAC 时钟源和分频。 + +.. code-block:: C + :linenos: + + board_dac_gpio_init(); + +- 配置相关引脚为 `DAC` 功能 + +.. code-block:: C + :linenos: + + dac = bflb_device_get_by_name("dac"); + + /* 512K / 1 = 512K */ + bflb_dac_init(dac, DAC_CLK_DIV_1); + bflb_dac_channel_enable(dac, DAC_CHANNEL_A); + bflb_dac_channel_enable(dac, DAC_CHANNEL_B); + bflb_dac_link_txdma(dac, true); + +- 获取 `dac` 句柄,并初始化 dac 频率为 512K +- ``bflb_dac_channel_enable`` 配置 dac 通道信息,当前使用的 A 通道和 B 通道 +- ``bflb_dac_link_txdma`` 开启 dac txdma 功能 + +.. code-block:: C + :linenos: + + dma0_ch0 = bflb_device_get_by_name("dma0_ch0"); + + struct bflb_dma_channel_config_s config; + + config.direction = DMA_MEMORY_TO_PERIPH; + config.src_req = DMA_REQUEST_NONE; + config.dst_req = DMA_REQUEST_DAC; + config.src_addr_inc = DMA_ADDR_INCREMENT_ENABLE; + config.dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE; + config.src_burst_count = DMA_BURST_INCR1; + config.dst_burst_count = DMA_BURST_INCR1; + config.src_width = DMA_DATA_WIDTH_16BIT; + config.dst_width = DMA_DATA_WIDTH_16BIT; + bflb_dma_channel_init(dma0_ch0, &config); + + bflb_dma_channel_irq_attach(dma0_ch0, dma0_ch0_isr, NULL); + +- 配置 `DMA CH0` 为 `DAC` +- 注册 dma 通道中断 + +.. code-block:: C + :linenos: + + struct bflb_dma_channel_lli_pool_s lli[1]; /* max trasnfer size 4064 * 1 */ + struct bflb_dma_channel_lli_transfer_s transfers[1]; + + transfers[0].src_addr = (uint32_t)SIN_LIST; + transfers[0].dst_addr = (uint32_t)DMA_ADDR_DAC_TDR; + transfers[0].nbytes = sizeof(SIN_LIST); + bflb_l1c_dcache_clean_range((void*)SIN_LIST,sizeof(SIN_LIST)); + + bflb_dma_channel_lli_reload(dma0_ch0, lli, 1, transfers, 1); + bflb_dma_channel_start(dma0_ch0); + + while (dma_tc_flag0 != 1) { + bflb_mtimer_delay_ms(1); + } + +- 分配一块 lli 内存池,个数为1,最多可以传输 4064 * 1 字节 +- 配置一块内存进行传输 +- 调用 ``bflb_dma_channel_lli_reload`` 初始化 +- 调用 ``bflb_dma_channel_start`` 启动传输 +- 等待传输完成并进入中断 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +DAC Channel A 和 B 对应的 GPIO 输出正弦波。 diff --git a/docs/source/samples/peripherals/dac/dac_polling.rst b/docs/source/samples/peripherals/dac/dac_polling.rst index e4704bae..1ba82d65 100644 --- a/docs/source/samples/peripherals/dac/dac_polling.rst +++ b/docs/source/samples/peripherals/dac/dac_polling.rst @@ -6,20 +6,7 @@ DAC - poll 硬件连接 ----------------------------- -本 demo 使用到的 gpio 如下表: - -.. table:: GPIO 口 - :widths: 30, 30, 40 - :width: 80% - :align: center - - +----------------+-----------+---------------------------+ - | 名称 | 芯片型号 | GPIO | - +================+===========+===========================+ - | DAC Channel A | BL702 | GPIO 11 | - + +-----------+---------------------------+ - | | BL616 | GPIO 3 | - +----------------+-----------+---------------------------+ +本 demo 使用到的 gpio 参考 ``board_adc_gpio_init`` 。 软件实现 ----------------------------- @@ -69,14 +56,8 @@ DAC - poll 编译和烧录 ----------------------------- -- **命令行编译** - 参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` -- **烧录** - -参考 :ref:`bl_dev_cube` - 实验现象 ----------------------------- diff --git a/docs/source/samples/peripherals/dac/index.rst b/docs/source/samples/peripherals/dac/index.rst index 720267bc..37d4e13b 100644 --- a/docs/source/samples/peripherals/dac/index.rst +++ b/docs/source/samples/peripherals/dac/index.rst @@ -5,4 +5,28 @@ DAC .. toctree:: :maxdepth: 1 - DAC - poll \ No newline at end of file + DAC - poll + DAC - dma + +DAC 各通道对应的 GPIO 如下表: + +.. table:: GPIO 口 + :widths: 25, 25, 25, 25 + :width: 80% + :align: center + + +----------+-----------+-----------+---------------------------+ + | 名称 | 芯片系列 | 精度 | GPIO | + +==========+===========+===========+===========================+ + | ChannelA | BL702 | 10-bit | GPIO 11 | + + +-----------+-----------+---------------------------+ + | | BL808 | 10-bit | GPIO 11 | + + +-----------+-----------+---------------------------+ + | | BL616 | 12-bit | GPIO 3 | + +----------+-----------+-----------+---------------------------+ + | ChannelB | BL702 | 10-bit | GPIO 17 | + + +-----------+-----------+---------------------------+ + | | BL808 | 10-bit | GPIO 4 | + + +-----------+-----------+---------------------------+ + | | BL616 | 12-bit | GPIO 2 | + +----------+-----------+-----------+---------------------------+ \ No newline at end of file diff --git a/docs/source/samples/peripherals/gpio/gpio_input_output.rst b/docs/source/samples/peripherals/gpio/gpio_input_output.rst new file mode 100644 index 00000000..f3a00726 --- /dev/null +++ b/docs/source/samples/peripherals/gpio/gpio_input_output.rst @@ -0,0 +1,58 @@ +GPIO - input/output +==================== + +本 demo 主要介绍 GPIO 0 输出和 GPIO 1 输入功能。 + +硬件连接 +----------------------------- + +使用杜邦线将 GPIO 0 和 GPIO 1 引脚连接。 + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/gpio/gpio_input_output** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中开启时钟 + +.. code-block:: C + :linenos: + + gpio = bflb_device_get_by_name("gpio"); + + bflb_gpio_init(gpio, GPIO_PIN_0, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0); + bflb_gpio_init(gpio, GPIO_PIN_1, GPIO_INPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0); + +- 配置 GPIO 0 为 GPIO_OUTPUT 功能,GPIO 1 为 GPIO_INPUT 功能。 + +.. code-block:: C + :linenos: + + while (1) { + bflb_gpio_set(gpio, GPIO_PIN_0); + printf("GPIO_PIN_1=%x\r\n", bflb_gpio_read(gpio, GPIO_PIN_1)); + bflb_mtimer_delay_ms(2000); + + bflb_gpio_reset(gpio, GPIO_PIN_0); + printf("GPIO_PIN_1=%x\r\n", bflb_gpio_read(gpio, GPIO_PIN_1)); + bflb_mtimer_delay_ms(2000); + } + +- ``bflb_gpio_set(gpio, GPIO_PIN_0)`` 将 GPIO 0 引脚置位 +- ``bflb_gpio_read(gpio, GPIO_PIN_1)`` 读取 GPIO 1 引脚电平 +- ``bflb_gpio_reset(gpio, GPIO_PIN_0)`` 将 GPIO 0 引脚置 0 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +打印 GPIO 1 引脚电平。 diff --git a/docs/source/samples/peripherals/gpio/gpio_interrupt.rst b/docs/source/samples/peripherals/gpio/gpio_interrupt.rst new file mode 100644 index 00000000..359b11fd --- /dev/null +++ b/docs/source/samples/peripherals/gpio/gpio_interrupt.rst @@ -0,0 +1,52 @@ +GPIO - interrupt +==================== + +本 demo 主要介绍 GPIO 0 的同步低电平中断类型。 + +硬件连接 +----------------------------- + +将 GPIO 0 和 GND 连接。 + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/gpio/gpio_interrupt** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中开启时钟 + +.. code-block:: C + :linenos: + + gpio = bflb_device_get_by_name("gpio"); + + bflb_gpio_int_init(gpio, GPIO_PIN_0, GPIO_INT_TRIG_MODE_SYNC_LOW_LEVEL); + +- 设置 GPIO 0 的中断类型。 + +.. code-block:: C + :linenos: + + bflb_gpio_int_mask(gpio, GPIO_PIN_0, false); + + bflb_irq_attach(gpio->irq_num, gpio_isr, gpio); + bflb_irq_enable(gpio->irq_num); + +- ``bflb_gpio_int_mask(gpio, GPIO_PIN_0, false)`` 打开 GPIO 0 中断 +- ``bflb_irq_attach(gpio->irq_num, gpio_isr, gpio)`` 注册 GPIO 中断函数 +- ``bflb_irq_enable(gpio->irq_num)`` 使能 GPIO 中断 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +将 GPIO 0 引脚电平拉低,进入中断并打印中断次数。 diff --git a/docs/source/samples/peripherals/gpio/index.rst b/docs/source/samples/peripherals/gpio/index.rst new file mode 100644 index 00000000..1aff763e --- /dev/null +++ b/docs/source/samples/peripherals/gpio/index.rst @@ -0,0 +1,22 @@ +==== +GPIO +==== + +.. toctree:: + :maxdepth: 1 + + GPIO - input/output + GPIO - interrupt + +各开发板支持的 GPIO 引脚如下表: + +.. table:: GPIO 口 + :widths: 25, 25, 25, 25 + :width: 80% + :align: center + + +----------------------+--------------------------------------------------------------------------------+ + | 开发板 | GPIO | + +======================+================================================================================+ + | BL61x_MB_V1 | GPIO 0-34(其中 GPIO 2 为 BOOT 引脚,GPIO16/17默认为晶振引脚) | + +----------------------+--------------------------------------------------------------------------------+ diff --git a/docs/source/samples/peripherals/i2c/i2c_10_bit.rst b/docs/source/samples/peripherals/i2c/i2c_10_bit.rst new file mode 100644 index 00000000..6e40d800 --- /dev/null +++ b/docs/source/samples/peripherals/i2c/i2c_10_bit.rst @@ -0,0 +1,92 @@ +I2C - 10-bit +==================== + +本 demo 主要介绍 I2C 10-bit slave 模式数据传输。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_i2c0_gpio_init`` ,将 USB 转 I2C 模块与开发板连接,具体引脚连接方式如下表(以BL616为例): + +.. table:: 硬件连接 + :widths: 50, 50 + :width: 80% + :align: center + + +-------------------+------------------+ + | 开发板 I2C 引脚 | USB 转 I2C 模块 | + +===================+==================+ + | SCL(GPIO14) | SCL | + +-------------------+------------------+ + | SDA(GPIO15) | SDA | + +-------------------+------------------+ + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/i2c/i2c_10_bit** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 I2C IP 时钟,并选择 I2C 时钟源和分频。 + +.. code-block:: C + :linenos: + + board_i2c0_gpio_init(); + +- 配置相关引脚为 `I2C` 功能 + +.. code-block:: C + :linenos: + + i2c0 = bflb_device_get_by_name("i2c0"); + + bflb_i2c_init(i2c0, 400000); + +- 获取 `i2c0` 句柄,并初始化 i2c0 频率为 400K + +.. code-block:: C + :linenos: + + struct bflb_i2c_msg_s msgs[2]; + uint8_t subaddr[2] = { 0x00, 0x04}; + uint8_t write_data[I2C_10BIT_TRANSFER_LENGTH]; + + /* Write buffer init */ + write_data[0] = 0x55; + write_data[1] = 0x11; + write_data[2] = 0x22; + for (size_t i = 3; i < I2C_10BIT_TRANSFER_LENGTH; i++) { + write_data[i] = i; + } + + /* Write data */ + msgs[0].addr = I2C_10BIT_SLAVE_ADDR; + msgs[0].flags = I2C_M_NOSTOP | I2C_M_TEN; + msgs[0].buffer = subaddr; + msgs[0].length = 2; + + msgs[1].addr = I2C_10BIT_SLAVE_ADDR; + msgs[1].flags = 0; + msgs[1].buffer = write_data; + msgs[1].length = I2C_10BIT_TRANSFER_LENGTH; + + bflb_i2c_transfer(i2c0, msgs, 2); + +- 初始化发送数据(write_data)和配置从设备信息(msgs) +- ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 i2c 传输 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +通过串口(波特率大于115200)发送``04 00 06 01 03 55``命令给 USB 转 I2C 模块,设置 I2C 从机 10-bit 模式数据传输。 +按下开发板中 RST 按键,串口打印开发板发送的 write_data 数据。 diff --git a/docs/source/samples/peripherals/i2c/i2c_eeprom.rst b/docs/source/samples/peripherals/i2c/i2c_eeprom.rst new file mode 100644 index 00000000..783adfc3 --- /dev/null +++ b/docs/source/samples/peripherals/i2c/i2c_eeprom.rst @@ -0,0 +1,120 @@ +I2C - eeprom +==================== + +本 demo 主要介绍 I2C 读写 eeprom。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_i2c0_gpio_init`` ,将 eeprom 模块与开发板连接,具体引脚连接方式如下表(以BL616为例): + +.. table:: 硬件连接 + :widths: 50, 50 + :width: 80% + :align: center + + +-------------------+------------------+ + | 开发板 I2C 引脚 | eeprom 模块 | + +===================+==================+ + | SCL(GPIO14) | SCL | + +-------------------+------------------+ + | SDA(GPIO15) | SDA | + +-------------------+------------------+ + | GND | GND | + +-------------------+------------------+ + | VCC | VCC | + +-------------------+------------------+ + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/i2c/i2c_eeprom** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 I2C IP 时钟,并选择 I2C 时钟源和分频。 + +.. code-block:: C + :linenos: + + board_i2c0_gpio_init(); + +- 配置相关引脚为 `I2C` 功能 + +.. code-block:: C + :linenos: + + i2c0 = bflb_device_get_by_name("i2c0"); + + bflb_i2c_init(i2c0, 400000); + +- 获取 `i2c0` 句柄,并初始化 i2c0 频率为 400K + +.. code-block:: C + :linenos: + + struct bflb_i2c_msg_s msgs[2]; + uint8_t subaddr[2] = { 0x00, EEPROM_SELECT_PAGE0}; + uint8_t write_data[256]; + + /* Write and read buffer init */ + for (size_t i = 0; i < 256; i++) { + write_data[i] = i; + read_data[i] = 0; + } + + /* Write page 0 */ + msgs[0].addr = 0x50; + msgs[0].flags = I2C_M_NOSTOP; + msgs[0].buffer = subaddr; + msgs[0].length = 2; + + msgs[1].addr = 0x50; + msgs[1].flags = 0; + msgs[1].buffer = write_data; + msgs[1].length = EEPROM_TRANSFER_LENGTH; + + bflb_i2c_transfer(i2c0, msgs, 2); + +- 初始化发送数据(write_data),接收buffer和配置从设备信息(msgs) +- ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 i2c 传输 + +.. code-block:: C + :linenos: + + uint8_t read_data[256]; + + /* Read page 0 */ + msgs[1].addr = 0x50; + msgs[1].flags = I2C_M_READ; + msgs[1].buffer = read_data; + msgs[1].length = EEPROM_TRANSFER_LENGTH; + bflb_i2c_transfer(i2c0, msgs, 2); + +- 读取从设备寄存器地址中的数据,存放至 read_data 中 +- ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 i2c 传输 + +.. code-block:: C + :linenos: + + /* Check read data */ + for (uint8_t i = 0; i < EEPROM_TRANSFER_LENGTH; i++) { + if (write_data[i] != read_data[i]) { + printf("check fail, %d write: %02x, read: %02x\r\n", i, write_data[i], read_data[i]); + } + } + +- 检查发送和读取的数据是否一致 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +按下 RST 按键,数据传输完成后,打印“write over”,“read over”和“check over”。 \ No newline at end of file diff --git a/docs/source/samples/peripherals/i2c/i2c_eeprom_dma.rst b/docs/source/samples/peripherals/i2c/i2c_eeprom_dma.rst new file mode 100644 index 00000000..a9fd472e --- /dev/null +++ b/docs/source/samples/peripherals/i2c/i2c_eeprom_dma.rst @@ -0,0 +1,202 @@ +I2C - eeprom_dma +==================== + +本 demo 主要介绍 I2C 使用 DMA 的方式读写 eeprom。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_i2c0_gpio_init`` ,将 eeprom 模块与开发板连接,具体引脚连接方式如下表(以BL616为例): + +.. table:: 硬件连接 + :widths: 50, 50 + :width: 80% + :align: center + + +-------------------+------------------+ + | 开发板 I2C 引脚 | eeprom 模块 | + +===================+==================+ + | SCL(GPIO14) | SCL | + +-------------------+------------------+ + | SDA(GPIO15) | SDA | + +-------------------+------------------+ + | GND | GND | + +-------------------+------------------+ + | VCC | VCC | + +-------------------+------------------+ + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/i2c/i2c_eeprom_dma** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 I2C IP 时钟,并选择 I2C 时钟源和分频。 + +.. code-block:: C + :linenos: + + board_i2c0_gpio_init(); + +- 配置相关引脚为 `I2C` 功能 + +.. code-block:: C + :linenos: + + /* Send and receive buffer init */ + for (size_t i = 0; i < 32; i++) { + ((uint8_t *)send_buffer)[i] = i; + ((uint8_t *)receive_buffer)[i] = 0; + } + + i2c0 = bflb_device_get_by_name("i2c0"); + + bflb_i2c_init(i2c0, 400000); + bflb_i2c_link_txdma(i2c0, true); + bflb_i2c_link_rxdma(i2c0, true); + +- 初始化发送和接收 buffer +- 获取 `i2c0` 句柄,并初始化 i2c0 频率为 400K +- ``bflb_i2c_link_txdma(i2c0, true)`` 开启 I2C TX DMA 功能 +- ``bflb_i2c_link_rxdma(i2c0, true)`` 开启 I2C RX DMA 功能 + +.. code-block:: C + :linenos: + + /* Write page 0 */ + dma0_ch0 = bflb_device_get_by_name("dma0_ch0"); + + struct bflb_dma_channel_config_s tx_config; + + tx_config.direction = DMA_MEMORY_TO_PERIPH; + tx_config.src_req = DMA_REQUEST_NONE; + tx_config.dst_req = DMA_REQUEST_I2C0_TX; + tx_config.src_addr_inc = DMA_ADDR_INCREMENT_ENABLE; + tx_config.dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE; + tx_config.src_burst_count = DMA_BURST_INCR1; + tx_config.dst_burst_count = DMA_BURST_INCR1; + tx_config.src_width = DMA_DATA_WIDTH_32BIT; + tx_config.dst_width = DMA_DATA_WIDTH_32BIT; + bflb_dma_channel_init(dma0_ch0, &tx_config); + + bflb_dma_channel_irq_attach(dma0_ch0, dma0_ch0_isr, NULL); + +- 对于 TX, DMA 的配置如下:传输方向(direction)为内存到外设(MEMORY_TO_PERIPH),源请求(src_req)为内存,目标请求(dst_req)为 DMA_REQUEST_I2C0_TX +- 调用 ``bflb_dma_channel_init(dma0_ch0, &tx_config)`` 初始化 DMA +- 调用 ``bflb_dma_channel_irq_attach(dma0_ch0, dma0_ch0_isr, NULL)`` 注册 dma 通道 0 中断 + +.. code-block:: C + :linenos: + + struct bflb_dma_channel_lli_pool_s tx_llipool[20]; /* max trasnfer size 4064 * 20 */ + struct bflb_dma_channel_lli_transfer_s tx_transfers[1]; + tx_transfers[0].src_addr = (uint32_t)send_buffer; + tx_transfers[0].dst_addr = (uint32_t)DMA_ADDR_I2C0_TDR; + tx_transfers[0].nbytes = 32; + bflb_dma_channel_lli_reload(dma0_ch0, tx_llipool, 20, tx_transfers, 1); + + msgs[0].addr = 0x50; + msgs[0].flags = I2C_M_NOSTOP; + msgs[0].buffer = subaddr; + msgs[0].length = 2; + + msgs[1].addr = 0x50; + msgs[1].flags = I2C_M_DMA; + msgs[1].buffer = NULL; + msgs[1].length = 32; + bflb_i2c_transfer(i2c0, msgs, 2); + + bflb_dma_channel_start(dma0_ch0); + +- 分配二十块 lli 内存池,最多可以传输 4064 * 20 字节 +- 配置一块内存(tx_transfers)进行传输,源地址(src_addr)为存储发送数据的内存地址(send_buffer),目标地址(dst_addr)为 I2C TX FIFO地址(DMA_ADDR_I2C0_TDR) +- 调用 ``bflb_dma_channel_lli_reload(dma0_ch0, tx_llipool, 20, tx_transfers, 1)`` 初始化 +- 调用 ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 I2C 传输 +- 调用 ``bflb_dma_channel_start(dma0_ch0)`` 启动 DMA 传输 + +.. code-block:: C + :linenos: + + /* Read page 0 */ + dma0_ch1 = bflb_device_get_by_name("dma0_ch1"); + + struct bflb_dma_channel_config_s rx_config; + + rx_config.direction = DMA_PERIPH_TO_MEMORY; + rx_config.src_req = DMA_REQUEST_I2C0_RX; + rx_config.dst_req = DMA_REQUEST_NONE; + rx_config.src_addr_inc = DMA_ADDR_INCREMENT_DISABLE; + rx_config.dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE; + rx_config.src_burst_count = DMA_BURST_INCR1; + rx_config.dst_burst_count = DMA_BURST_INCR1; + rx_config.src_width = DMA_DATA_WIDTH_32BIT; + rx_config.dst_width = DMA_DATA_WIDTH_32BIT; + bflb_dma_channel_init(dma0_ch1, &rx_config); + + bflb_dma_channel_irq_attach(dma0_ch1, dma0_ch1_isr, NULL); + +- 对于 RX, DMA 的配置如下:传输方向(direction)为外设到内存(PERIPH_TO_MEMORY),源请求(src_req)为 DMA_REQUEST_I2C0_RX ,目标请求(dst_req)为内存 +- 调用 ``bflb_dma_channel_init(dma0_ch1, &rx_config)`` 初始化 DMA +- 调用 ``bflb_dma_channel_irq_attach(dma0_ch1, dma0_ch1_isr, NULL)`` 注册 dma 通道 1 中断 + +.. code-block:: C + :linenos: + + struct bflb_dma_channel_lli_pool_s rx_llipool[20]; + struct bflb_dma_channel_lli_transfer_s rx_transfers[1]; + rx_transfers[0].src_addr = (uint32_t)DMA_ADDR_I2C0_RDR; + rx_transfers[0].dst_addr = (uint32_t)receive_buffer; + rx_transfers[0].nbytes = 32; + + bflb_dma_channel_lli_reload(dma0_ch1, rx_llipool, 20, rx_transfers, 1); + + msgs[1].addr = 0x50; + msgs[1].flags = I2C_M_DMA | I2C_M_READ; + msgs[1].buffer = NULL; + msgs[1].length = 32; + bflb_i2c_transfer(i2c0, msgs, 2); + + bflb_dma_channel_start(dma0_ch1); + +- 分配二十块 lli 内存池,最多可以传输 4064 * 20 字节 +- 配置一块内存(rx_transfers)进行传输,源地址(src_addr)为 I2C RX FIFO地址(DMA_ADDR_I2C0_RDR),目标地址(dst_addr)为存储接收数据的内存地址(receive_buffer) +- 调用 ``bflb_dma_channel_lli_reload(dma0_ch1, rx_llipool, 20, rx_transfers, 1)`` 初始化 +- 调用 ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 I2C 传输 +- 调用 ``bflb_dma_channel_start(dma0_ch1)`` 启动 DMA 传输 + +.. code-block:: C + :linenos: + + while (dma_tc_flag1 == 0) { + } + while ((bflb_i2c_get_intstatus(i2c0) & I2C_INTSTS_END) == 0) { + } + bflb_i2c_deinit(i2c0); + +- 数据传输完成后,复位 I2C 模块 + +.. code-block:: C + :linenos: + + /* Check read data */ + for (uint8_t i = 0; i < 32; i++) { + if (((uint8_t *)send_buffer)[i] != ((uint8_t *)receive_buffer)[i]) { + printf("check fail, %d write: %02x, read: %02x\r\n", i, ((uint8_t *)send_buffer)[i], ((uint8_t *)receive_buffer)[i]); + } + } + +- 检查发送和读取的数据是否一致 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +按下 RST 按键,数据传输完成后,打印“write over”,“read over”和“check over”。 \ No newline at end of file diff --git a/docs/source/samples/peripherals/i2c/i2c_eeprom_interrupt.rst b/docs/source/samples/peripherals/i2c/i2c_eeprom_interrupt.rst new file mode 100644 index 00000000..29642bfa --- /dev/null +++ b/docs/source/samples/peripherals/i2c/i2c_eeprom_interrupt.rst @@ -0,0 +1,210 @@ +I2C - eeprom_interrupt +==================== + +本 demo 主要介绍 I2C 使用中断的方式读写 eeprom。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_i2c0_gpio_init`` ,将 eeprom 模块与开发板连接,具体引脚连接方式如下表(以BL616为例): + +.. table:: 硬件连接 + :widths: 50, 50 + :width: 80% + :align: center + + +-------------------+------------------+ + | 开发板 I2C 引脚 | eeprom 模块 | + +===================+==================+ + | SCL(GPIO14) | SCL | + +-------------------+------------------+ + | SDA(GPIO15) | SDA | + +-------------------+------------------+ + | GND | GND | + +-------------------+------------------+ + | VCC | VCC | + +-------------------+------------------+ + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/i2c/i2c_eeprom_interrupt** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 I2C IP 时钟,并选择 I2C 时钟源和分频。 + +.. code-block:: C + :linenos: + + board_i2c0_gpio_init(); + +- 配置相关引脚为 `I2C` 功能 + +.. code-block:: C + :linenos: + + i2c0 = bflb_device_get_by_name("i2c0"); + + bflb_i2c_init(i2c0, 400000); + +- 获取 `i2c0` 句柄,并初始化 i2c0 频率为 400K + +.. code-block:: C + :linenos: + + /* Set i2c interrupt */ + bflb_i2c_int_mask(i2c0, I2C_INTEN_END | I2C_INTEN_TX_FIFO | I2C_INTEN_RX_FIFO | I2C_INTEN_NACK | I2C_INTEN_ARB | I2C_INTEN_FER, false); + bflb_irq_attach(i2c0->irq_num, i2c_isr, NULL); + bflb_irq_enable(i2c0->irq_num); + +- 调用 ``bflb_i2c_int_mask(i2c0, I2C_INTEN_END | I2C_INTEN_TX_FIFO | I2C_INTEN_RX_FIFO | I2C_INTEN_NACK | I2C_INTEN_ARB | I2C_INTEN_FER, false)`` 打开 I2C 中断 +- 注册 I2C 中断 + +.. code-block:: C + :linenos: + + uint8_t write_data[256]; + uint8_t read_data[256]; + + /* Write and read buffer init */ + for (size_t i = 0; i < 256; i++) { + write_data[i] = i; + read_data[i] = 0; + } + +- 初始化发送和接收 buffer + +.. code-block:: C + :linenos: + + /* Write page 0 */ + subaddr[1] = EEPROM_SELECT_PAGE0; + + msgs[0].addr = 0x50; + msgs[0].flags = I2C_M_NOSTOP; + msgs[0].buffer = subaddr; + msgs[0].length = 2; + + msgs[1].addr = 0x50; + msgs[1].flags = 0; + msgs[1].buffer = write_data; + msgs[1].length = EEPROM_TRANSFER_LENGTH; + + bflb_i2c_transfer(i2c0, msgs, 2); + if (txFifoFlag) { + printf("TX FIFO Ready interrupt generated\r\n"); + txFifoFlag = 0; + } + if (rxFifoFlag) { + printf("RX FIFO Ready interrupt generated\r\n"); + rxFifoFlag = 0; + } + printf("write over\r\n\r\n"); + bflb_mtimer_delay_ms(100); + +- ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 i2c 传输 + +.. code-block:: C + :linenos: + + /* Unmask interrupt */ + bflb_i2c_int_mask(i2c0, I2C_INTEN_END | I2C_INTEN_TX_FIFO | I2C_INTEN_RX_FIFO | I2C_INTEN_NACK | I2C_INTEN_ARB | I2C_INTEN_FER, false); + + /* Write page 1 */ + subaddr[1] = EEPROM_SELECT_PAGE1; + + msgs[1].addr = 0x50; + msgs[1].flags = 0; + msgs[1].buffer = write_data + EEPROM_TRANSFER_LENGTH; + msgs[1].length = EEPROM_TRANSFER_LENGTH; + + bflb_i2c_transfer(i2c0, msgs, 2); + if (txFifoFlag) { + printf("TX FIFO Ready interrupt generated\r\n"); + txFifoFlag = 0; + } + if (rxFifoFlag) { + printf("RX FIFO Ready interrupt generated\r\n"); + rxFifoFlag = 0; + } + printf("write over\r\n\r\n"); + bflb_mtimer_delay_ms(100); + +- 开启 I2C 中断,进行第二次数据传输 + +.. code-block:: C + :linenos: + + /* Unmask interrupt */ + bflb_i2c_int_mask(i2c0, I2C_INTEN_END | I2C_INTEN_TX_FIFO | I2C_INTEN_RX_FIFO | I2C_INTEN_NACK | I2C_INTEN_ARB | I2C_INTEN_FER, false); + + /* Read page 0 */ + subaddr[1] = EEPROM_SELECT_PAGE0; + + msgs[1].addr = 0x50; + msgs[1].flags = I2C_M_READ; + msgs[1].buffer = read_data; + msgs[1].length = EEPROM_TRANSFER_LENGTH; + bflb_i2c_transfer(i2c0, msgs, 2); + if (txFifoFlag) { + printf("TX FIFO Ready interrupt generated\r\n"); + txFifoFlag = 0; + } + if (rxFifoFlag) { + printf("RX FIFO Ready interrupt generated\r\n"); + rxFifoFlag = 0; + } + printf("read over\r\n\r\n"); + +- 读取 eeprom 的数据 + +.. code-block:: C + :linenos: + + /* Unmask interrupt */ + bflb_i2c_int_mask(i2c0, I2C_INTEN_END | I2C_INTEN_TX_FIFO | I2C_INTEN_RX_FIFO | I2C_INTEN_NACK | I2C_INTEN_ARB | I2C_INTEN_FER, false); + + /* Read page 1 */ + subaddr[1] = EEPROM_SELECT_PAGE1; + + msgs[1].addr = 0x50; + msgs[1].flags = I2C_M_READ; + msgs[1].buffer = read_data + EEPROM_TRANSFER_LENGTH; + msgs[1].length = EEPROM_TRANSFER_LENGTH; + bflb_i2c_transfer(i2c0, msgs, 2); + if (txFifoFlag) { + printf("TX FIFO Ready interrupt generated\r\n"); + txFifoFlag = 0; + } + if (rxFifoFlag) { + printf("RX FIFO Ready interrupt generated\r\n"); + rxFifoFlag = 0; + } + +- 第二次读取数据 + +.. code-block:: C + :linenos: + + /* Check read data */ + for (uint8_t i = 0; i < 2 * EEPROM_TRANSFER_LENGTH; i++) { + if (write_data[i] != read_data[i]) { + printf("check fail, %d write: %02x, read: %02x\r\n", i, write_data[i], read_data[i]); + } + } + +- 检查发送和读取的数据是否一致 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +按下 RST 按键,数据传输完成后,打印“write over”,“read over”和“check over”。 \ No newline at end of file diff --git a/docs/source/samples/peripherals/i2c/index.rst b/docs/source/samples/peripherals/i2c/index.rst new file mode 100644 index 00000000..d0a9c549 --- /dev/null +++ b/docs/source/samples/peripherals/i2c/index.rst @@ -0,0 +1,34 @@ +==== +I2C +==== + +.. toctree:: + :maxdepth: 1 + + I2C - 10-bit + I2C - eeprom + I2C - eeprom_dma + I2C - eeprom_interrupt + +I2C 信号引脚对应的 GPIO 如下表: + +.. table:: GPIO 口 + :widths: 30, 30, 40 + :width: 80% + :align: center + + +----------+-----------+---------------------------+ + | 信号 | 芯片系列 | GPIO | + +==========+===========+===========================+ + | SCL | BL702 | | + + +-----------+---------------------------+ + | | BL808 | | + + +-----------+---------------------------+ + | | BL616 | GPIO 14 | + +----------+-----------+---------------------------+ + | SDA | BL702 | | + + +-----------+---------------------------+ + | | BL808 | | + + +-----------+---------------------------+ + | | BL616 | GPIO 15 | + +----------+-----------+---------------------------+ \ No newline at end of file diff --git a/docs/source/samples/peripherals/index.rst b/docs/source/samples/peripherals/index.rst index 89c9894b..d83df3e7 100644 --- a/docs/source/samples/peripherals/index.rst +++ b/docs/source/samples/peripherals/index.rst @@ -9,4 +9,8 @@ Peripherals ADC DAC + GPIO + I2C + IR + ISO11898 UART diff --git a/docs/source/samples/peripherals/ir/index.rst b/docs/source/samples/peripherals/ir/index.rst new file mode 100644 index 00000000..c678ae17 --- /dev/null +++ b/docs/source/samples/peripherals/ir/index.rst @@ -0,0 +1,34 @@ +==== +IR +==== + +.. toctree:: + :maxdepth: 1 + + IR - nec + IR - rc5 + IR - swm + IR - tx_dma + +各系列芯片对 IR 接收和发送的支持情况如下表: + +.. table:: GPIO 口 + :widths: 30, 30, 40 + :width: 80% + :align: center + + +----------+-----------+---------------------------+ + | 信号 | 芯片系列 | GPIO | + +==========+===========+===========================+ + | IR TX | BL702 | 支持 | + + +-----------+---------------------------+ + | | BL808 | 支持 | + + +-----------+---------------------------+ + | | BL616 | 不支持 | + +----------+-----------+---------------------------+ + | IR RX | BL702 | 支持 | + + +-----------+---------------------------+ + | | BL808 | 支持 | + + +-----------+---------------------------+ + | | BL616 | 支持 | + +----------+-----------+---------------------------+ \ No newline at end of file diff --git a/docs/source/samples/peripherals/ir/ir_nec.rst b/docs/source/samples/peripherals/ir/ir_nec.rst new file mode 100644 index 00000000..948ffb60 --- /dev/null +++ b/docs/source/samples/peripherals/ir/ir_nec.rst @@ -0,0 +1,115 @@ +IR - nec +==================== + +本 demo 主要介绍 IR 以 nec 协议收发数据。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_ir_gpio_init`` ,将红外发射二极管和接收头与 IR 引脚连接,具体连接方式如下表(以BL808为例): + +.. table:: 硬件连接 + :widths: 50, 50 + :width: 80% + :align: center + + +-------------------+----------------------+ + | 开发板 IR 引脚 | 外接模块 | + +===================+======================+ + | VCC | 红外接收头 VCC | + +-------------------+----------------------+ + | GND | 红外接收头 GND | + +-------------------+----------------------+ + | RX(GPIO17) | 红外接收头 OUT | + +-------------------+----------------------+ + | VCC | 红外发射二极管正极 | + +-------------------+----------------------+ + | TX(GPIO11) | 红外发射二极管负极 | + +-------------------+----------------------+ + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/ir/ir_nec** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 IR 时钟,并选择 IR 时钟源和分频。 + +.. code-block:: C + :linenos: + + board_ir_gpio_init(); + +- 配置相关引脚为 `IR` 功能 + +.. code-block:: C + :linenos: + + uint32_t tx_buffer[1] = { 0xE916FF00 }; + struct bflb_ir_tx_config_s tx_cfg; + + irtx = bflb_device_get_by_name("irtx"); + + /* TX init */ + tx_cfg.tx_mode = IR_TX_NEC; + bflb_ir_tx_init(irtx, &tx_cfg); + +- 获取 `irtx` 句柄 +- 设置 tx_mode 为 NEC 模式,调用 ``bflb_ir_tx_init(irtx, &tx_cfg)`` 初始化 ir tx + +.. code-block:: C + :linenos: + + uint64_t rx_data; + uint8_t rx_len; + struct bflb_ir_rx_config_s rx_cfg; + + irrx = bflb_device_get_by_name("irrx"); + + /* RX init */ + rx_cfg.rx_mode = IR_RX_NEC; + rx_cfg.input_inverse = true; + rx_cfg.deglitch_enable = false; + bflb_ir_rx_init(irrx, &rx_cfg); + + /* Enable rx, wait for sending */ + bflb_ir_rx_enable(irrx, true); + +- 获取 `irrx` 句柄 +- 设置 rx_mode 为 NEC 模式,调用 ``bflb_ir_rx_init(irrx, &rx_cfg)`` 初始化 ir rx +- 调用 ``bflb_ir_rx_enable(irrx, true)`` 使能 ir rx,等待数据发送 + +.. code-block:: C + :linenos: + + bflb_ir_send(irtx, tx_buffer, 1); + rx_len = bflb_ir_receive(irrx, &rx_data); + +- 调用 ``bflb_ir_send(irtx, tx_buffer, 1)`` 发送 tx_buffer 中的数据 +- 调用 ``bflb_ir_receive(irrx, &rx_data)`` 将接收到的数据存放在 rx_data 中 + +.. code-block:: C + :linenos: + + /* Check data received */ + if (rx_data != tx_buffer[0]) { + printf("Data error! receive bit: %d, value: 0x%016lx\r\n", rx_len, rx_data); + } else { + printf("Received correctly. receive bit: %d, value: 0x%016lx\r\n", rx_len, rx_data); + } + +- 检查发送和接收的数据是否一致 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +按下开发板中 RST 按键,串口打印接收到的数据。 diff --git a/docs/source/samples/peripherals/ir/ir_rc5.rst b/docs/source/samples/peripherals/ir/ir_rc5.rst new file mode 100644 index 00000000..a6121572 --- /dev/null +++ b/docs/source/samples/peripherals/ir/ir_rc5.rst @@ -0,0 +1,115 @@ +IR - rc5 +==================== + +本 demo 主要介绍 IR 以 rc5 协议收发数据。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_ir_gpio_init`` ,将红外发射二极管和接收头与 IR 引脚连接,具体连接方式如下表(以BL808为例): + +.. table:: 硬件连接 + :widths: 50, 50 + :width: 80% + :align: center + + +-------------------+----------------------+ + | 开发板 IR 引脚 | 外接模块 | + +===================+======================+ + | VCC | 红外接收头 VCC | + +-------------------+----------------------+ + | GND | 红外接收头 GND | + +-------------------+----------------------+ + | RX(GPIO17) | 红外接收头 OUT | + +-------------------+----------------------+ + | VCC | 红外发射二极管正极 | + +-------------------+----------------------+ + | TX(GPIO11) | 红外发射二极管负极 | + +-------------------+----------------------+ + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/ir/ir_rc5** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 IR 时钟,并选择 IR 时钟源和分频。 + +.. code-block:: C + :linenos: + + board_ir_gpio_init(); + +- 配置相关引脚为 `IR` 功能 + +.. code-block:: C + :linenos: + + uint32_t tx_buffer[1] = { 0x123D }; + struct bflb_ir_tx_config_s tx_cfg; + + irtx = bflb_device_get_by_name("irtx"); + + /* TX init */ + tx_cfg.tx_mode = IR_TX_RC5; + bflb_ir_tx_init(irtx, &tx_cfg); + +- 获取 `irtx` 句柄 +- 设置 tx_mode 为 RC5 模式,调用 ``bflb_ir_tx_init(irtx, &tx_cfg)`` 初始化 ir tx + +.. code-block:: C + :linenos: + + uint64_t rx_data; + uint8_t rx_len; + struct bflb_ir_rx_config_s rx_cfg; + + irrx = bflb_device_get_by_name("irrx"); + + /* RX init */ + rx_cfg.rx_mode = IR_RX_RC5; + rx_cfg.input_inverse = true; + rx_cfg.deglitch_enable = false; + bflb_ir_rx_init(irrx, &rx_cfg); + + /* Enable rx, wait for sending */ + bflb_ir_rx_enable(irrx, true); + +- 获取 `irrx` 句柄 +- 设置 rx_mode 为 RC5 模式,调用 ``bflb_ir_rx_init(irrx, &rx_cfg)`` 初始化 ir rx +- 调用 ``bflb_ir_rx_enable(irrx, true)`` 使能 ir rx,等待数据发送 + +.. code-block:: C + :linenos: + + bflb_ir_send(irtx, tx_buffer, 1); + rx_len = bflb_ir_receive(irrx, &rx_data); + +- 调用 ``bflb_ir_send(irtx, tx_buffer, 1)`` 发送 tx_buffer 中的数据 +- 调用 ``bflb_ir_receive(irrx, &rx_data)`` 将接收到的数据存放在 rx_data 中 + +.. code-block:: C + :linenos: + + /* Check data received */ + if (rx_data != tx_buffer[0]) { + printf("Data error! receive bit: %d, value: 0x%016lx\r\n", rx_len, rx_data); + } else { + printf("Received correctly. receive bit: %d, value: 0x%016lx\r\n", rx_len, rx_data); + } + +- 检查发送和接收的数据是否一致 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +按下开发板中 RST 按键,串口打印接收到的数据。 diff --git a/docs/source/samples/peripherals/ir/ir_swm.rst b/docs/source/samples/peripherals/ir/ir_swm.rst new file mode 100644 index 00000000..db828c7c --- /dev/null +++ b/docs/source/samples/peripherals/ir/ir_swm.rst @@ -0,0 +1,105 @@ +IR - swm +==================== + +本 demo 主要介绍 IR 以软件模式收发数据。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_ir_gpio_init`` ,将红外发射二极管和接收头与 IR 引脚连接,具体连接方式如下表(以BL808为例): + +.. table:: 硬件连接 + :widths: 50, 50 + :width: 80% + :align: center + + +-------------------+----------------------+ + | 开发板 IR 引脚 | 外接模块 | + +===================+======================+ + | VCC | 红外接收头 VCC | + +-------------------+----------------------+ + | GND | 红外接收头 GND | + +-------------------+----------------------+ + | RX(GPIO17) | 红外接收头 OUT | + +-------------------+----------------------+ + | VCC | 红外发射二极管正极 | + +-------------------+----------------------+ + | TX(GPIO11) | 红外发射二极管负极 | + +-------------------+----------------------+ + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/ir/ir_swm** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 IR 时钟,并选择 IR 时钟源和分频。 + +.. code-block:: C + :linenos: + + board_ir_gpio_init(); + +- 配置相关引脚为 `IR` 功能 + +.. code-block:: C + :linenos: + + uint16_t tx_buffer[] = { 1777, 1777, 3555, 3555, 1777, 1777, 1777, 1777, 1777, 1777, + 3555, 1777, 1777, 1777, 1777, 3555, 3555, 1777, 1777, 3555, 1777 }; + struct bflb_ir_tx_config_s tx_cfg; + + irtx = bflb_device_get_by_name("irtx"); + + /* TX init */ + tx_cfg.tx_mode = IR_TX_SWM; + bflb_ir_tx_init(irtx, &tx_cfg); + +- 获取 `irtx` 句柄 +- 设置 tx_mode 为 SWM 模式,调用 ``bflb_ir_tx_init(irtx, &tx_cfg)`` 初始化 ir tx + +.. code-block:: C + :linenos: + + uint16_t rx_buffer[30]; + uint8_t rx_len; + struct bflb_ir_rx_config_s rx_cfg; + + irrx = bflb_device_get_by_name("irrx"); + + /* RX init */ + rx_cfg.rx_mode = IR_RX_SWM; + rx_cfg.input_inverse = true; + rx_cfg.deglitch_enable = false; + rx_cfg.end_threshold = 3999; + bflb_ir_rx_init(irrx, &rx_cfg); + + /* Enable rx, wait for sending */ + bflb_ir_rx_enable(irrx, true); + +- 获取 `irrx` 句柄 +- 设置 rx_mode 为 SWM 模式,调用 ``bflb_ir_rx_init(irrx, &rx_cfg)`` 初始化 ir rx +- 调用 ``bflb_ir_rx_enable(irrx, true)`` 使能 ir rx,等待数据发送 + +.. code-block:: C + :linenos: + + bflb_ir_swm_send(irtx, tx_buffer, sizeof(tx_buffer) / sizeof(tx_buffer[0])); + rx_len = bflb_ir_swm_receive(irrx, rx_buffer, 30); + +- 调用 ``bflb_ir_swm_send(irtx, tx_buffer, sizeof(tx_buffer) / sizeof(tx_buffer[0]))`` 发送 tx_buffer 中的数据 +- 调用 ``bflb_ir_swm_receive(irrx, rx_buffer, 30)`` 将接收到的数据存放在 rx_buffer 中 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +按下开发板中 RST 按键,串口打印接收到的数据。 diff --git a/docs/source/samples/peripherals/ir/ir_tx_dma.rst b/docs/source/samples/peripherals/ir/ir_tx_dma.rst new file mode 100644 index 00000000..55565dc0 --- /dev/null +++ b/docs/source/samples/peripherals/ir/ir_tx_dma.rst @@ -0,0 +1,151 @@ +IR - tx_dma +==================== + +本 demo 主要介绍 IR 使用 DMA 的方式发送数据。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_ir_gpio_init`` ,将红外发射二极管与 IR 引脚连接,具体连接方式如下表(以BL808为例): + +.. table:: 硬件连接 + :widths: 50, 50 + :width: 80% + :align: center + + +-------------------+----------------------+ + | 开发板 IR 引脚 | 外接模块 | + +===================+======================+ + | VCC | 红外发射二极管正极 | + +-------------------+----------------------+ + | TX(GPIO11) | 红外发射二极管负极 | + +-------------------+----------------------+ + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/ir/ir_tx_dma** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 IR 时钟,并选择 IR 时钟源和分频。 + +.. code-block:: C + :linenos: + + board_ir_gpio_init(); + +- 配置相关引脚为 `IR` 功能 + +.. code-block:: C + :linenos: + + struct bflb_ir_tx_config_s tx_cfg = { + .tx_mode = IR_TX_CUSTOMIZE, + .data_bits = 0, + .tail_inverse = 0, + .tail_enable = 0, + .head_inverse = 0, + .head_enable = 0, + .logic1_inverse = 1, + .logic0_inverse = 1, + .data_enable = 1, + .swm_enable = 0, + .output_modulation = 1, + .output_inverse = 0, + .freerun_enable = 1, + .continue_enable = 1, + .fifo_width = IR_TX_FIFO_WIDTH_24BIT, + .fifo_threshold = 1, + .logic0_pulse_width_1 = 0, + .logic0_pulse_width_0 = 0, + .logic1_pulse_width_1 = 2, + .logic1_pulse_width_0 = 0, + .head_pulse_width_1 = 0, + .head_pulse_width_0 = 0, + .tail_pulse_width_1 = 0, + .tail_pulse_width_0 = 0, + .modu_width_1 = 17, + .modu_width_0 = 34, + .pulse_width_unit = 1124, + }; + + irtx = bflb_device_get_by_name("irtx"); + + /* TX init */ + bflb_ir_tx_init(irtx, &tx_cfg); + bflb_ir_link_txdma(irtx, true); + bflb_ir_tx_enable(irtx, true); + +- 获取 `irtx` 句柄 +- 设置 tx_mode 为 IR_TX_CUSTOMIZE 模式,调用 ``bflb_ir_tx_init(irtx, &tx_cfg)`` 初始化 ir tx +- 调用 ``bflb_ir_link_txdma(irtx, true)`` 使能 ir tx dma 功能 +- 调用 ``bflb_ir_tx_enable(irtx, true)`` 开启 ir tx + +.. code-block:: C + :linenos: + + struct bflb_dma_channel_config_s dma_config = { + .direction = DMA_MEMORY_TO_PERIPH, + .src_req = DMA_REQUEST_NONE, + .dst_req = DMA_REQUEST_IR_TX, + .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, + .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, + .src_burst_count = DMA_BURST_INCR1, + .dst_burst_count = DMA_BURST_INCR1, + .src_width = DMA_DATA_WIDTH_32BIT, + .dst_width = DMA_DATA_WIDTH_32BIT, + }; + + for (i = 0; i < 128; i++) { + tx_buffer[i] = i * 0x01010101; + } + + dma0_ch0 = bflb_device_get_by_name("dma0_ch0"); + bflb_dma_channel_init(dma0_ch0, &dma_config); + bflb_dma_channel_irq_attach(dma0_ch0, dma0_ch0_isr, NULL); + +- 对于 TX, DMA 的配置如下:传输方向(direction)为内存到外设(MEMORY_TO_PERIPH),源请求(src_req)为内存,目标请求(dst_req)为 DMA_REQUEST_IR_TX +- 初始化 tx_buffer +- 调用 ``bflb_dma_channel_init(dma0_ch0, &dma_config)`` 初始化 DMA +- 调用 ``bflb_dma_channel_irq_attach(dma0_ch0, dma0_ch0_isr, NULL)`` 注册 dma 通道 0 中断 + +.. code-block:: C + :linenos: + + struct bflb_dma_channel_lli_pool_s tx_llipool[1]; + struct bflb_dma_channel_lli_transfer_s tx_transfers[1]; + + tx_transfers[0].src_addr = (uint32_t)tx_buffer; + tx_transfers[0].dst_addr = (uint32_t)DMA_ADDR_IR_TDR; + tx_transfers[0].nbytes = 128 * 4; + bflb_dma_channel_lli_reload(dma0_ch0, tx_llipool, 1, tx_transfers, 1); + bflb_dma_channel_start(dma0_ch0); + +- 分配一块 lli 内存池,最多可以传输 4064 * 1 字节 +- 配置一块内存(tx_transfers)进行传输,源地址(src_addr)为存储发送数据的内存地址(tx_buffer),目标地址(dst_addr)为 IR TX FIFO地址(DMA_ADDR_IR_TDR) +- 调用 ``bflb_dma_channel_lli_reload(dma0_ch0, tx_llipool, 1, tx_transfers, 1)`` 初始化 +- 调用 ``bflb_dma_channel_start(dma0_ch0)`` 启动 DMA 传输 + +.. code-block:: C + :linenos: + + while (dma_tc_flag0 != 1) { + bflb_mtimer_delay_ms(1); + } + printf("Check wave\r\n"); + +- DMA 传输完成后,查看波形 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +按下 RST 按键,数据传输完成后,查看波形是否正确。 \ No newline at end of file diff --git a/docs/source/samples/peripherals/iso11898/index.rst b/docs/source/samples/peripherals/iso11898/index.rst new file mode 100644 index 00000000..4cd442fe --- /dev/null +++ b/docs/source/samples/peripherals/iso11898/index.rst @@ -0,0 +1,32 @@ +==== +ISO11898 +==== + +.. toctree:: + :maxdepth: 1 + + ISO11898 - filter + ISO11898 - selftest + +ISO11898 引脚对应的 GPIO 如下表: + +.. table:: GPIO 口 + :widths: 30, 30, 40 + :width: 80% + :align: center + + +----------+-----------+---------------------------+ + | 名称 | 芯片系列 | GPIO | + +==========+===========+===========================+ + | TX | BL702 | | + + +-----------+---------------------------+ + | | BL808 | | + + +-----------+---------------------------+ + | | BL616 | GPIO 0 | + +----------+-----------+---------------------------+ + | RX | BL702 | | + + +-----------+---------------------------+ + | | BL808 | | + + +-----------+---------------------------+ + | | BL616 | GPIO 1 | + +----------+-----------+---------------------------+ \ No newline at end of file diff --git a/docs/source/samples/peripherals/iso11898/iso11898_selftest.rst b/docs/source/samples/peripherals/iso11898/iso11898_selftest.rst new file mode 100644 index 00000000..5437f7a9 --- /dev/null +++ b/docs/source/samples/peripherals/iso11898/iso11898_selftest.rst @@ -0,0 +1,68 @@ +ISO11898 - selftest +==================== + +本 demo 主要介绍 ISO11898 数据自发自收。 + +硬件连接 +----------------------------- + +本 demo 使用到的 gpio 参考 ``board_iso11898_gpio_init`` ,将 TX 和 RX 连接。 + +软件实现 +----------------------------- + +更详细的代码请参考 **examples/peripherals/iso11898/iso11898_selftest** + +.. code-block:: C + :linenos: + + board_init(); + +- ``board_init`` 中会开启 ISO11898 时钟,并选择时钟源和分频。 + +.. code-block:: C + :linenos: + + board_iso11898_gpio_init(); + +- 配置相关引脚为 `ISO11898` 功能 + +.. code-block:: C + :linenos: + + iso11898 = bflb_device_get_by_name("iso11898"); + + bflb_iso11898_init(iso11898, &cfg); + bflb_iso11898_set_filter(iso11898, &filter); + ret = bflb_iso11898_send(iso11898, &msg_tx, 1000); + +- 获取 `iso11898` 句柄 +- 调用 ``bflb_iso11898_init(iso11898, &cfg)`` 初始化 iso11898 +- 调用 ``bflb_iso11898_set_filter(iso11898, &filter)`` 开启接收标识符滤波功能 +- 调用 ``bflb_iso11898_send(iso11898, &msg_tx, 1000)`` 发送帧信息,ID 号以及数据 + +.. code-block:: C + :linenos: + + ret = bflb_iso11898_recv(iso11898, &msg_rx, 10000); + +- 调用 ``bflb_iso11898_recv(iso11898, &msg_rx, 10000)`` 将接收到的数据存放在 msg_rx 中 + +.. code-block:: C + :linenos: + + bflb_ir_send(irtx, tx_buffer, 1); + rx_len = bflb_ir_receive(irrx, &rx_data); + +- 调用 ``bflb_ir_send(irtx, tx_buffer, 1)`` 发送 tx_buffer 中的数据 +- 调用 ``bflb_ir_receive(irrx, &rx_data)`` 将接收到的数据存放在 rx_data 中 + +编译和烧录 +----------------------------- + +参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` + +实验现象 +----------------------------- + +按下开发板中 RST 按键,串口打印接收到的数据。 diff --git a/docs/source/samples/peripherals/uart/uart_dma.rst b/docs/source/samples/peripherals/uart/uart_dma.rst index 61a1ce9d..b24d8b34 100644 --- a/docs/source/samples/peripherals/uart/uart_dma.rst +++ b/docs/source/samples/peripherals/uart/uart_dma.rst @@ -146,14 +146,8 @@ UART - dma 编译和烧录 ----------------------------- -- **命令行编译** - 参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` -- **烧录** - -参考 :ref:`bl_dev_cube` - 实验现象 ----------------------------- diff --git a/docs/source/samples/peripherals/uart/uart_poll.rst b/docs/source/samples/peripherals/uart/uart_poll.rst index cc306ea8..0091b2fc 100644 --- a/docs/source/samples/peripherals/uart/uart_poll.rst +++ b/docs/source/samples/peripherals/uart/uart_poll.rst @@ -82,14 +82,8 @@ UART - poll 编译和烧录 ----------------------------- -- **命令行编译** - 参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd` -- **烧录** - -参考 :ref:`bl_dev_cube` - 实验现象 -----------------------------