Raspberry Pi Pico C/C++ SDKのPWM用関数のまとめ 

#概要
Raspberry Pi Pico C/C++ SDKのPWM用関数のメモ
公式ドキュメント[Raspberry Pi Pico C/C++ SDK](https://datasheets.raspberrypi.org/pico/raspberry-pi-pico-c-sdk.pdf)の「4.1.17. hardware_pwm」をほとんど訳しただけです。

#レジスタ

```c
//レジスタ構造体
typedef struct {
    pwm_slice_hw_t slice[NUM_PWM_SLICES]; //スライス設定
    io_rw_32 en; //有効/無効
    io_rw_32 intr; //割り込み要求
    io_rw_32 inte; //割り込み許可
    io_rw_32 intf; //強制割り込み
    io_rw_32 ints; //割り込みステータス
} pwm_hw_t;

//スライス設定
typedef struct pwm_slice_hw {
    io_rw_32 csr; //コントロール&ステータスレジスタ
        //bit7 :1カウント進み
        //bit6 :1カウント遅れ
        //bit5 :カウントモード
        //bit4 :カウントモード
        //bit3 :ChB極性
        //bit2 :ChA極性
        //bit1 :位相補正
        //bit0 :有効/無効
    io_rw_32 div; //分周比
        //bit11-4:整数部(単位は1)
        //bit3-0 :小数部(単位は1/16)
    io_rw_32 ctr; //PWMタイマカウント値
    io_rw_32 cc;  //PWMレベル値(デューティ)
        //bit31-16:ChB
        //bit15-0 :ChA
    io_rw_32 top; //PWMラップ値(周期)(ChA,B共通)
} pwm_slice_hw_t;
```

#関数

##static uint pwm_gpio_to_slice_num (uint gpio)
```
引数：uint gpio gpio番号(0-29)
戻り値：引数のgpio番号に対応するスライス番号(0-7)
　　　　( gpio >> 1 ) & 0x07
機能：指定されたgpio番号のスライス番号を取得
```

##static uint pwm_gpio_to_channel (uint gpio)
```
引数：uint gpio gpio番号
戻り値：引数のgpio番号に対応するチャンネル番号(0:A,1:B)
　　　　gpio & 0x01
機能：指定されたgpio番号のスライス番号を取得
```

##static void pwm_config_set_phase_correct (pwm_config *c, bool phase_correct)
```
引数：pwm_config *c PWMコンフィグレーション構造体
     bool phase_correct 位相補正有無(0:無,1:有)
戻り値：なし
機能：PWMコンフィグレーション構造体に位相補正有無設定を書き込む
     ※位相補正：PWMタイマが1周期カウントした際に0に戻らずにカウントダウンすること。(周期が2倍になる)
```

##static void pwm_config_set_clkdiv (pwm_config *c, float div)
```
引数：pwm_config *c PWMコンフィグレーション構造体
     float div クロック分周(>=1)
戻り値：なし
機能：PWMコンフィグレーション構造体にクロック分周設定を書き込む
     ※フリーランニングモードでは周波数は clk_sys / div
       それ以外の場合ChBの入力で決まる?(よくわからない）
```

##static void pwm_config_set_clkdiv_int (pwm_config *c, uint div)
```
   pwm_config_set_clkdivの整数型版
```

##static void pwm_config_set_clkdiv_mode (pwm_config *c, enum pwm_clkdiv_mode mode)
```
引数：pwm_config *c PWMコンフィグレーション構造体
     enum pwm_clkdiv_mode mode カウントモード
                            0:フリーランニング
                            1:ChBの立ち上がり
                            2:ChBのHigh
                            3:ChBの立下り
戻り値：なし
機能：PWMコンフィグレーション構造体にカウントモード設定を書き込む
```

##static void pwm_config_set_output_polarity (pwm_config *c, bool a, bool b)
```
引数：pwm_config *c PWMコンフィグレーション構造体
     bool a ChAの極性(False:通常,True:反転)
     bool a ChBの極性(False:通常,True:反転)
戻り値：なし
機能：PWMコンフィグレーション構造体に極性設定を書き込む
```

##static void pwm_config_set_wrap (pwm_config *c, uint16_t wrap)
```
引数：pwm_config *c PWMコンフィグレーション構造体
     uint16_t wrap ラップ値(一周期分のカウント値)
戻り値：なし
機能：PWMコンフィグレーション構造体にラップ値(一周期分のカウント値)設定を書き込む
```

##static void pwm_init (uint slice_num, pwm_config *c, bool start)
```
引数：uint slice_num スライス番号(0-7)
     pwm_config *c PWMコンフィグレーション構造体
     bool start PWMスタートフラグ(False:スタートしない,True:スタート)
戻り値：なし
機能：PWMコンフィグレーション構造体の情報を反映しPWMスタートする
```

##static pwm_config pwm_get_default_config (void)
```
引数：なし
戻り値：pwm_config PWMコンフィグレーション構造体
機能：PWMコンフィグレーション構造体のデフォルト値を取得する
    位相補正：なし
    分周：1分周
    カウントモード：フリーランニング
    極性：通常
    ラップ値(一周期分のカウント値)：0xFFFF
```
##static void pwm_set_wrap (uint slice_num, uint16_t wrap)
```
引数：uint slice_num スライス番号(0-7)
     uint16_t wrap ラップ値(一周期分のカウント値)
戻り値：なし
機能：ラップ値(一周期分のカウント値)を設定する
     ※ダブルバッファのためカウント中に変更した場合、
　　　 ラップ(位相補正の場合はカウント0)後に反映される
```

##static void pwm_set_chan_level (uint slice_num, uint chan, uint16_t level)
```
引数：uint slice_num スライス番号(0-7)
     uint chan チャンネル番号(0:A,1:B)
     uint16_t level レベル値(デューティカウント値)
戻り値：なし
機能：レベル値(デューティカウント値)を設定する
     ※ダブルバッファのためカウント中に変更した場合、
　　　 ラップ(位相補正の場合はカウント0)後に反映される
```
##static void pwm_set_both_levels (uint slice_num, uint16_t level_a, uint16_t level_b)
```
    pwm_set_chan_levelのChA,ChB同時設定版
```

##static void pwm_set_gpio_level (uint gpio, uint16_t level)
```
    pwm_set_chan_levelのスライス番号,Ch番号ではなくgpio番号で設定する版
```

##static uint16_t pwm_get_counter (uint slice_num)
```
引数：uint slice_num スライス番号(0-7)
戻り値：なし
機能：PWMタイマのカウント値を取得する
```

##static void pwm_set_counter (uint slice_num, uint16_t c)
```
引数：uint slice_num スライス番号(0-7)
     uint16_t c カウント値
戻り値：なし
機能：PWMタイマへカウント値セットする
```

##static void pwm_advance_count (uint slice_num)
```
引数：uint slice_num スライス番号(0-7)
戻り値：なし
機能：PWMタイマカウント値を1カウントインクリメントさせる
　　　※完了するまで無限ループ
```

##static void pwm_retard_count (uint slice_num)
```
引数：uint slice_num スライス番号(0-7)
戻り値：なし
機能：PWMタイマカウント値を1カウント遅らせる
　　　※完了するまで無限ループ
```

##static void pwm_set_clkdiv_int_frac (uint slice_num, uint8_t integer, uint8_t fract)
```
引数：uint slice_num スライス番号(0-7)
    uint8_t integer クロック分周整数部
    uint8_t fract クロック分周小数部
戻り値：なし
機能：クロック分周を8bitの整数部,4bitの小数部で設定
```

##static void pwm_set_clkdiv (uint slice_num, float divider)
```
    pwm_set_clkdiv_int_fracのfloat版
```

##static void pwm_set_output_polarity (uint slice_num, bool a, bool b)
```
引数：uint slice_num スライス番号(0-7)
     bool a ChAの極性(False:通常,True:反転)
     bool a ChBの極性(False:通常,True:反転)
戻り値：なし
機能：極性を設定する
```

##static void pwm_set_clkdiv_mode (uint slice_num, enum pwm_clkdiv_mode mode)
```
引数：uint slice_num スライス番号(0-7)
     enum pwm_clkdiv_mode mode カウントモード
                            0:フリーランニング
                            1:ChBの立ち上がり
                            2:ChBのHigh
                            3:ChBの立下り
戻り値：なし
機能：カウントモード設定をする
```

##static void pwm_set_phase_correct (uint slice_num, bool phase_correct)
```
引数：uint slice_num スライス番号(0-7)
     bool phase_correct 位相補正有無(0:無,1:有)
戻り値：なし
機能：位相補正有無設定をする
     ※位相補正：PWMタイマが1周期カウントした際に0に戻らずにカウントダウンすること。(周期が2倍になる)
```

##static void pwm_set_enabled (uint slice_num, bool enabled)
```
引数：uint slice_num スライス番号(0-7)
     bool enabled PWM有効/無効(0:無効,1:有効)
戻り値：なし
機能：PWM有効/無効を設定する
```
##static void pwm_set_mask_enabled (uint32_t mask)
```
引数：uint slice_num スライス番号(0-7)
     uint32_t mask PWM有効/無効マスク(0:無効,1:有効)
                   ※bit番号とスライス番号が対応している
戻り値：なし
機能：PWM有効/無効を全スライス同時設定する
```

##static void pwm_set_irq_enabled (uint slice_num, bool enabled)
```
引数：uint slice_num スライス番号(0-7)
     bool enabled PWM割り込み有効/無効(0:無効,1:有効)
戻り値：なし
機能：PWM割り込み有効/無効を設定する
```

##static void pwm_set_irq_mask_enabled (uint32_t slice_mask, bool enabled)
```
引数：uint slice_num スライス番号(0-7)
     uint32_t mask PWM割り込み有効/無効マスク(0:無効,1:有効)
                   ※bit番号とスライス番号が対応している
戻り値：なし
機能：PWM割り込み有効/無効を全スライス同時設定する
```

##static void pwm_clear_irq (uint slice_num)
```
引数：uint slice_num スライス番号(0-7)
戻り値：なし
機能：PWM割り込み要求をクリアする
```

##static uint32_t pwm_get_irq_status_mask (void)
```
引数：なし
戻り値：全PWM割り込みステータス
機能：全PWM割り込みステータスを取得する
```

##static void pwm_force_irq (uint slice_num)
```
引数：uint slice_num スライス番号(0-7)
戻り値：なし
機能：PWM割り込みを強制的に実施する
```