peripherals-from-datasheet について
peripherals-from-datasheet は、MCU のリファレンスマニュアルに基づく周辺機器ドライバー作成をエージェント向けに案内します。ベアメタル開発、MCU ファミリー間の移植、HAL の検証に使え、レジスター定義、初期化順序、タイミングを扱います。
主な機能
- 01マニュアルからレジスター情報を特定
- 02レジスターマップに沿ったコード構成
- 03周辺機器の初期化順序の確認
- 04マニュアルを参照したビット定義
- 05タイミングとステータスフラグの遵守
活用シーン
- 01ベンダー HAL に頼らないドライバー作成
- 02MCU ファミリー間でのドライバー移植
- 03マニュアルに基づく HAL 動作の確認
- 04周辺機器の設定や転送障害の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill peripherals-from-datasheetインストール後、Claude Code で/peripherals-from-datasheetを入力して読み込まれたか確認します。
詳細
データシートから周辺機器を実装する
目的
MCU のリファレンスマニュアルをもとに周辺機器ドライバーを作成するための、再現性のある手法をエージェント向けに説明します。レジスタマップの探し方、ビット定義の読み解き方、初期化シーケンスの確認方法、タイミング制約の遵守、保守しやすいレジスタレベルのコードの作成方法を扱います。ドキュメントのナビゲーション方法については、skills/baremetal/datasheet-and-refmanual-reading と併用してください(別々のスキルとして管理されています)。
使用する場面
- ベンダー HAL を使わずにドライバーを作成する場合
- MCU ファミリー間で周辺機器を移植する場合
- HAL の動作をリファレンスマニュアルと照合する場合
- サンプルによると「動作するはず」の周辺機器をデバッグする場合
ワークフロー
1. リファレンスマニュアルのナビゲーション
Typical RM structure
├── Memory map (peripheral base addresses)
├── Peripheral chapter (UART, SPI, GPIO, ...)
│ ├── Functional description
│ ├── Register map (table of offsets)
│ ├── Register bit definitions
│ └── Timing / electrical notes
└── Electrical characteristics (clock limits, setup/hold)
レジスタへの書き込みをコピーする前に、まずプログラミングモデルのセクションを確認してください。
2. レジスタマップの抽出
/* From RM — USART base 0x40004400 */
typedef struct {
volatile uint32_t SR; /* 0x00 status */
volatile uint32_t DR; /* 0x04 data */
volatile uint32_t BRR; /* 0x08 baud */
volatile uint32_t CR1; /* 0x0C control */
/* ... */
} USART_TypeDef;
#define USART2 ((USART_TypeDef *)0x40004400UL)
オフセット列が構造体のレイアウト(予約語のパディングを含む)と一致することを確認してください。
3. 初期化シーケンスのチェックリスト
Peripheral bring-up order
├── 1. Enable bus clock (RCC/APB/AHB register)
├── 2. Reset peripheral (if RM requires)
├── 3. Configure pins (GPIO alternate function)
├── 4. Configure peripheral registers (mode, baud, etc.)
├── 5. Enable peripheral (UE, TE, RE bits)
├── 6. Enable NVIC IRQ (if interrupt-driven)
└── 7. Verify status flags before first transaction
悪い例 — クロックより先に UART を有効化:
USART2->CR1 |= USART_CR1_UE; /* USART clock still off — no effect */
4. ビット定義の扱い
/* From RM: CR1 M[1:0], PCE, PS, TE, RE, UE */
#define USART_CR1_UE (1U << 13)
#define USART_CR1_TE (1U << 3)
#define USART_CR1_RE (1U << 2)
監査証跡として、コメントに RM のセクション番号を記載してください。
5. タイミングとビジーウェイト
/* RM: poll BUSY flag until reset complete */
while (RCC->CR & RCC_CR_PLLRDY == 0)
;
電気的特性の章に記載されている起動時間(発振器の安定時間、PLL のロック時間)を守ってください。
6. 適切なドライバー構造と不適切なドライバー構造
良い例 — レイヤー化され、RM を参照:
void usart2_init(uint32_t baud) {
rcc_enable_usart2();
gpio_config_usart2_pins();
usart2_set_baud(baud);
USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
}
悪い例 — マジックナンバーを使い、クロックを有効化しない:
*(uint32_t*)0x4000440C = 0x2000; /* what peripheral? which bit? */
7. エージェントの使用例
/peripherals-from-datasheet Walk me through USART init from STM32 RM
/peripherals-from-datasheet What sections of the ref manual matter for SPI timing?
よくある問題
| 症状 | 原因 | 対処方法 |
|---|---|---|
| 周辺機器が動作しない | クロックが有効化されていない | まず RCC/APB の有効化ビットを設定する |
| ボーレートが正しくない | PCLK の前提が誤っている | 実際のクロックツリーに基づいて再計算する |
| GPIO の AF が正しくない | 誤った表から MUX 値を取得している | ピン配置と AF テーブルを照合する |
| IRQ が停止したまま | ステータスフラグのクリア手順が誤っている | RM の「フラグのクリア」サブセクションを確認する |
| データが気付かないうちに破損する | エンディアンまたはアクセス幅が一致していない | レジスタのアクセスサイズを一致させる |
関連スキル
skills/baremetal/datasheet-and-refmanual-reading— RM をすばやくナビゲートするskills/baremetal/mmio-and-bit-manipulation— レジスタアクセスのパターンskills/baremetal/gpio-baremetal— 周辺機器を有効化する前にピンの MUX を設定するskills/embedded/linker-scripts— メモリマップのアライメント
コメント
Markdown 対応