« PICOのPIOについて | トップページ | PICOのPIOを使った指定周期DMAによるシリアラル信号出力プログラムについて »

2022年12月28日 (水)

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に設定している。
//  なお、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_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によるシリアラル信号出力プログラムについて »

ラズパイ日記」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« PICOのPIOについて | トップページ | PICOのPIOを使った指定周期DMAによるシリアラル信号出力プログラムについて »