This repository has been archived on 2023-07-17. You can view files and clone it, but cannot push or open issues or pull requests.
bl_mcu_sdk/docs/source/api_reference/peripherals/dma.rst
2022-12-07 10:19:27 +08:00

376 lines
7.5 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

DMA
=============
Macros
------------
dma direction
^^^^^^^^^^^^^^^
dma 传输方向支持 4 种。
.. code-block:: c
:linenos:
#define DMA_MEMORY_TO_MEMORY 0
#define DMA_MEMORY_TO_PERIPH 1
#define DMA_PERIPH_TO_MEMORY 2
#define DMA_PERIPH_TO_PERIPH 3
dma addr increment
^^^^^^^^^^^^^^^^^^^^^
dma 地址自增使能。
.. code-block:: c
:linenos:
#define DMA_ADDR_INCREMENT_DISABLE 0
#define DMA_ADDR_INCREMENT_ENABLE 1
dma data width
^^^^^^^^^^^^^^^^^^^^^
dma 传输位宽支持 8BIT 、16BIT、32BIT。
.. code-block:: c
:linenos:
#define DMA_TRANSFER_WIDTH_8BIT 0
#define DMA_TRANSFER_WIDTH_16BIT 1
#define DMA_TRANSFER_WIDTH_32BIT 2
dma burst size
^^^^^^^^^^^^^^^^^^^^^
dma 突发传输个数,最多 16 字节突发。
.. code-block:: c
:linenos:
#define DMA_BURST_INCR1 0
#define DMA_BURST_INCR4 1
#define DMA_BURST_INCR8 2
#define DMA_BURST_INCR16 3
.. warning:: 位宽 * 突发个数 需要小于等于 16 字节
dma addr
^^^^^^^^^^^^^^^^^^^^^
参考 `bflb_dma.h` 文件,不详细列出。
dma request
^^^^^^^^^^^^^^^^^^^^^
参考 `bflb_dma.h` 文件,不详细列出。
Structs
------------
struct bflb_dma_channel_lli_pool_s
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
由于 dma 支持 lli 模式,所以需要在传输之前分配一块内存池给 lli 使用, 调用 `bflb_dma_lli_reload` 后会自动消耗内存池和配置相关 lli 信息,无需用户手动配置。
.. code-block:: c
:linenos:
struct bflb_dma_channel_lli_pool_s {
uint32_t src_addr;
uint32_t dst_addr;
uint32_t nextlli;
union bflb_dma_lli_control_s lli_control;
};
struct bflb_dma_channel_lli_transfer_s
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
用户使用 lli 传输时,需要填充的传输内容:源地址、目标地址和长度,并且如果地址不连续,可以增加多个 transfer。
.. code-block:: c
:linenos:
struct bflb_dma_channel_lli_transfer_s {
uint32_t src_addr;
uint32_t dst_addr;
uint32_t nbytes;
};
struct bflb_dma_channel_config_s
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
初始化 dma 通道时需要填充的信息。
.. code-block:: c
:linenos:
struct bflb_dma_channel_config_s {
uint8_t direction;
uint32_t src_req;
uint32_t dst_req;
uint8_t src_addr_inc;
uint8_t dst_addr_inc;
uint8_t src_burst_count;
uint8_t dst_burst_count;
uint8_t src_width;
uint8_t dst_width;
};
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - direction
- 传输方向
* - src_req
- 源 dma 请求
* - dst_req
- 目标 dma 请求
* - src_addr_inc
- 源地址是否自增
* - dst_addr_inc
- 目标地址是否自增
* - src_burst_count
- 源地址突发个数
* - dst_burst_count
- 目标地址突发个数
* - src_width
- 源地址位宽
* - dst_width
- 目标地址位宽
Functions
------------
bflb_dma_channel_init
^^^^^^^^^^^^^^^^^^^^^^^^^^
说明: 初始化 dma 通道。
.. code-block:: c
:linenos:
void bflb_dma_channel_init(struct bflb_device_s *dev, const struct bflb_dma_channel_config_s *config);
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - dev
- 设备句柄
* - config
- 配置参数
bflb_dma_channel_deinit
^^^^^^^^^^^^^^^^^^^^^^^^^^
说明: 反初始化 dma 通道。
.. code-block:: c
:linenos:
void bflb_dma_channel_deinit(struct bflb_device_s *dev);
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - dev
- 设备句柄
bflb_dma_channel_start
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
说明: 启动 dma 通道传输。
.. code-block:: c
:linenos:
void bflb_dma_channel_start(struct bflb_device_s *dev);
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - dev
- 设备句柄
bflb_dma_channel_stop
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
说明: 关闭 dma 通道传输。
.. code-block:: c
:linenos:
void bflb_dma_channel_stop(struct bflb_device_s *dev);
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - dev
- 设备句柄
bflb_dma_channel_isbusy
^^^^^^^^^^^^^^^^^^^^^^^^^^
说明: 检查 dma 通道是否处于 busy 状态。
.. code-block:: c
:linenos:
bool bflb_dma_channel_isbusy(struct bflb_device_s *dev);
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - dev
- 设备句柄
* - return
- 是否 busy
bflb_dma_channel_irq_attach
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
说明: 注册 dma 通道中断完成回调函数并开启通道完成中断。
.. code-block:: c
:linenos:
void bflb_dma_channel_irq_attach(struct bflb_device_s *dev, void (*callback)(void *arg), void *arg);
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - dev
- 设备句柄
* - callback
- 回调函数
* - arg
- 用户参数
bflb_dma_channel_irq_detach
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
说明: 关闭 dma 通道完成中断。
.. code-block:: c
:linenos:
void bflb_dma_channel_irq_detach(struct bflb_device_s *dev);
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - dev
- 设备句柄
bflb_dma_channel_lli_reload
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
说明: 配置 dma 通道的 lli 信息。
.. code-block:: c
:linenos:
int bflb_dma_channel_lli_reload(struct bflb_device_s *dev,
struct bflb_dma_channel_lli_pool_s *lli_pool, uint32_t max_lli_count,
struct bflb_dma_channel_lli_transfer_s *transfer, uint32_t count);
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - dev
- 设备句柄
* - lli_pool
- lli 内存池
* - max_lli_count
- lli 内存池大小
* - transfer
- 传输句柄
* - count
- 传输次数
* - return
- 返回使用的 lli count个数小于0表示错误
bflb_dma_channel_lli_link_head
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
说明: 将 lli 最后一个链表与头部连接,表示开启循环模式。
.. code-block:: c
:linenos:
void bflb_dma_channel_lli_link_head(struct bflb_device_s *dev,
struct bflb_dma_channel_lli_pool_s *lli_pool, uint32_t used_lli_count);
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - dev
- 设备句柄
* - lli_pool
- lli 内存池
* - used_lli_count
- 已经使用的 lli 个数
bflb_dma_feature_control
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
说明: dma 其他特性相关控制,一般不常用。
.. code-block:: c
:linenos:
void bflb_dma_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);
.. list-table::
:widths: 10 10
:header-rows: 1
* - parameter
- description
* - dev
- 设备句柄
* - cmd
- 控制字
* - arg
- 控制参数
`cmd` 可以填入以下参数:
.. code-block:: c
:linenos:
#define DMA_CMD_SET_SRCADDR_INCREMENT (0x01)
#define DMA_CMD_SET_DSTADDR_INCREMENT (0x02)
#define DMA_CMD_SET_ADD_MODE (0x03)
#define DMA_CMD_SET_REDUCE_MODE (0x04)