Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
pmc_disable_periph_clk()

pmc_disable_periph_clk()

概要

指定したピンに対応するペリフェラルクロックを無効にします。

ペリフェラルクロックは、Pmc型のPMCという変数のペリフェラルクロック関連のレジスタを操作することで有効化・無効化することができます。ペリフェラルクロックはペリフェラルクロック0とペリフェラルクロック1の2種類あります。ペリフェラルクロック関連のレジスタは、以下の6種類が存在します。

  1. ペリフェラルクロック0関連
    • ペリフェラルクロックEnableレジスタ0(PMC->PMC_PCER0)
    • ペリフェラルクロックDisableレジスタ0(PMC->PMC_PCDR0)
    • ペリフェラルクロックStatusレジスタ0(PMC->PMC_PCSR0)
  2. ペリフェラルクロック1関連
    • ペリフェラルクロックEnableレジスタ1(PMC->PMC_PCER1)
    • ペリフェラルクロックDisableレジスタ1(PMC->PMC_PCDR1)
    • ペリフェラルクロックStatusレジスタ1(PMC->PMC_PCSR1)

レジスタはそれぞれ32ビットで、各ビットが以下のペリフェラルIDに対応しています。Enableレジスタの対応するビットに1を書き込むとペリフェラルクロックが有効になり、Disableレジスタの対応するビットに1を書き込むとペリフェラルクロックが無効になります。Statusレジスタを読み出すと現在の状態を取得することができます。

ペリフェラルクロック0(PMC->PMC_PCER0、PMC->PMC_PCDR0、PMC->PMC_PCSR0)
ビット番号 31 30 29 28 27 26 25 24
ペリフェラルID ID_TC4 ID_TC3 ID_TC2 ID_TC1 ID_TC0 ID_SSC ID_SPI0
ビット番号 23 22 21 20 19 18 17 16
ペリフェラルID ID_TWI1 ID_TWI0 ID_HSMCI ID_USART3 ID_USART2 ID_USART1 ID_USART0 -
ビット番号 15 14 13 12 11 10 9 8
ペリフェラルID - ID_PIOD ID_PIOC ID_PIOB ID_PIOA - ID_SMC ID_UART
ビット番号 7 6 5 4 3 2 1 0
ペリフェラルID ID_EFC1 ID_EFC0 ID_PMC ID_WDT ID_RTT ID_RTC - -
ペリフェラルクロック1(PMC->PMC_PCER1、PMC->PMC_PCDR1、PMC->PMC_PCSR1)
ビット番号 31 30 29 28 27 26 25 24
ペリフェラルID - - - - - - - -
ビット番号 23 22 21 20 19 18 17 16
ペリフェラルID - - - - - - - -
ビット番号 15 14 13 12 11 10 9 8
ペリフェラルID - - - ID_CAN1 ID_CAN0 ID_EMAC ID_TRNG ID_UOTGHS
ビット番号 7 6 5 4 3 2 1 0
ペリフェラルID ID_DMAC ID_DACC ID_ADC ID_PWM ID_TC8 ID_TC7 ID_TC6 ID_TC5

ソースコード

pmc_disable_periph_clk()は、hardware/arduino/sam/system/libsam/source/pmc.c に定義されています。以下に全ソースコードを示します。ソースコードのライセンスはこちら

# define MAX_PERIPH_ID    44
uint32_t pmc_disable_periph_clk(uint32_t ul_id)
{
        if (ul_id > MAX_PERIPH_ID) {
                return 1;
        }

        if (ul_id < 32) {
                if ((PMC->PMC_PCSR0 & (1u << ul_id)) == (1u << ul_id)) {
                        PMC->PMC_PCDR0 = 1 << ul_id;
                }
        } else {
                ul_id -= 32;
                if ((PMC->PMC_PCSR1 & (1u << ul_id)) == (1u << ul_id)) {
                        PMC->PMC_PCDR1 = 1 << ul_id;
                }
        }
        return 0;
}

引数はuint32_t型のul_idです。

ul_idがMAX_PERIPH_ID(SAM3X8Eプロセッサでは44と定義されています)より大きいときは何もせずにエラーリターンします。

ul_idが32より小さいときはPMC->PMC_PCSR0のul_idに対応するビットを調べて、1でなければPMC->PCDR0に1に設定します。

ul_idが32以上の場合は、まず、ul_idから32を引きます。その後、PMC->PMC_PCSR1のul_idに対応するビットを調べて、1でなければPMC->PMC_PCDR1を1に設定します。

バージョン

Arduino 1.5



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2013 garretlab all rights reserved.
inserted by FC2 system