重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【終了しました】教えて!goo新規会員登録

C言語について質問があるので投稿させていただきました。


現在Renesas製 RXマイコンにてポート制御のプログラムを作成しています。

そこで一点分らない点がありましたのでご教授いただければ幸いです。

現在I/Oポートレジスタの入出力設定を行っています。

レジスタ値を書き換えるだけであれば下記の通りかと思います。

#define PORTA (*(volatile unsigned char *)0x0008C00A)

PORTA = 0x01;


レジスタアドレスを引数として関数に渡し関数内でレジスタ値を書き換えるにはどうすれば
よろしいでしょうか。
void main(void)
{
setPinMode(PORTA);
PORTA.PODR.BIT.B0 = 0x01;
while(1);
}

void setPinMode(uint32_t* portNumber)
{
*portNumber = 0x01;
}

としていますが上手くいきません。
型がおかしい?
ポインタってものが分かってない?

など色々考えてはみたのですが何分初心者なので解決に至っておりません。


よろしければご教授の程よろしくお願いいたします。

A 回答 (2件)

組み込みだとちょっと違うところがあるかもしれませんが, 普通の C なら


setPinMode(PORTA);
はエラーにならないでしょう>#1. 実引数は (volatile な) unsigned char, 仮引数は uint32_t * と型は違いますが, ISO C では整数からポインタに変換できる (ただしその結果は未保証) ので, これに従う限りコンパイルは通ってしまいます. 親切なコンパイラなら警告くらいは出すかな?

ただ, PORTA が unsigned char を期待するのに対し setPinMode が uint32_t を要求するのでこの関数自体が危険です. 例えば「8ビット幅のポートに 32ビットの値を書き込む」ようなことになったりするわけですが, このときハードウェア的にどう動くかはわかりません.

とりあえず
・setPinMode(PORTA); を setPinMode(&PORTA); にする
・void setPinMode(uint32_t* portNumber) を void setPinMode(volatile unsigned char* portNumber) にする
で動くかもしれません.
    • good
    • 0
この回答へのお礼

ありがとうございました。無事点灯しました。因みに教えていただいた内容でやってみたのですが上手くいかず悩んでいましたが結局レジスタアドレスが違うというミスも犯していました。

お礼日時:2013/03/24 02:40

いつも言ってることですが


「『うまくいかない』の具体的内容は?」
「まずは、エラーメッセージをよく読みましょう」

PORTAの定義がそのままなら
(*(volatile unsigned char *)0x0008C00A)
というのは 0x0008C00A という数値を (volatile unsigned char *)型(volatileな unsigned char へのポインタ)と解釈
→それに * がついているので、ポインタが指す場所にあるデータ(volatileな unsigned char へのポインタが指す場所なので、volatileな unsigned char 型)になります。

void setPinMode(uint32_t* portNumber)
に対して
setPinMode(PORTA); // PORTAはunsigned char型)
とすれば、もちろん、型が一致しません。

・型をそろえる
・渡したいのはポインタ
・PORTAは実体であって、ポインタではない
というあたりを落ち着いて考えれば解決できるはずです。

> ポインタってものが分かってない?

そう思っているのなら、まずは、ポインタをマスターしましょう
    • good
    • 0
この回答へのお礼

>「まずは、エラーメッセージをよく読みましょう」

cubesuite+にてプログラムを作っているのですがエラーは出ていませんでした。

型を揃えていませんでした。

結局力不足で回答までたどり着けなかったので別の方法にて実装しました。

ありがとうございました。

お礼日時:2013/03/21 23:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!