【raspberry pi pico】C/C++でDMA転送を使うときに最低限必要な記述

raspberry pi pico

ソースに最低限必要な記述

#include "pico/stdlib.h"
#include "hardware/dma.h"
#include "hardware/spi.h"

#define LCD_SPI spi1

// ピンの設定(自分の環境に合わせて適宜変更してください)
#define PIN_SCK  10   // 使用するピン番号に合わせて変更
#define PIN_MOSI 11

int main() {
    // SPIの初期化(一部の設定は省略しています)
    spi_init(LCD_SPI, 1 * 1000 * 1000); // 例:1MHz
    gpio_set_function(PIN_SCK,  GPIO_FUNC_SPI);
    gpio_set_function(PIN_MOSI, GPIO_FUNC_SPI);

    uint8_t data[] = {0xAA, 0xBB, 0xCC};  // 転送元バッファ
    int dma_ch = dma_claim_unused_channel(true);  // 1:DMAチャンネルを取得

    dma_channel_config cfg = dma_channel_get_default_config(dma_ch); // 2:設定用構造体を取得
    channel_config_set_transfer_data_size(&cfg, DMA_SIZE_8);         // 3:データサイズを8bitに設定
    channel_config_set_read_increment(&cfg, true);                   // 4:読み元(data[])はポインタ加算
    channel_config_set_write_increment(&cfg, false);                 // 5:書き先(SPI)は固定

    dma_channel_configure(
        dma_ch,                       // DMAチャンネル番号
        &cfg,                         // 設定
        &spi_get_hw(LCD_SPI)->dr,     // 6:書き込み先:SPIの送信レジスタ
        data,                         // 7:読み込み元データ
        sizeof(data),                 // 転送バイト数
        true                          // 即時スタート
    );

    dma_channel_wait_for_finish_blocking(dma_ch); // 8:転送完了までブロック
    dma_channel_unclaim(dma_ch);                  // 9:チャンネル解放
    // 
}
番号項目説明
DMAチャンネル取得dma_claim_unused_channel(true):未使用チャンネルを自動取得
構成取得dma_channel_get_default_config():初期設定を取得
転送単位の設定8bit, 16bit, 32bitとかを設定
読み元のポインタ加算trueでdata[]を1byteずつ読む
書き先のポインタ固定falseでSPI送信レジスタに繰り返し書く
書き先アドレスspi_get_hw(spi1)->dr:SPI送信レジスタ
読み元アドレス転送したい配列
転送完了まで待機完了前に次の処理を始めないための待機処理
チャンネル解放他の用途に使うために解放

CMakeLists.txt に最低限必要な記述

target_link_libraries(プロジェクト名
  pico_stdlib
  hardware_dma
  hardware_spi
)

コメント

タイトルとURLをコピーしました