PICOのPWMをDMAで動作させる方法
Raspberry Pi PICOのPWMをDMAで動作させる方法について備忘録。
以下、動作検証を行ったサンプルプログラム。
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/dma.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"
int main()
{
// オンボードLEDがつながっているPINをPWMに設定する
gpio_set_function(PICO_DEFAULT_LED_PIN, GPIO_FUNC_PWM);
// このPINのSlice番号を得る
int led_pwm_slice_num = pwm_gpio_to_slice_num(PICO_DEFAULT_LED_PIN);
// PWM構成情報を作成する
pwm_config config = pwm_get_default_config();
// PWM構成情報にデータ要求周期のクロック分割を設定する。
// ここではLED点灯変化が目視できるようにクロック数を1/800に設定している。
// ここではLED点灯変化が目視できるようにクロック数を1/800に設定している。
// なお、800.fのfはfloatを表している。
pwm_config_set_clkdiv(&config, 800.f);
// このPWM構成情報でPWMを初期化する
pwm_init(led_pwm_slice_num, &config, true);
// PWM用に、空いているDMAチャンネル番号を取得する
int pwm_dma_chan = dma_claim_unused_channel(true);
// 取得したDMAチャンネルの構成情報を取得する
// DMA書き込み先(PWMレジスタ)アドレスは固定にする
dma_channel_config pwm_dma_chan_config = dma_channel_get_default_config(pwm_dma_chan);
// DMA転送単位を32ビットに設定する
channel_config_set_transfer_data_size(&pwm_dma_chan_config, DMA_SIZE_32);
// DMA読み出し元(データテーブル)アドレスを自動インクリメント設定する
channel_config_set_read_increment(&pwm_dma_chan_config, true);
// DMA書き込み先(PWMレジスタ)アドレスは固定にする
channel_config_set_write_increment(&pwm_dma_chan_config, false);
// PWM(取得したスライス番号)のデータ要求によってDMA REQが発生するよう指定する
channel_config_set_dreq(&pwm_dma_chan_config, DREQ_PWM_WRAP0 + led_pwm_slice_num);
// DMAチャンネル構成情報を設定する
dma_channel_configure(
pwm_dma_chan,
&pwm_dma_chan_config,
&pwm_hw->slice[led_pwm_slice_num].cc, // 書き込み先PWM counter compare
data_table, // 読み出し元
256, // データテーブルからの読み出しデータ数、これを読みだしたらDMA停止
true // DMA即時開始
);
while(true) {
tight_loop_contents();
}
}
上記のコードはPWMの実行周期を設定し、その周期でDMA REQを発生させることで、data_tableからPWMレジスタにデータをDMA転送させている。
なお、data_tableはuint32_t data_table[256]で、0x00000000から0xFFFFFFFFまでの値でLED輝度変化が目視できるテーブルにする。
検証にあたってはこのブログを参考にした。
« PICOのPIOについて | トップページ | PICOのPIOを使った指定周期DMAによるシリアラル信号出力プログラムについて »
「ラズパイ日記」カテゴリの記事
- NEO-7M GPSモジュールが中国から届いた(2023.01.15)
- TNCアプリにおけるDemoduatorの動作確認(2023.01.09)
- AFSKでの復調について(2023.01.04)
- APRSでのNRZIについて備忘録(2023.01.02)
- pico_tnc 2200Hz(Space)でPhaseをずらす件の備忘録(2022.12.31)
« PICOのPIOについて | トップページ | PICOのPIOを使った指定周期DMAによるシリアラル信号出力プログラムについて »
コメント