Direct Memory Access (DMA) support(dma.h)
ダイレクトメモリアクセス(DMA)サポート
概要
ダイレクトメモリアクセス(DMA)をサポートします。
補足説明
DMAサポートにおいて、Arduino STM32ではオリジナルのlibmaple下位レイアライブラリを修正しています。
その解説がdma.hの上部のコメントに記載されています。下記がその翻訳(google翻訳+ちょっと修正)です。
■ dma_tube型、およびシリーズでサポートされている各チューブの事前定義値について
"DMA tube"はシリーズ固有の(おそらく整数型の)データ型です。
それはDMA化されたデータフローが通過するコンジットを抽象化します。
例:STM32F1では、dma_tubeはdma_channelの単なる別名であり、チューブ値は単なるDMA_CH1(= 1)、DMA_CH2(= 2)などです。
dma_tubeは列挙型である必要はなく、その値は整数である必要はありません。
とはいえ、それらは引数として渡すためには手軽である必要があります。
■ dma_tube_reg_map構造体型(およびdma_tube_reg_mapの構造体の型の定義)
DMAレジスタマップは、グローバルレジスタとチューブごとのレジスタに分割される傾向があります。どのレジスタを扱っているのかわからなくても、チューブのレジスタへのポインタを渡すことが便利です。
■ さまざまなdma_tube_reg_mapへの基本ポインタ
例:STM32F1では、これらはDMAxCHy_BASEです。 DMAxCHy_BASE-> CPARなどのレジスタにアクセスできます。
■ dma_request_src列挙型(およびdma_request_srcの型の定義)
これは周辺DMA要求ソース(例えばUSART TX DMA要求など)を特定する。
■ dma_mode_flags列挙型(およびdma_mode_flagsの型の定義)
dma_tube_configで使用されます。 2つの系列が両方とも同じモードフラグをサポートする場合、それらはそれらのフラグに同じ列挙子名を使用しなければなりません(もちろんそれらの列挙子の値は異なることが許されます)。
■ 通常(オリジナル版から修正なく利用できる)のもの
dma_reg_mapとベースポインタ、レジスタビット定義、
dma_devポインタ宣言、およびこのシリーズに役立つその他の便利な関数。
データ型
■ struct dma_reg_map
DMAレジスタマップタイプ
DMAコントローラ2(レジスタマップベースポインタDMA2_BASE)はチャネル1〜5のみをサポートします。
メンバー変数
__IO uint32 ISR DMA割り込みステータスレジスタ
__IO uint32 IFCR DMA割り込みフラグクリアレジスタ
__IO uint32 CCR1 DMAチャネル1 設定レジスタ
__IO uint32 CNDTR1 DMAチャネル1 データ数レジスタ
__IO uint32 CPAR1 DMAチャネル1 ぺリフェラルアドレスレジスタ
__IO uint32 CMAR1 DMAチャネル1 メモリアドレスレジスタ
const uint32 RESERVED1 リザーブ
__IO uint32 CCR2 DMAチャネル2 設定レジスタ
__IO uint32 CNDTR2 DMAチャネル2 データ数レジスタ
__IO uint32 CPAR2 DMAチャネル2 ぺリフェラルアドレスレジスタ
__IO uint32 CMAR2 DMAチャネル2 メモリアドレスレジスタ
const uint32 RESERVED2 リザーブ
__IO uint32 CCR3 DMAチャネル3 設定レジスタ
__IO uint32 CNDTR3 DMAチャネル3 データ数レジスタ
__IO uint32 CPAR3 DMAチャネル3 ぺリフェラルアドレスレジスタ
__IO uint32 CMAR3 DMAチャネル3 メモリアドレスレジスタ
const uint32 RESERVED3 リザーブ
__IO uint32 CCR4 DMAチャネル4 設定レジスタ
__IO uint32 CNDTR4 DMAチャネル4 データ数レジスタ
__IO uint32 CPAR4 DMAチャネル4 ぺリフェラルアドレスレジスタ
__IO uint32 CMAR4 DMAチャネル4 メモリアドレスレジスタ
const uint32 RESERVED4 リザーブ
__IO uint32 CCR5 DMAチャネル5 設定レジスタ
__IO uint32 CNDTR5 DMAチャネル5 データ数レジスタ
__IO uint32 CPAR5 DMAチャネル5 ぺリフェラルアドレスレジスタ
__IO uint32 CMAR5 DMAチャネル5 メモリアドレスレジスタ
const uint32 RESERVED5 リザーブ
__IO uint32 CCR6 DMAチャネル6 設定レジスタ
__IO uint32 CNDTR6 DMAチャネル6 データ数レジスタ
__IO uint32 CPAR6 DMAチャネル6 ぺリフェラルアドレスレジスタ
__IO uint32 CMAR6 DMAチャネル6 メモリアドレスレジスタ
const uint32 RESERVED6 リザーブ
__IO uint32 CCR7 DMAチャネル7 設定レジスタ
__IO uint32 CNDTR7 DMAチャネル7 データ数レジスタ
__IO uint32 CPAR7 DMAチャネル7 ぺリフェラルアドレスレジスタ
__IO uint32 CMAR7 DMAチャネル7 メモリアドレスレジスタ
const uint32 RESERVED7 リザーブ
■ struct dma_tube_reg_map
STM32F1 DMAチャネル(チューブ)レジスタマップタイプ
Arduino STM32で追加されたデータ型です。
メンバー変数
__IO uint32 CCR DMAチャネル 設定レジスタ
__IO uint32 CNDTR DMAチャネル データ数レジスタ
__IO uint32 CPAR DMAチャネル ぺリフェラルアドレスレジスタ
__IO uint32 CMAR DMAチャネル メモリアドレスレジスタ
■ dma_tube_config
DMAチューブ構成を指定します。
Arduino STM32で追加されたデータ型です。
メンバー変数
__IO void *tube_src 転送元データ
dma_xfer_size tube_src_size 転送元サイズ
__IO void *tube_dst 転送先データ
dma_xfer_size tube_dst_size 転送先データサイズ
unsigned tube_nr_xfers 転送データ数(0 to 65,535)
tube_nr_xfersはバイト単位ではありません。
それはデータ数で測定され、tube_src_sizeの倍数で発生します。
たとえば、tube_src_sizeがDMA_SIZE_32BITSで、tube_nr_xfersが2の場合、合計8バイトが転送されます。
unsigned tube_flags ターゲット固有の設定フラグ
これらはシリーズ固有のenum dma_mode_flags値のORです。
ここで使用できるフラグについては、ターゲットの資料を参照してください。
典型的なフラグの例:DMA_CFG_SRC_INC、DMA_CFG_DST_INC、DMA_CFG_CIRC、DMA_CFG_CMPLT_IEなど
void *target_data 現在未使用、0かあなたの目標に有効な値を設定して下さい
enum dma_request_src tube_req_src ハードウェアDMA要求元。これはメモリ間転送では無視されます。
■ struct dma_dev
DMAデバイス・タイプ
struct dma_reg_map *regs レジスタ・マップ
rcc_clk_id clk_id クロックID
struct dma_handler_config handlers[] IRQハンドラとNVIC番号
■ struct dma_handler_config
DMAチャネル割り込みに関連する状態をカプセル化します。
void (*handler)(void); ユーザハンドラ
nvic_irq_num irq_line チャンネルのNVIC割り込み番号
■ dma_mode_flags列挙型
DMA転送設定用のフラグ
DMA_MEM_2_MEM = 1 << 14 メモリ間転送モード
DMA_MINC_MODE = 1 << 7 メモリインクリメントモード
DMA_PINC_MODE = 1 << 6 ペリフェラルインクリメントモード
DMA_CIRC_MODE = 1 << 5 サーキュラモード
DMA_FROM_MEM = 1 << 4 メモリからペリフェラルへの読み出し
DMA_TRNS_ERR = 1 << 3 転送エラー割り込み
DMA_HALF_TRNS = 1 << 2 1/2 転送終了割り込み
DMA_TRNS_CMPLT = 1 << 1 転送完了時に割り込み
■ dma_xfer_size 列挙型
転送元と転送先のサイズ
DMA_SIZE_8BITS = 0 8ビット
DMA_SIZE_16BITS = 1 16ビット
DMA_SIZE_32BITS = 2 32ビット
■ dma_channel 列挙型
DMAチャネル
DMA_CH0 = 0 チャンネル 0
DMA_CH1 = 1 チャンネル 1
DMA_CH2 = 2 チャンネル 2
DMA_CH3 = 3 チャンネル 3
DMA_CH4 = 4 チャンネル 4
DMA_CH5 = 5 チャンネル 5
DMA_CH6 = 6 チャンネル 6
DMA_CH7 = 7 チャンネル 7
■ dma_tube 列挙型
dma_channel 列挙型の別名です。
■ dma_priority 列挙型
DMA転送優先順位
DMA_PRIORITY_LOW = 0 低優先
DMA_PRIORITY_MEDIUM = 1 中優先
DMA_PRIORITY_HIGH = 2 高優先
DMA_PRIORITY_VERY_HIGH = 3 最優先
■ dma_irq_cause 列挙型
DMA割り込みが呼び出された理由のコード
DMA_TRANSFER_COMPLETE 転送が完了しました
DMA_TRANSFER_HALF_COMPLETE 1/2 転送終了
DMA_TRANSFER_ERROR 転送中にエラーが発生
DMA_TRANSFER_DME_ERROR 転送中にダイレクトモードエラーが発生
DMA_TRANSFER_FIFO_ERROR 転送中にFIFOエラーが発生
■ dma_channel_reg_map
DMAチャネルレジスタマップ型
dma_channel_reg_mapの別名(define文で定義)
#define dma_channel_reg_map dma_tube_reg_map
これは後方互換性のために用意されています。
※ dma_channel_reg_mapの実態は、dma_channel_reg_mapを参照
■ enum dma_request_src列挙型
DMA要求元
Arduino STM32で追加されたデータ型です。
はDMA要求可能な様々な周辺機能を指定します。
それらを使用してDMA転送を設定します(struct dma_tube_config、dma_tube_cfg()を参照)。
(重要)STM32F1 DMA要求元について
1. STM32F1では、各dma_request_srcは特定のDMAコントローラ上の特定のチューブによってのみ使用できます。
たとえば、DMA_REQ_SRC_ADC1はDMA1、チューブ1に属します。
DMA2はADC1からの要求を処理できません。また、DMA1チューブ2などを処理することもできません。
2.一般に、DMAチューブは一度に1つのリクエストソースにしか対応できません。
STM32F1では、1つのチューブに対して2つのリクエストソースがアクティブな場合、Terrible Super Bad Things(ひどく悪い状況)が発生します。
これらすべてを整理しやすくするために、
これらのdma_request_src列挙子はDMAコントローラーとチューブによってグループ化されています。
dma_tube_cfg()でのエラーチェックのために、
各要求ソースはそれが属するDMAコントローラとチャネルをエンコードします。
DMA1 request sources
DMA1, tube 1
DMA_REQ_SRC_ADC1 = (RCC_DMA1 << 3) | 1
DMA_REQ_SRC_TIM2_CH3 = (RCC_DMA1 << 3) | 1
DMA_REQ_SRC_TIM4_CH1 = (RCC_DMA1 << 3) | 1
DMA1, tube 2
DMA_REQ_SRC_SPI1_RX = (RCC_DMA1 << 3) | 2
DMA_REQ_SRC_USART3_TX = (RCC_DMA1 << 3) | 2
DMA_REQ_SRC_TIM1_CH1 = (RCC_DMA1 << 3) | 2
DMA_REQ_SRC_TIM2_UP = (RCC_DMA1 << 3) | 2
DMA_REQ_SRC_TIM3_CH3 = (RCC_DMA1 << 3) | 2
DMA1, tube 3
DMA_REQ_SRC_SPI1_TX = (RCC_DMA1 << 3) | 3
DMA_REQ_SRC_USART3_RX = (RCC_DMA1 << 3) | 3
DMA_REQ_SRC_TIM1_CH2 = (RCC_DMA1 << 3) | 3
DMA_REQ_SRC_TIM3_CH4 = (RCC_DMA1 << 3) | 3
DMA_REQ_SRC_TIM3_UP = (RCC_DMA1 << 3) | 3
DMA1, tube 4
DMA_REQ_SRC_SPI2_RX = (RCC_DMA1 << 3) | 4
DMA_REQ_SRC_I2S2_RX = (RCC_DMA1 << 3) | 4
DMA_REQ_SRC_USART1_TX = (RCC_DMA1 << 3) | 4
DMA_REQ_SRC_I2C2_TX = (RCC_DMA1 << 3) | 4
DMA_REQ_SRC_TIM1_CH4 = (RCC_DMA1 << 3) | 4
DMA_REQ_SRC_TIM1_TRIG = (RCC_DMA1 << 3) | 4
DMA_REQ_SRC_TIM1_COM = (RCC_DMA1 << 3) | 4
DMA_REQ_SRC_TIM4_CH2 = (RCC_DMA1 << 3) | 4
DMA1, tube 5
DMA_REQ_SRC_SPI2_TX = (RCC_DMA1 << 3) | 5
DMA_REQ_SRC_I2S2_TX = (RCC_DMA1 << 3) | 5
DMA_REQ_SRC_USART1_RX = (RCC_DMA1 << 3) | 5
DMA_REQ_SRC_I2C2_RX = (RCC_DMA1 << 3) | 5
DMA_REQ_SRC_TIM1_UP = (RCC_DMA1 << 3) | 5
DMA_REQ_SRC_TIM2_CH1 = (RCC_DMA1 << 3) | 5
DMA_REQ_SRC_TIM4_CH3 = (RCC_DMA1 << 3) | 5
DMA1, tube 6
DMA_REQ_SRC_USART2_RX = (RCC_DMA1 << 3) | 6
DMA_REQ_SRC_I2C1_TX = (RCC_DMA1 << 3) | 6
DMA_REQ_SRC_TIM1_CH3 = (RCC_DMA1 << 3) | 6
DMA_REQ_SRC_TIM3_CH1 = (RCC_DMA1 << 3) | 6
DMA_REQ_SRC_TIM3_TRIG = (RCC_DMA1 << 3) | 6
DMA1, tube 7
DMA_REQ_SRC_USART2_TX = (RCC_DMA1 << 3) | 7
DMA_REQ_SRC_I2C1_RX = (RCC_DMA1 << 3) | 7
DMA_REQ_SRC_TIM2_CH2 = (RCC_DMA1 << 3) | 7
DMA_REQ_SRC_TIM2_CH4 = (RCC_DMA1 << 3) | 7
DMA_REQ_SRC_TIM4_UP = (RCC_DMA1 << 3) | 7
DMA2 request sources
DMA2, tube1
DMA_REQ_SRC_SPI3_RX = (RCC_DMA2 << 3) | 1
DMA_REQ_SRC_I2S3_RX = (RCC_DMA2 << 3) | 1
DMA_REQ_SRC_TIM5_CH4 = (RCC_DMA2 << 3) | 1
DMA_REQ_SRC_TIM5_TRIG = (RCC_DMA2 << 3) | 1
DMA2, tube 2
DMA_REQ_SRC_SPI3_TX = (RCC_DMA2 << 3) | 2
DMA_REQ_SRC_I2S3_TX = (RCC_DMA2 << 3) | 2
DMA_REQ_SRC_TIM5_CH3 = (RCC_DMA2 << 3) | 2
DMA_REQ_SRC_TIM5_UP = (RCC_DMA2 << 3) | 2
DMA2, tube 3
DMA_REQ_SRC_UART4_RX = (RCC_DMA2 << 3) | 3
DMA_REQ_SRC_TIM6_UP = (RCC_DMA2 << 3) | 3
DMA_REQ_SRC_DAC_CH1 = (RCC_DMA2 << 3) | 3
DMA2, tube 4
DMA_REQ_SRC_SDIO = (RCC_DMA2 << 3) | 4
DMA_REQ_SRC_TIM5_CH2 = (RCC_DMA2 << 3) | 4
DMA2, tube 5
DMA_REQ_SRC_ADC3 = (RCC_DMA2 << 3) | 5
DMA_REQ_SRC_UART4_TX = (RCC_DMA2 << 3) | 5
DMA_REQ_SRC_TIM5_CH1 = (RCC_DMA2 << 3) | 5
■ enum dma_cfg_flags 列挙型
(シリーズ依存)DMAチューブ(チャンネル)設定フラグ
Arduino STM32]で追加されたデータ型です。
DMAチューブのための設定の雑多なビットを指定します。
(struct dma_mode_configを参照)
- DMA_CFG_SRC_INC = 1U << 31 :送信元アドレスインクリメントモード
このフラグが設定(1)されていると、各DMA転送後に送信元アドレスが(送信元容量によって)増加されます。
- DMA_CFG_DST_INC = 1U << 30 :宛先アドレスインクリメントモード
このフラグが設定されている場合、各DMA転送の後にデスティネーションアドレスが
(デスティネーションサイズによって)インクリメントされます。
- DMA_CFG_CIRC = DMA_CCR_CIRC :循環モード、このモードはメモリ間転送には使用できません。
- DMA_CFG_CMPLT_IE = DMA_CCR_TCIE :転送完了割り込み許可
- DMA_CFG_HALF_CMPLT_IE = DMA_CCR_HTIE :転送半完了割り込みイネーブル
- DMA_CFG_ERR_IE = DMA_CCR_TEIE :転送エラー割り込み許可
デバイス
dma_dev *DMA1 DMA1 デバイス
dma_dev *DMA2 DMA2 デバイス
API関数
■ void dma_init(dma_dev *dev)
DMAデバイスを初期化します。
引数
dev : 初期化するデバイスDMAデバイス
■ void dma_setup_transfer(dma_dev *dev, dma_channel channel, __IO void *peripheral_address, dma_xfer_size peripheral_size, __IO void *memory_address, dma_xfer_size memory_size, uint32 mode)
DMA転送を設定します。
チャネルは再設定される前に無効になります。 デフォルトでは、転送は優先順位が低くなります。dma_set_priority()を使用して転送を開始する前に、他の優先順位を選択することも、他の優先順位を設定することもできます。 チャンネルが好みに合わせて設定されたら、dma_enable()を使用して有効にします。
(注意)
本APIの利用は非推奨です。後方互換性のためのみ利用して下さい。
新しいコードでは代わりにdma_tube_cfg()を使用してください。
(この情報だけではF2上にDMAストリームを完全に構成することは不可能であるため、このインターフェースはF1とあまりにも結び付いています)
引数
dev : DMAデバイス
channel : DMAチャンネル
peripheral_address :転送に関連した周辺データレジスタのベースアドレス
peripheral_size :周辺データ転送サイズ
memory_address : 転送に含まれるベースメモリアドレス
memory_size : メモリデータ転送サイズ
mode :dma_mode_flagsの論理和
副作用
与えられたDMAチャンネルを無効にします。
参照
dma_xfer_size、dma_mode_flags、dma_set_num_transfers()、dma_set_priority()、
dma_attach_interrupt()、dma_enable()
■ int dma_tube_cfg(dma_dev *dev, dma_tube tube, dma_tube_config *cfg)
DMAチューブ(チャンネル)を設定します。
この機能を使ってDMA転送を設定します。 チューブ(チャンネル)は再設定する前に無効になっています。
デフォルトでは、転送は優先順位が低くなります。
dma_set_priority()を使用して転送が始まる前に別の優先順位を選択できます。
dma_attach_interrupt()とdma_detach_interrupt()を使ってチューブの割り込みハンドラを管理することができます。
dma_tube_cfg()を呼び出して他の必要な操作を実行した後、dma_enable()を使用して転送を開始します。
引数
dev : DMAデバイス
tube : 構成するDMAチューブ(チャンネル)
cfg :チューブに適用する構成
戻り値
成功した場合はDMA_TUBE_CFG_SUCCESS(0)、失敗した場合は< 0。
失敗した場合、戻り値は次のいずれかの逆(- )になります。
- DMA_TUBE_CFG_EREQ: tubeはcfg-> tube_req_srcでは動きません
- DMA_TUBE_CFG_ENDATA: cfg->tube_[src,dst]_sizeはcfg->tube_nr_xfersと互換性がないか、cfg->tube_nr_xfersが範囲外です。
- DMA_TUBE_CFG_EDEV: devはcfgをサポートしません
- DMA_TUBE_CFG_ESRC: 不当なcfg->tube_src
- DMA_TUBE_CFG_EDST: 不当なcfg->tube_dst
- DMA_TUBE_CFG_EDIR: devはcfg->tube_srcからcfg->tube_dstに転送できません
- DMA_TUBE_CFG_ESIZE: MSIZE / PSIZEが原因で何かがおかしくなった
- DMA_TUBE_CFG_ECFG: 一般的な "何かが間違っている"
副作用
チューブ(チャンネル)を無効にします。 エラーが発生した場合でもチューブのレジスタを変更する可能性があります。
参照
struct dma_tube_config、dma_attach_interrupt()、dma_detach_interrupt()、dma_enable()
その他のチューブ構成機能
dma_tube_cfg()で十分でない場合、または既存のチューブ設定の一部を調整するために以降の関数が使用できます。
■ void dma_set_num_transfers(dma_dev * dev, dma_tube tube, uint16 num_transfers)
DMAチューブ上のデータ転送数を設定します。
チューブ(チャンネル)が有効になっている間は、この関数を呼び出すことはできません。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
num_transfers : 設定するDMAトランザクションの数
■ void dma_set_priority(dma_dev * dev, dma_tube tube, dma_priority priority)
DMA転送の優先順位を設定します。
チューブ(チャンネル)が有効になっている間は、この関数を呼び出すことはできません。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
priority : 設定するDMAトランザクションの数
■ void dma_attach_interrupt(dma_dev *dev, dma_tube tube, void (*handler)(void));
DMA転送に割り込みを付けます。
割り込みはdma_tube_cfg()のシリーズ固有のモードフラグを使用して有効にされます。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
handler : チャネル割り込みが発生したときに呼び出す割り込みハンドラ
参照
dma_setup_transfer()、dma_get_irq_cause()、dma_detach_interrupt()
■ void dma_detach_interrupt(dma_dev *dev, dma_tube tube)
DMA転送割り込みハンドラを切り離します。
この関数を呼び出した後、与えられたチューブの割り込みは無効になります。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
参照
dma_setup_transfer()、dma_get_irq_cause()、dma_detach_interrupt()
■ dma_irq_cause dma_get_irq_cause(dma_dev *dev, dma_tube tube)
DMA割り込みが呼び出された理由を見つけます。
与えられたチャンネルのアタッチされた割り込みハンドラ内でのみこの関数を呼び出せます。
この機能は割り込みの原因をエンコードする内部DMAレジスタの状態をリセットします。
したがって、割り込みハンドラの呼び出しごとに一度だけ呼び出すことができます。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
戻り値
割り込みが発生した理由(dma_irq_cause列挙型)
副作用
devの割り込みステータスレジスタ内のフラグをクリアします。
参照
dma_attach_interrupt()、dma_irq_cause
■ uint8 dma_get_isr_bits(dma_dev *dev, dma_tube tube)
DMAチャネルのISRステータスビットを取得します。
ビットは、対応するISRレジスタに現れる順番で右寄せで返されます。
DMA割り込みが発生した理由を突き止めようとしているのなら、もっと便利なdma_get_irq_cause()を参照してください。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
戻り値
DMAチャネルのISRステータスビット
参照
dma_get_irq_cause()
■ void dma_clear_isr_bits(dma_dev *dev, dma_tube tube)
特定のDMAチューブのISRステータスビットをクリアします。
DMA割り込みで自分の後を片付けようとしているのなら、dma_get_irq_cause()がより便利かもしれません。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
参照
dma_get_irq_cause()
■ void dma_enable(dma_dev *dev, dma_tube tube)
DMAチューブを有効にします。
チューブが正しく設定されている場合は、この関数を呼び出すと、DMA要求の処理を開始できます。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
■ void dma_disable(dma_dev *dev, dma_tube tube)
DMAチャンネルを無効にします。
この関数を呼び出すと、チューブはDMA要求の処理を停止します。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
■ uint8 dma_is_enabled(dma_dev *dev, dma_tube tube)
DMAチューブが有効になっているか確認します。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
戻り値
チューブが無効の場合は0、有効の場合は> 0を返します
■ uint8 dma_is_channel_enabled(dma_dev * dev, dma_channel channel)
DMAチャネルが有効になっているか確認します。
STM32F1では、dma_is_channel_enabled()はdma_is_enabled()のエイリアスです。
これは後方互換性のためです。
dma_is_channel_enabled()は次のように定義されています。
#define dma_is_channel_enabled dma_is_enabled
引数
dev : DMAデバイス
channel : DMAチューブ(チャンネル)
戻り値
チャンネルが無効の場合は0、有効の場合は> 0を返します
■ dma_tube_reg_map* dma_tube_regs(dma_dev *dev, dma_tube tube)
個々のDMAチューブのレジスタへのポインタを取得します。
引数
dev : DMAデバイス
tube : DMAチューブ(チャンネル)
戻り値
(シリーズ固有)チューブレジスタマップ
例
STM32F1では、dma_channel_regs(DMA1、DMA_CH1)->CCRはDMA1_BASE-> CCR1です。
■ dma_channel_reg_map * dma_channel_regs(dma_dev * dev, dma_channel channel)
個々のDMAチャンネルのレジスタへのポインタを取得します。
STM32F1では、dma_channel_regs()はdma_tube_regs()の別名で、これは下位互換性のためです。
dma_channel_regs()は次のように定義されています。
#define dma_channel_regs(dev, ch) dma_tube_regs(dev, ch)
引数
dev : DMAデバイス
channel : DMAチューブ(チャンネル)
戻り値
(シリーズ固有)チューブレジスタマップ
例
STM32F1では、dma_channel_regs(DMA1, DMA_CH1)->CCR is DMA1_BASE->CCR1です。
■ void dma_set_mem_addr(dma_dev *dev, dma_tube tube, __IO void *address)
データを読み書きするベースメモリアドレスを設定します。
チューブが有効になっている間はこの関数を呼び出さないでください。
DMAメモリサイズが16ビットの場合、アドレスは自動的にハーフワードにアラインされます。 DMAメモリサイズが32ビットの場合、アドレスはワードに揃えられます。
引数
dev : DMAデバイス
tube :ベースメモリアドレスを設定するDMAチューブ
address :使用するメモリベースアドレス
■ void dma_set_per_addr(dma_dev *dev, dma_tube tube, __IO void *address)
データを読み書きするベースペリフェラルアドレスを設定します。
チャンネルが有効になっている間は、この関数を呼び出さないでください。
DMAペリフェラルサイズが16ビットの場合、アドレスは自動的にハーフワードにアラインされます。 DMAペリフェラルサイズが32ビットの場合、アドレスはワードに揃えられます。
引数
dev : DMAデバイス
tube :ぺリフェラルデータレジスタのベースアドレスを設定するチューブ
address :使用するペリフェラルメモリのベースアドレス
レジスタマップベースポインタ
DMA1_BASE ((struct dma_reg_map*)0x40020000) DMAコントローラ1 レジスタマップベースポインタ
DMA2_BASE ((struct dma_reg_map*)0x40020400) DMAコントローラ2 レジスタマップベースポインタ
DMA1CH1_BASE ((struct dma_tube_reg_map*)0x40020008) DMA1チャネル1レジスタマップベースポインタ
DMA1CH2_BASE ((struct dma_tube_reg_map*)0x4002001C) DMA1チャネル2レジスタマップベースポインタ
DMA1CH3_BASE ((struct dma_tube_reg_map*)0x40020030) DMA1チャネル3レジスタマップベースポインタ
DMA1CH4_BASE ((struct dma_tube_reg_map*)0x40020044) DMA1チャネル4レジスタマップベースポインタ
DMA1CH5_BASE ((struct dma_tube_reg_map*)0x40020058) DMA1チャネル5レジスタマップベースポインタ
DMA1CH6_BASE ((struct dma_tube_reg_map*)0x4002006C) DMA1チャネル6レジスタマップベースポインタ
DMA1CH7_BASE ((struct dma_tube_reg_map*)0x40020080) DMA1チャネル7レジスタマップベースポインタ
DMA2CH1_BASE ((struct dma_tube_reg_map*)0x40020408) DMA2チャネル1レジスタマップベースポインタ
DMA2CH2_BASE ((struct dma_tube_reg_map*)0x4002041C) DMA2チャネル2レジスタマップベースポインタ
DMA2CH3_BASE ((struct dma_tube_reg_map*)0x40020430) DMA2チャネル3レジスタマップベースポインタ
DMA2CH4_BASE ((struct dma_tube_reg_map*)0x40020444) DMA2チャネル4レジスタマップベースポインタ
DMA2CH5_BASE ((struct dma_tube_reg_map*)0x40020458) DMA2チャネル5レジスタマップベースポインタ
レジスタのビット定義
DMA 割り込みステータスレジスタ(DMA_ISR)
共通ビットの定義
DMA_ISR_TEIF_BIT 3 TEIFx:チャネル x 転送エラーフラグ(x = 1 ..7)
DMA_ISR_HTIF_BIT 2 HTIFx:チャネル x 1/2 転送終了フラグ(x = 1 ..7)
DMA_ISR_TCIF_BIT 1 TCIFx:チャネル x 転送完了フラグ(x = 1 ..7)
DMA_ISR_GIF_BIT 0 GIFx:チャネル x グローバル割り込みフラグ(x = 1 ..7)
共通ビットのマスクの定義
DMA_ISR_TEIF (1 << DMA_ISR_TEIF_BIT) TEIFx:チャネル x 転送エラーフラグ・ビットマスク
DMA_ISR_HTIF (1 << DMA_ISR_HTIF_BIT) HTIFx:チャネル x 1/2 転送終了フラグ・ビットマスク
DMA_ISR_TCIF (1 << DMA_ISR_TCIF_BIT) TCIFx:チャネル x 転送完了フラグ・ビットマスク
DMA_ISR_GIF (1 << DMA_ISR_GIF_BIT) GIFx:チャネル x グローバル割り込みフラグ・ビットマスク
ビットの定義
DMA_ISR_TEIF7_BIT 27 TEIF7:チャネル7 転送エラーフラグ
DMA_ISR_HTIF7_BIT 26 HTIF7:チャネル7 1/2 転送終了フラグ
DMA_ISR_TCIF7_BIT 25 TCIF7:チャネル7 転送完了フラグ
DMA_ISR_GIF7_BIT 24 GIF7:チャネル7 グローバル割り込みフラグ
DMA_ISR_TEIF6_BIT 23 TEIF6:チャネル6 転送エラーフラグ
DMA_ISR_HTIF6_BIT 22 HTIF6:チャネル6 1/2 転送終了フラグ
DMA_ISR_TCIF6_BIT 21 TCIF6:チャネル6 転送完了フラグ
DMA_ISR_GIF6_BIT 20 GIF6:チャネル6 グローバル割り込みフラグ
DMA_ISR_TEIF5_BIT 19 TEIF5:チャネル5 転送エラーフラグ
DMA_ISR_HTIF5_BIT 18 HTIF5:チャネル5 1/2 転送終了フラグ
DMA_ISR_TCIF5_BIT 17 TCIF5:チャネル5 転送完了フラグ
DMA_ISR_GIF5_BIT 16 GIF5:チャネル5 グローバル割り込みフラグ
DMA_ISR_TEIF4_BIT 15 TEIF4:チャネル4 転送エラーフラグ
DMA_ISR_HTIF4_BIT 14 HTIF4:チャネル4 1/2 転送終了フラグ
DMA_ISR_TCIF4_BIT 13 TCIF4:チャネル4 転送完了フラグ
DMA_ISR_GIF4_BIT 12 GIF4:チャネル4 グローバル割り込みフラグ
DMA_ISR_TEIF3_BIT 11 TEIF3:チャネル3 転送エラーフラグ
DMA_ISR_HTIF3_BIT 10 HTIF3:チャネル3 1/2 転送終了フラグ
DMA_ISR_TCIF3_BIT 9 TCIF3:チャネル3 転送完了フラグ
DMA_ISR_GIF3_BIT 8 GIF3:チャネル3 グローバル割り込みフラグ
DMA_ISR_TEIF2_BIT 7 TEIF2:チャネル2 転送エラーフラグ
DMA_ISR_HTIF2_BIT 6 HTIF2:チャネル2 1/2 転送終了フラグ
DMA_ISR_TCIF2_BIT 5 TCIF2:チャネル2 転送完了フラグ
DMA_ISR_GIF2_BIT 4 GIF2:チャネル2 グローバル割り込みフラグ
DMA_ISR_TEIF1_BIT 3 TEIF1:チャネル1 転送エラーフラグ
DMA_ISR_HTIF1_BIT 2 HTIF1:チャネル1 1/2 転送終了フラグ
DMA_ISR_TCIF1_BIT 1 TCIF1:チャネル1 転送完了フラグ
DMA_ISR_GIF1_BIT 0 GIF1:チャネル1 グローバル割り込みフラグ
ビットのマスクの定義
DMA_ISR_TEIF7 (1U << DMA_ISR_TEIF7_BIT) TEIF7:チャネル7 転送エラーフラグ・マスク
DMA_ISR_HTIF7 (1U << DMA_ISR_HTIF7_BIT) HTIF7:チャネル7 1/2 転送終了フラグ・マスク
DMA_ISR_TCIF7 (1U << DMA_ISR_TCIF7_BIT) TCIF7:チャネル7 転送完了フラグ・マスク
DMA_ISR_GIF7 (1U << DMA_ISR_GIF7_BIT) GIF7:チャネル7 グローバル割り込みフラグ・マスク
DMA_ISR_TEIF6 (1U << DMA_ISR_TEIF6_BIT) TEIF6:チャネル6 転送エラーフラグ・マスク
DMA_ISR_HTIF6 (1U << DMA_ISR_HTIF6_BIT) HTIF6:チャネル6 1/2 転送終了フラグ・マスク
DMA_ISR_TCIF6 (1U << DMA_ISR_TCIF6_BIT) TCIF6:チャネル6 転送完了フラグ・マスク
DMA_ISR_GIF6 (1U << DMA_ISR_GIF6_BIT) GIF6:チャネル6 グローバル割り込みフラグ・マスク
DMA_ISR_TEIF5 (1U << DMA_ISR_TEIF5_BIT) TEIF5:チャネル5 転送エラーフラグ・マスク
DMA_ISR_HTIF5 (1U << DMA_ISR_HTIF5_BIT) HTIF5:チャネル5 1/2 転送終了フラグ・マスク
DMA_ISR_TCIF5 (1U << DMA_ISR_TCIF5_BIT) TCIF5:チャネル4 転送完了フラグ・マスク
DMA_ISR_GIF5 (1U << DMA_ISR_GIF5_BIT) GIF5:チャネル4 グローバル割り込みフラグ・マスク
DMA_ISR_TEIF4 (1U << DMA_ISR_TEIF4_BIT) TEIF4:チャネル4 転送エラーフラグ・マスク
DMA_ISR_HTIF4 (1U << DMA_ISR_HTIF4_BIT) HTIF4:チャネル4 1/2 転送終了フラグ・マスク
DMA_ISR_TCIF4 (1U << DMA_ISR_TCIF4_BIT) TCIF4:チャネル4 転送完了フラグ・マスク
DMA_ISR_GIF4 (1U << DMA_ISR_GIF4_BIT) GIF4:チャネル4 グローバル割り込みフラグ・マスク
DMA_ISR_TEIF3 (1U << DMA_ISR_TEIF3_BIT) TEIF3:チャネル3 転送エラーフラグ・マスク
DMA_ISR_HTIF3 (1U << DMA_ISR_HTIF3_BIT) HTIF3:チャネル3 1/2 転送終了フラグ・マスク
DMA_ISR_TCIF3 (1U << DMA_ISR_TCIF3_BIT) TCIF3:チャネル3 転送完了フラグ・マスク
DMA_ISR_GIF3 (1U << DMA_ISR_GIF3_BIT) GIF3:チャネル3 グローバル割り込みフラグ・マスク
DMA_ISR_TEIF2 (1U << DMA_ISR_TEIF2_BIT) TEIF2:チャネル2 転送エラーフラグ・マスク
DMA_ISR_HTIF2 (1U << DMA_ISR_HTIF2_BIT) HTIF2:チャネル2 1/2 転送終了フラグ・マスク
DMA_ISR_TCIF2 (1U << DMA_ISR_TCIF2_BIT) TCIF2:チャネル2 転送完了フラグ・マスク
DMA_ISR_GIF2 (1U << DMA_ISR_GIF2_BIT) GIF2:チャネル2 グローバル割り込みフラグ・マスク
DMA_ISR_TEIF1 (1U << DMA_ISR_TEIF1_BIT) TEIF1:チャネル1 転送エラーフラグ・マスク
DMA_ISR_HTIF1 (1U << DMA_ISR_HTIF1_BIT) HTIF1:チャネル1 1/2 転送終了フラグ・マスク
DMA_ISR_TCIF1 (1U << DMA_ISR_TCIF1_BIT) TCIF1:チャネル1 転送完了フラグ・マスク
DMA_ISR_GIF1 (1U << DMA_ISR_GIF1_BIT) GIF1:チャネル1 グローバル割り込みフラグ・マスク
DMA 割込みフラグ・クリア・レジスタ(DMA_IFCR)
ビットの定義
DMA_IFCR_CTEIF7_BIT 27 CTEIF7: チャネル7 転送エラークリア
DMA_IFCR_CHTIF7_BIT 26 CHTIF7:チャネル7 1/2 転送終了クリア
DMA_IFCR_CTCIF7_BIT 25 CTCIF7: チャネル7 転送完了クリア
DMA_IFCR_CGIF7_BIT 24 CGIF7: チャネル7 割込みリクエストクリア
DMA_IFCR_CTEIF6_BIT 23 CTEIF6: チャネル6 転送エラークリア
DMA_IFCR_CHTIF6_BIT 22 CHTIF6:チャネル6 1/2 転送終了クリア
DMA_IFCR_CTCIF6_BIT 21 CTCIF6: チャネル6 転送完了クリア
DMA_IFCR_CGIF6_BIT 20 CGIF6: チャネル6 割込みリクエストクリア
DMA_IFCR_CTEIF5_BIT 19 CTEIF5: チャネル5 転送エラークリア
DMA_IFCR_CHTIF5_BIT 18 CHTIF5:チャネル5 1/2 転送終了クリア
DMA_IFCR_CTCIF5_BIT 17 CTCIF5: チャネル5 転送完了クリア
DMA_IFCR_CGIF5_BIT 16 CGIF5: チャネル5 割込みリクエストクリア
DMA_IFCR_CTEIF4_BIT 15 CTEIF4: チャネル4 転送エラークリア
DMA_IFCR_CHTIF4_BIT 14 CHTIF4:チャネル4 1/2 転送終了クリア
DMA_IFCR_CTCIF4_BIT 13 CTCIF4: チャネル4 転送完了クリア
DMA_IFCR_CGIF4_BIT 12 CGIF4: チャネル4 割込みリクエストクリア
DMA_IFCR_CTEIF3_BIT 11 CTEIF3: チャネル3 転送エラークリア
DMA_IFCR_CHTIF3_BIT 10 CHTIF3:チャネル3 1/2 転送終了クリア
DMA_IFCR_CTCIF3_BIT 9 CTCIF3: チャネル3 転送完了クリア
DMA_IFCR_CGIF3_BIT 8 CGIF3: チャネル3 割込みリクエストクリア
DMA_IFCR_CTEIF2_BIT 7 CTEIF2: チャネル2 転送エラークリア
DMA_IFCR_CHTIF2_BIT 6 CHTIF2: チャネル2 1/2 転送終了クリア
DMA_IFCR_CTCIF2_BIT 5 CTCIF2: チャネル2 転送完了クリア
DMA_IFCR_CGIF2_BIT 4 CGIF2: チャネル2 割込みリクエストクリア
DMA_IFCR_CTEIF1_BIT 3 CTEIF1: チャネル1 転送エラークリア
DMA_IFCR_CHTIF1_BIT 2 CHTIF1: チャネル1 1/2 転送終了クリア
DMA_IFCR_CTCIF1_BIT 1 CTCIF1: チャネル1 転送完了クリア
DMA_IFCR_CGIF1_BIT 0 CGIF1: チャネル1 割込みリクエストクリア
ビットのマスクの定義
DMA_IFCR_CTEIF7 (1U << DMA_IFCR_CTEIF7_BIT) CTEIF7: チャネル7 転送エラークリア・マスク
DMA_IFCR_CHTIF7 (1U << DMA_IFCR_CHTIF7_BIT) CHTIF7:チャネル7 1/2 転送終了クリア・マスク
DMA_IFCR_CTCIF7 (1U << DMA_IFCR_CTCIF7_BIT) CTCIF7: チャネル7 転送完了クリア・マスク
DMA_IFCR_CGIF7 (1U << DMA_IFCR_CGIF7_BIT) CGIF7: チャネル7 割込みリクエストクリア・マスク
DMA_IFCR_CTEIF6 (1U << DMA_IFCR_CTEIF6_BIT) CTEIF6: チャネル6 転送エラークリア・マスク
DMA_IFCR_CHTIF6 (1U << DMA_IFCR_CHTIF6_BIT) CHTIF6:チャネル6 1/2 転送終了クリア・マスク
DMA_IFCR_CTCIF6 (1U << DMA_IFCR_CTCIF6_BIT) CTCIF6: チャネル6 転送完了クリア・マスク
DMA_IFCR_CGIF6 (1U << DMA_IFCR_CGIF6_BIT) CGIF6: チャネル6 割込みリクエストクリア・マスク
DMA_IFCR_CTEIF5 (1U << DMA_IFCR_CTEIF5_BIT) CTEIF5: チャネル5 転送エラークリア・マスク
DMA_IFCR_CHTIF5 (1U << DMA_IFCR_CHTIF5_BIT) CHTIF5:チャネル5 1/2 転送終了クリア・マスク
DMA_IFCR_CTCIF5 (1U << DMA_IFCR_CTCIF5_BIT) CTCIF5: チャネル5 転送完了クリア・マスク
DMA_IFCR_CGIF5 (1U << DMA_IFCR_CGIF5_BIT) CGIF5: チャネル5 割込みリクエストクリア・マスク
DMA_IFCR_CTEIF4 (1U << DMA_IFCR_CTEIF4_BIT) CTEIF4: チャネル4 転送エラークリア・マスク
DMA_IFCR_CHTIF4 (1U << DMA_IFCR_CHTIF4_BIT) CHTIF4:チャネル4 1/2 転送終了クリア・マスク
DMA_IFCR_CTCIF4 (1U << DMA_IFCR_CTCIF4_BIT) CTCIF4: チャネル4 転送完了クリア・マスク
DMA_IFCR_CGIF4 (1U << DMA_IFCR_CGIF4_BIT) CGIF4: チャネル4 割込みリクエストクリア・マスク
DMA_IFCR_CTEIF3 (1U << DMA_IFCR_CTEIF3_BIT) CTEIF3: チャネル3 転送エラークリア・マスク
DMA_IFCR_CHTIF3 (1U << DMA_IFCR_CHTIF3_BIT) CHTIF3:チャネル3 1/2 転送終了クリア・マスク
DMA_IFCR_CTCIF3 (1U << DMA_IFCR_CTCIF3_BIT) CTCIF3: チャネル3 転送完了クリア・マスク
DMA_IFCR_CGIF3 (1U << DMA_IFCR_CGIF3_BIT) CGIF3: チャネル3 割込みリクエストクリア・マスク
DMA_IFCR_CTEIF2 (1U << DMA_IFCR_CTEIF2_BIT) CTEIF2: チャネル2 転送エラークリア・マスク
DMA_IFCR_CHTIF2 (1U << DMA_IFCR_CHTIF2_BIT) CHTIF2:チャネル2 1/2 転送終了クリア・マスク
DMA_IFCR_CTCIF2 (1U << DMA_IFCR_CTCIF2_BIT) CTCIF2: チャネル2 転送完了クリア・マスク
DMA_IFCR_CGIF2 (1U << DMA_IFCR_CGIF2_BIT) CGIF2: チャネル2 割込みリクエストクリア・マスク
DMA_IFCR_CTEIF1 (1U << DMA_IFCR_CTEIF1_BIT) CTEIF1: チャネル1 転送エラークリア・マスク
DMA_IFCR_CHTIF1 (1U << DMA_IFCR_CHTIF1_BIT) CHTIF1:チャネル1 1/2 転送終了クリア・マスク
DMA_IFCR_CTCIF1 (1U << DMA_IFCR_CTCIF1_BIT) CTCIF1: チャネル1 転送完了クリア・マスク
DMA_IFCR_CGIF1 (1U << DMA_IFCR_CGIF1_BIT) CGIF1: チャネル1 割込みリクエストクリア・マスク
DMA チャネル構成レジスタ (DMA_CCRx)
ビットの定義
DMA_CCR_MEM2MEM_BIT 14 MEM2MEM: メモリ間転送モード
DMA_CCR_MINC_BIT 7 MINC: メモリ・インクリメント・モード
DMA_CCR_PINC_BIT 6 PINC: ペリフェラル・インクリメント・モード
DMA_CCR_CIRC_BIT 5 CIRC: サーキュラ・モード
DMA_CCR_DIR_BIT 4 DIR: データ転送方向
DMA_CCR_TEIE_BIT 3 TEIE: 転送エラー (TE) 割込みリクエスト許可
DMA_CCR_HTIE_BIT 2 HTIE: 1/2 転送終了 (HT) 割込みリクエスト許可
DMA_CCR_TCIE_BIT 1 TCIE: 転送完了割込み (TC) リクエスト許可
DMA_CCR_EN_BIT 0 EN: チャネル・イネーブル
ビットのマスクの定義
DMA_CCR_MEM2MEM (1U << DMA_CCR_MEM2MEM_BIT) MEM2MEM: メモリ間転送モード・マスク
DMA_CCR_PL (0x3 << 12) PL[1:0]: チャネル優先レベル・マスク
DMA_CCR_PL_LOW (0x0 << 12) チャネル優先レベル:00: 低
DMA_CCR_PL_MEDIUM (0x1 << 12) チャネル優先レベル:01: 中
DMA_CCR_PL_HIGH (0x2 << 12) チャネル優先レベル:10: 高
DMA_CCR_PL_VERY_HIGH (0x3 << 12) チャネル優先レベル:11: 最優先
DMA_CCR_MSIZE (0x3 << 10) MSIZE[1:0]: メモリ・サイズ・マスク
DMA_CCR_MSIZE_8BITS (0x0 << 10) メモリ・サイズ:00: 8 ビット
’DMA_CCR_MSIZE_16BITS (0x1 << 10) メモリ・サイズ:01: 16 ビット
DMA_CCR_MSIZE_32BITS (0x2 << 10) メモリ・サイズ:10: 32 ビット
DMA_CCR_PSIZE (0x3 << 8) PSIZE[1:0]: ペリフェラル・サイズ
DMA_CCR_PSIZE_8BITS (0x0 << 8) ペリフェラル・サイズ:00: 8 ビット
DMA_CCR_PSIZE_16BITS (0x1 << 8) ペリフェラル・サイズ:01: 16 ビット
DMA_CCR_PSIZE_32BITS (0x2 << 8) ペリフェラル・サイズ:10: 32 ビット
DMA_CCR_MINC (1U << DMA_CCR_MINC_BIT) MINC: メモリ・インクリメント・モード・マスク
DMA_CCR_PINC (1U << DMA_CCR_PINC_BIT) PINC: ペリフェラル・インクリメント・モード・マスク
DMA_CCR_CIRC (1U << DMA_CCR_CIRC_BIT) CIRC: サーキュラ・モード・マスク
DMA_CCR_DIR (1U << DMA_CCR_DIR_BIT) DIR: データ転送方向・マスク
DMA_CCR_DIR_FROM_PER (0U << DMA_CCR_DIR_BIT) DIR: ペリフェラルから読出(ペリフェラル→ メモリ)
DMA_CCR_DIR_FROM_MEM (1U << DMA_CCR_DIR_BIT) DIR: メモリから読出(メモリ→ペリフェラル)
DMA_CCR_TEIE (1U << DMA_CCR_TEIE_BIT) TEIE: 転送エラー (TE) 割込みリクエスト許可・マスク
DMA_CCR_HTIE (1U << DMA_CCR_HTIE_BIT) HTIE: 1/2 転送終了 (HT) 割込みリクエスト許可・マスク
DMA_CCR_TCIE (1U << DMA_CCR_TCIE_BIT) TCIE: 転送完了割込み (TC) リクエスト許可・マスク
DMA_CCR_EN (1U << DMA_CCR_EN_BIT) EN: チャネル・イネーブル・マスク
このドキュメントはleafLabs, LLC.が執筆し、たま吉が翻訳・一部加筆修正したものです。
NAVER、ヤフオク等の営利目的の記事転用、リンク貼りは禁止です。