1 メモリとバスアーキテクチャ
図1-1 CH32F2xシステムアーキテクチャ
1.1 バスアーキテクチャ
CH32F2xは、ARMRCortexTM-M3コアをベースにしたマイクロコントローラです。
フレームワーク内のコア、調停ユニット、DMAモジュール、SRAMメモリなどは、複数のバスセットを介して相互作用します。
システムアーキテクチャは図1-1のとおりです。
CH32V2xは、RISC-V命令セットをベースに設計された汎用マイクロコントローラです。
アーキテクチャ内のコア、調停ユニット、DMAモジュール、SRAMメモリなどは、複数のバスセットを介して相互作用します。
このシステムは、コード実行を高速化するフラッシュアクセス・プリフェッチ機構、CPU負荷を軽減し効率を向上させる汎用DMAコントローラ、 周辺機器の動作消費電力を削減するクロックツリー階層管理などの機能を搭載しています。
また、データ保護機構やクロックセキュリティシステム保護機構といった機能も備えており、システムの安定性を高めています。
● コマンドバス(I-Code)は、コアとFLASHコマンドインターフェースを接続し、プリフェッチはこのバス上で完了します。
● データバス(D-Code)は、コアとFLASHデータインターフェースを接続し、常時ロードとデバッグを行います。
● システムバスは、コアとバスマトリックスを接続し、コア、DMA、SRAM、および周辺機器のアクセスを調整します。
●DMAバスはDMA AHBマスター制御インターフェースとバスマトリックスを接続し、バスアクセスオブジェクトにはフラッシュデータ、SRAM、ペリフェラルが含まれます。
●バスマトリックスは、システムバス、データバス、DMAバス、SRAM、AHB/APBブリッジ間のアクセス調整に使用されます。
●AHB/APBブリッジは、AHBバスと2つのAPBバスの同期接続を提供します。
異なるペリフェラルは異なるAPBバスに接続され、実際のニーズに応じて異なるバスクロックを設定することで、パフォーマンスを最適化できます。
図1-3 ストレージマッピング
フレームワーク内のコア、調停ユニット、DMAモジュール、SRAMメモリなどは、複数のバスセットを介して相互作用します。
システムアーキテクチャは図1-1のとおりです。
CH32V2xは、RISC-V命令セットをベースに設計された汎用マイクロコントローラです。
アーキテクチャ内のコア、調停ユニット、DMAモジュール、SRAMメモリなどは、複数のバスセットを介して相互作用します。
このシステムは、コード実行を高速化するフラッシュアクセス・プリフェッチ機構、CPU負荷を軽減し効率を向上させる汎用DMAコントローラ、 周辺機器の動作消費電力を削減するクロックツリー階層管理などの機能を搭載しています。
また、データ保護機構やクロックセキュリティシステム保護機構といった機能も備えており、システムの安定性を高めています。
● コマンドバス(I-Code)は、コアとFLASHコマンドインターフェースを接続し、プリフェッチはこのバス上で完了します。
● データバス(D-Code)は、コアとFLASHデータインターフェースを接続し、常時ロードとデバッグを行います。
● システムバスは、コアとバスマトリックスを接続し、コア、DMA、SRAM、および周辺機器のアクセスを調整します。
●DMAバスはDMA AHBマスター制御インターフェースとバスマトリックスを接続し、バスアクセスオブジェクトにはフラッシュデータ、SRAM、ペリフェラルが含まれます。
●バスマトリックスは、システムバス、データバス、DMAバス、SRAM、AHB/APBブリッジ間のアクセス調整に使用されます。
●AHB/APBブリッジは、AHBバスと2つのAPBバスの同期接続を提供します。
異なるペリフェラルは異なるAPBバスに接続され、実際のニーズに応じて異なるバスクロックを設定することで、パフォーマンスを最適化できます。
図1-3 ストレージマッピング
| ADDRESS | ||
|---|---|---|
| START | END | |
| Reserved | 0xE010 0000 | 0xFFFF FFFFF |
| Core Private Peripherals | 0xE000 0000 | 0xE001 FFFF |
| Reserved | 0x5004 0000 | 0xDFFF FFFF |
| USBFS | 0x5000 0000 | 0x5003 FFFF |
| Reserved | 0x4002 A000 | 0x4FFF FFFF |
| Ethernet (CH203RBx) | 0x4002 8000 | 0x4002 9FFF |
| Reserved | 0x4002 3C00 | 0x4002 7FFF |
| EXTEND | 0x4002 3800 | 0x4002 3BFF |
| Reserved | 0x4002 3400 | 0x4002 37FF |
| CRC | 0x4002 3000 | 0x4002 33FF |
| Reserved | 0x4002 0400 | 0x4002 2FFF |
| DMA | 0x4002 0000 | 0x4002 03FFF |
| Reserved | 0x4001 3C00 | 0x4001 FFFF |
| USART1 | 0x4001 3800 | 0x4001 3BFF |
| Reserved | 0x4001 3400 | 0x4001 37FF |
| SPI1 | 0x4001 3000 | 0x4001 33FF |
| TIM1 | 0x4001 2C00 | 0x4001 2FFF |
| ADC2/TouchKey | 0x4001 2800 | 0x4001 2BFF |
| ADC1/TouchKey | 0x4001 2400 | 0x4001 27FF |
| Reserved | 0x4001 1800 | 0x4001 23FF |
| Port D | 0x4001 1400 | 0x4001 17FF |
| Port C | 0x4001 1000 | 0x4001 13FF |
| Port B | 0x4001 0C00 | 0x4001 0FFF |
| Port A | 0x4001 0800 | 0x4001 0BFF |
| EXTI | 0x4001 0400 | 0x4001 07FF |
| AFIO | 0x4001 0000 | 0x4001 03FF |
| Reserved | 0x4000 7400 | 0x4000 FFFF |
| PWR | 0x4000 7000 | 0x4000 73FF |
| BKP | 0x4000 6C00 | 0x4000 6FFF |
| Reserved | 0x4000 6800 | 0x4000 6BFF |
| bxCAN1 | 0x4000 6400 | 0x4000 67FF |
| share 512B SRAM | 0x4000 6000 | 0x4000 63FF |
| USBD | 0x4000 5C00 | 0x4000 5FFF |
| I2C2 | 0x4000 5800 | 0x4000 5BFF |
| I2C1 | 0x4000 5400 | 0x4000 57FF |
| Reserved | 0x4000 5000 | 0x4000 53FF |
| UART4 | 0x4000 4C00 | 0x4000 4FFF |
| USART3 | 0x4000 4800 | 0x4000 4BFF |
| USART2 | 0x4000 4400 | 0x4000 47FF |
| Reserved | 0x4000 3C00 | 0x4000 43FF |
| SPI2 | 0x4000 3800 | 0x4000 3BFF |
| Reserved | 0x4000 3400 | 0x4000 37FF |
| IWDG | 0x4000 3000 | 0x4000 33FF |
| WWDG | 0x4000 2C00 | 0x4000 2FFF |
| RTC | 0x4000 2800 | 0x4000 2BFF |
| Reserved | 0x4000 1000 | 0x4000 27FF |
| TIM5 (CH203RBx) | 0x4000 0C00 | 0x4000 0FFF |
| TIM4 | 0x4000 0800 | 0x4000 0BFF |
| TIM3 | 0x4000 0400 | 0x4000 07FF |
| TIM2 | 0x4000 0000 | 0x4000 03FF |
| Reserved | 0x2001 0000 | 0x3FFF FFFF |
| SRAM (64KBmax) | 0x2000 0000 | 0x2000 FFFF |
| Reserved | 0x1FFF F880 | 0x1FFF FFFF |
| Option Bytes | 0x1FFF F800 | 0x1FFF F87F |
| Vendor Bytes | 0x1FFF F700 | 0x1FFF F7FF |
| Reserved | 0x1FFF F000 | 0x1FFF F6FF |
| System FLASH (BOOT_28KB) | 0x1FFF 8000 | 0x1FFF EFFF |
| Reserved | 0x---- ---- | 0x1FFF 7FFF |
| Code FLASH 224KB maxIncludes 0 Wait and non-0 waiting areas | 0x0800 0000 | 0x---- ---- |
| Aliased to Flash or system memory Depending on BOOT pins | 0x0000 0000 | 0x0800 0000 |
1.2 メモリマップ
CH32F2x、CH32V2x、CH32V3x はいずれもプログラムメモリ、データメモリ、コアレジスタ、ペリフェラルレジスタなどを備えており、これらはすべて 4GB のリニア空間でアドレス指定されます。
システムメモリはデータをリトルエンディアン形式で保存します。
つまり、下位バイトは下位アドレスに、上位バイトは上位アドレスに保存されます。
システムメモリはデータをリトルエンディアン形式で保存します。
つまり、下位バイトは下位アドレスに、上位バイトは上位アドレスに保存されます。
1.2.1 ビットセグメントアクセス
ビットセグメントとは、ビット操作を独立して読み書きすることを意味します。
CH32F2xは、マッピング処理方式により、周辺レジスタおよびSRAM領域の内容に対するビット操作の読み書きを提供します。
具体的な方法:
1) マッピングされたアドレス領域から32ビットデータを読み出し、読み出し値が0または0以外で、対象ビット値が0または1の場合。
2) マッピングされたアドレス領域に32ビットデータを書き込み、0または1を書き込み、対象ビットの値を0または1に変更します。
アドレスマッピング:
対象ビットフィールド:ベースアドレス(BEaddr)+オフセットアドレス(Ofaddr)+ビット番号(BitN)
マッピングアドレス:Mapaddr
Mapaddr = BEaddr + 0x2000000 + (Ofaddr×32) + (BitN×4)
例1:
SRAM領域のアドレスバイト0x20000100のビット3の対象ビットフィールドを操作します。
Mapaddr = 0x20000000 + 0x2000000 + (0x100*32) + (3*4) = 0x2200200C
アドレス0x2200200Cの4バイトデータの内容を読み取って、ビット3が0x20000100
アドレスバイトが0または1の場合、0x2200200Cアドレスに0または1を書き込むと、0x20000100アドレスバイトのビット3を0または1に変更できます。
例2:
ペリフェラル領域のアドレス0x40021000のビット24を操作する:
Mapaddr = 0x20000000+0x2000000+(0x21000*32)+(24*4)= 0x22420060
アドレス0x22420060の4バイトデータの内容を読み取って、ペリフェラルアドレス0x40021000のビット24が0か1かを確認します。
アドレス0x22420060に0か1を書き込みます。
0x40021000 ペリフェラルアドレスのビット24を 0 または 1 に変更できます。
注:
CH32V2x および CH32V3x は、ビットセグメントマッピングアクセスモードをサポートしていません。
CH32F2xは、マッピング処理方式により、周辺レジスタおよびSRAM領域の内容に対するビット操作の読み書きを提供します。
具体的な方法:
1) マッピングされたアドレス領域から32ビットデータを読み出し、読み出し値が0または0以外で、対象ビット値が0または1の場合。
2) マッピングされたアドレス領域に32ビットデータを書き込み、0または1を書き込み、対象ビットの値を0または1に変更します。
アドレスマッピング:
対象ビットフィールド:ベースアドレス(BEaddr)+オフセットアドレス(Ofaddr)+ビット番号(BitN)
マッピングアドレス:Mapaddr
Mapaddr = BEaddr + 0x2000000 + (Ofaddr×32) + (BitN×4)
例1:
SRAM領域のアドレスバイト0x20000100のビット3の対象ビットフィールドを操作します。
Mapaddr = 0x20000000 + 0x2000000 + (0x100*32) + (3*4) = 0x2200200C
アドレス0x2200200Cの4バイトデータの内容を読み取って、ビット3が0x20000100
アドレスバイトが0または1の場合、0x2200200Cアドレスに0または1を書き込むと、0x20000100アドレスバイトのビット3を0または1に変更できます。
例2:
ペリフェラル領域のアドレス0x40021000のビット24を操作する:
Mapaddr = 0x20000000+0x2000000+(0x21000*32)+(24*4)= 0x22420060
アドレス0x22420060の4バイトデータの内容を読み取って、ペリフェラルアドレス0x40021000のビット24が0か1かを確認します。
アドレス0x22420060に0か1を書き込みます。
0x40021000 ペリフェラルアドレスのビット24を 0 または 1 に変更できます。
注:
CH32V2x および CH32V3x は、ビットセグメントマッピングアクセスモードをサポートしていません。
1.2.2 メモリ構成
最大128KBのSRAMを内蔵し、開始アドレスは0x20000000で、バイト、ハーフワード(2バイト)、フルワード(4バイト)のアクセスをサポートします。
ユーザーアプリケーションを保存するための、最大480KBのプログラムフラッシュストレージ領域(CodeFlash)を内蔵しています。
システムブートプログラム(メーカーが固定化したブートローディングプログラム)を保存するための、28KBのシステムメモリ(ブートローダ)を内蔵しています。
メーカーが定義したコンフィギュレーションワードを保存するための128KBのメモリを内蔵しています。
このコンフィギュレーションワードは工場出荷前に固定化されており、ユーザーによる変更はできません。
ユーザーが選択したワードを保存するための128KBのメモリを内蔵しています。
注:
製品番号によってメモリ構成が異なります。
詳細は、CH32F20xDS0.PDFおよびCH32F20x_30xDS0.PDFを参照してください。
ユーザーアプリケーションを保存するための、最大480KBのプログラムフラッシュストレージ領域(CodeFlash)を内蔵しています。
システムブートプログラム(メーカーが固定化したブートローディングプログラム)を保存するための、28KBのシステムメモリ(ブートローダ)を内蔵しています。
メーカーが定義したコンフィギュレーションワードを保存するための128KBのメモリを内蔵しています。
このコンフィギュレーションワードは工場出荷前に固定化されており、ユーザーによる変更はできません。
ユーザーが選択したワードを保存するための128KBのメモリを内蔵しています。
注:
製品番号によってメモリ構成が異なります。
詳細は、CH32F20xDS0.PDFおよびCH32F20x_30xDS0.PDFを参照してください。
1.3 スタートアップ構成
システムは、BOOT0ピンとBOOT1ピンを介して3つの異なるスタートアップモードを選択できます。
表1-1 起動モード
ユーザーは、BOOTピンのステータス値を設定することで、リセット後の起動モードを選択します。
システムリセット後または電源リセット後、BOOTピンの値は再びラッチされます。
プログラムフラッシュメモリ、システムメモリ、および内部SRAMは、起動モードによってアクセス方法が異なります。
● プログラムフラッシュメモリから起動する場合、プログラムフラッシュメモリのアドレスは0x00000000番地領域にマッピングされ、開始アドレス領域0x08000000からもアクセスできます。
● システムメモリから起動する場合、システムメモリのアドレスは0x00000000番地領域にマッピングされ、元のアドレス領域0x1FFFF000からもアクセスできます。
● 内部SRAMから起動する場合、0x20000000番地領域からのみアクセスできます。
CH32F2xをこの領域で起動する場合、NVICコントローラを介してベクターテーブルオフセットレジスタを設定し、ベクターテーブルをSRAMに再マップする必要があります。
CH32V2xおよびCH32V3xでは、この操作は不要です。
表1-1 起動モード
| BOOT0 | BOOT1 | 起動モード |
|---|---|---|
| 0 | X | プログラムフラッシュメモリからの起動 |
| 1 | 0 | システムメモリからの起動 |
| 1 | 1 | 内部SRAMからの起動 |
システムリセット後または電源リセット後、BOOTピンの値は再びラッチされます。
プログラムフラッシュメモリ、システムメモリ、および内部SRAMは、起動モードによってアクセス方法が異なります。
● プログラムフラッシュメモリから起動する場合、プログラムフラッシュメモリのアドレスは0x00000000番地領域にマッピングされ、開始アドレス領域0x08000000からもアクセスできます。
● システムメモリから起動する場合、システムメモリのアドレスは0x00000000番地領域にマッピングされ、元のアドレス領域0x1FFFF000からもアクセスできます。
● 内部SRAMから起動する場合、0x20000000番地領域からのみアクセスできます。
CH32F2xをこの領域で起動する場合、NVICコントローラを介してベクターテーブルオフセットレジスタを設定し、ベクターテーブルをSRAMに再マップする必要があります。
CH32V2xおよびCH32V3xでは、この操作は不要です。
