Ch32v003

Rust for CH32V003 #

ch32v00x-hal #

ch32-hal #

qingke_rt #

レジスタ設定 #

システムクロック #

CH32V003のシステムクロック源には内部の発振器HSIと外部のHSEから選べる。 内部発振器HSIは24MHzで動作している。

HSIの出力には分周期がついていて、リセット状態では1/3、つまり8MHzがシステムクロックとして使用されている。

また、PLLが内蔵されていて2倍クロックを生成できる。分周なしのHSI24MHzをPLLの入力とすると、その2倍の48MHzが使用できる。

クロックの設定はRCC (Reset and Clock Control)ブロックで行う。

PLLを使い48MHzにするには、

  • PLLをONにする。
    • RCC_CTRLのPLLONビットを1にする。
  • HSIをONにする。
    • RCC_CTRLのHSIONビットを1にする。(デフォルトで1)
  • 分周器を無効(分周比1)にする。
    • RCC_CFG0のHPREを0にする。(デフォルトは0b0010で1/3分周)
  • PLLをシステムクロックとして選択する。
    • RCC_CFG0のSWを10にする。(デフォルトは0b00でHSIが選ばれている)

と設定すればよい。

GPIO #

GPIOはGPIOA, GPIOC, GPIODのブロックがある。 それぞれのブロックを使うにはまずクロックを供給する設定を行う。

  • RCC_APB2PCENRの各ビットを1にする。
    • GPIOAは、IOPAENビット
    • GPIOCは、IOPCENビット
    • GPIODは、IOPDENビット

ピン設定はGPIOx(A or C or D)_CFGLRで行う。

GPIOx_CFGLRのMODEは2bitで入力・出力を選択する。

  • 00: 入力モード
  • 01: 出力モード (10MHz)
  • 10: 出力モード (20MHz)
  • 11: 出力モード (30MHz)

GPIOx_CFGLRのCNFは2bitで入力か出力モードかによって意味が変わる

  • 入力モードのとき
    • 00: アナログ入力
    • 01: フローティング
    • 10: プルアップかプルダウン付き
    • 11: RFU
  • 出力モードのとき
    • 00: プッシュプ
    • 01: オープンドレイン
    • 10: 周辺回路で使用。プッシュプル。
    • 11: 周辺回路で使用。オープンドレイン。

ピンの状態を読むレジスタは、GPIOx_INDR

出力状態の設定レジスタは、GPIOx_OUTDR。入力モードのときはプルアップの設定になる。

SysTick #

CH32V003のCPUコアにはシステムタイマーが付属していて規則的な割り込み生成に使用できる。 クロック源はHCLKか8分周したHCLK/8を選択できる。

SysTickはCPUコアに付属している周辺回路なので、QingKeV2プロセッサのマニュアルに記載されている。

  • SysTick割り込みの発生を有効にする
    • STK_CTLRのSTIEビットを1にする
  • クロック源を分周なしにする
    • STK_CTLRのSTCLKビットを1にする
  • SysTickカウンターを有効にする
    • STK_CTLRのSTEビットを1にする。
  • カウンターの自動リロード(周期的な動作にする)を有効にする
    • STK_CTLRのSTREビットを1にする。

割り込み発生周期は、カウンターと比較する値をレジスタ設定する。 例えば8MHzのHCLKとしたとき、8000000-1をレジスタに設定すれば、1秒間隔で割り込みが発生することになる。

- カウンターとの比較値はSTK_CMPRレジスタに設定する。

カウンター値を直接設定することもできる。マニュアルにはリセット値が0となっているが、最初に0を書き込んで初期化しないとと正しく動作しないようである。

  • カウンター値はSTK_CNTRレジスタで設定する。

割り込みが発生したあと、割り込みハンドラー内で、ステータスレジスタ(STK_SR)に0を書き込み、ステータスをクリアする必要がある。

  • 割り込み発生後はSTK_SRに0を書き込み、ステータスクリアする。

割り込みコントローラー #

SysTick回路で発生した割り込み信号をCPUコアに接続するために、割り込みコントローラーの設定も必要になる。

SysTick回路からの割り込みは、割り込み番号12番に割り当てられているため、割り込みコントローラーで12番目の割り込みを有効にする。

割り込みコントローラーはPFIC(Programmable Fast Interrupt Controller)と呼ばれている。

  • SysTick割り込み(割り込み番号12)を有効にする
    • PFIC_IENR1レジスタの12ビット目を1にする。