#概要
Raspberry Pi Pico C/C++ SDKのPWM用関数のメモ
公式ドキュメントRaspberry Pi Pico C/C++ SDKの「4.1.17. hardware_pwm」をほとんど訳しただけです。
#レジスタ
//レジスタ構造体
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割り込みを強制的に実施する