#include <hardware/pio.h>
#include <hardware/dma.h>
#include "pio.h"
#define PIO_ID pio0
#define PIO_TX_SM 0
// DMA
#define DMA_DATA_COUNT 4
int dma_chan; // DMAチャンネル
uint8_t send_data[8] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
void dma_handler() {
dma_channel_set_read_addr(dma_chan, send_data, true); // send_dataの転送を即時実行
dma_hw->ints0 = 1u << dma_chan; // 割り込み要求をクリアします
}
void setup() {
pinMode(25, OUTPUT);
Serial1.begin(115200);
Serial1.println("Open");
// PIOにプログラム転送
pio_add_program(PIO_ID, &uart_tx_program);
// PIO初期化
uart_tx_init(
PIO_ID,
PIO_TX_SM, // ステートマシン(0~3)
2 // GPIO2
);
// DMA設定
dma_chan = dma_claim_unused_channel(true); // 未使用のDMAチャンネルを取得
dma_channel_config c = dma_channel_get_default_config(dma_chan);
channel_config_set_transfer_data_size(&c, DMA_SIZE_8); // 8bit単位で転送
channel_config_set_read_increment(&c, true); // データ元の自動インクリメントを有効
channel_config_set_dreq(&c, DREQ_PIO0_TX0); // TX FIFOが空になったらDMA実行
dma_channel_configure(
dma_chan,
&c,
&pio0_hw->txf[PIO_TX_SM], // PIOのTX FIFO
send_data, // 送信元データ
DMA_DATA_COUNT, // このカウント分転送すると割り込みを発生させる
false // まだ開始しない
);
dma_channel_set_irq0_enabled(dma_chan, true); // IRQ0の割り込みを有効化
irq_set_exclusive_handler(DMA_IRQ_0, dma_handler); // IRQハンドラーとしてdma_handlerを設定
irq_set_enabled(DMA_IRQ_0, true);
dma_handler(); // 初回のDMA実行
}
char input_char;
void loop() {
// シリアル受信していたら表示
if(Serial1.available() > 0){
input_char = Serial1.read();
Serial1.println(input_char);
}
// 動作確認のLED点滅
digitalWrite(25, HIGH);
delay(500);
digitalWrite(25, LOW);
delay(500);
}