前回、Arduino Uno R4搭載のRA4M1マイコン内蔵のオペアンプを使ってみました。この機能についてはArduino環境にAPIが準備されていたのでお楽。でもRA4M1にはAPI準備されていない機能も多数あるようです。ついてはハードウエアのIOレジスタにアクセスしたいけれども。お作法に則ってやりたいっす。
※「やっつけな日常」投稿順 Index はこちら
ハードウエアのIOレジスタにアクセスする場合、データシートみればアドレス書いてあるので、自前で該当アドレスへのポインタを準備して読み書きすりゃええ、というのもアリとは思うのです。しかし、今回は「環境に準備済」の定義を参照して「お作法に則って」アクセスしたいと思います。
定義ファイルの在処
Arduino IDE 2.3.2 環境(Windows 11上)でのマイコン内蔵IOレジスタへのアクセスのための定義ファイル(ヘッダ)は、当方環境では以下にありました。
Arduinoのパッケージのインストールパスの下の\Arduino15\packages\arduino\hardware\renesas_uno\1.1.0\variants\MINIMA\includes\ra\fsp\src\bsp\cmsis\Device\RENESAS\Include
上記のフォルダに cmsis というパスが含まれているとおり、Arm社提唱の共通ソフトウエア環境 cmsis のサポート用の各種ファイルが含まれているようです。搭載マイコンの型番である R7FA4M1AB 以外のファイルも多数含まれてます。
Arduino IDE 2.3.2 でターゲットボードをArduino UNO R4に向けておけば、何のヘッダファイルをインクルードすることなく上記のフォルダ内の適切な機種のファイルが「見えて」いるようです。よって上記のパスを意識する必要はないかと思います。ただし「どんなレジスタがあって、どんなビットがあったっけ」というときには上記パス内のヘッダファイルをのぞき見するのが確実だと思います。まあ、データシート記載のレジスタ名やビット名と1対1対応になっている感じなので、特段確認せんでも大丈夫そうではあるのですが。
定義の階層構造
上記のヘッダファイル内では、ペリフェラル毎に、以下のようなお名前の構造体が定義されています(XXXにはペリフェラル名が入る)
R_XXX_Type
構造体内にはペリフェラル内のレジスタが列挙されています。通常は8ビット幅などのパラレルアクセス用にデータシートのレジスタ名と同一の名前が並んでいます。一方、それらとUnionの関係で、レジスタ名_b なるビットフィールドアクセス用のレジスタ定義もならんでます。これを使えばレジスタ内のビットを単独で読み書き可能です。よって、通常の周辺回路のレジスタ内のビットへは
R_ペリフェラル名 -> レジスタ名_b.ビット名
という感じの書き方でアクセス可能です。
IOポートなど複数の回路が並んでいるもの
IOポートのように、ほぼ同等な機能の複数のポートが並んでおり、さらに1つのポートの中に複数のビットがあるといった場合は配列が階層構造を成してます。たとえばポート1のビット11(端子名P111)のPmnPFSレジスタ内のPDRビットにアクセスする場合はこんな感じ。
D13番PINで確認
D13番ピン(D13はArduinoボード上の端子名。マイコン端子名はP111)にはユーザLEDが接続されており、Lチカに使ったりする端子です。この端子の設定や出力は、通常のArduinoのAPIで出来るますが、それと並行に上記のレジスタ直接アクセスを使って、ハードウエアのビットの確認をしてみたいと思います。
ループの中で、PDRビット(IOポートが出力1か入力0かを指定するビット)、DSCRビット(ドライブ能力が強1か弱0かを指定するビット)を読み出し、その後APIを使って出力HIGH/LOWを書き込んだ後、出力データビットPODRをよみだしてます。
ちゃんと直接レジスタ内のビットを読み取れているようです。よかった。
それではAPIがサポートしていない機能に直接アクセスしてみろよ、自分。それはまた今度か。
はじめまして
RA4M1レジスタの大変分かりやすい解説ありがとうございます。
次回も楽しみにしております。
前回のオペアンプの記事も参考になりました。
データシートでは「ゲイン帯域幅」が、High-speedモードで 1.7 MHzなので、もう少し上まで使えるかと思ったら10 kHz位とは残念な結果ですね。