ARMの32ビットポートの15番ピンから値を取得する方法は?
-
05-07-2019 - |
質問
私は、IC、DS1620を使用して、1行の1ビットシリアルデータを読み取ります。 ARMマイクロコントローラー(LPC2378)のポートの1つを使用してこのデータを読み取る必要があります。 ARMポートは32ビットです。この値を1ビット変数に取得するにはどうすればよいですか?
編集:つまり、ポートピンへの直接参照が必要です。
解決
1ビット変数はありませんが、たとえば次のように特定のビットを分離できます:
uint32_t original_value = whatever();
uint32_t bit15 = (original_value >> 15) & 1; /*bit15 now contains either a 1 or a 0 representing the 15th bit */
注:0か1から始まるビット数をカウントしているかどうかはわかりませんので、>> 15
は1つずれているかもしれませんが、アイデアは得られます。
もう1つのオプションはビットフィールドを使用することですが、それは面倒になり、値のすべてのビットが何らかの方法で有用でない限り、IMOは価値がありません。 1ビットまたは2ビットだけが必要な場合は、シフトとマスキングが最適です。
全体として、この記事は役に立つかもしれません。
他のヒント
CPUには、Evan Teranからの回答を使用する必要があります。 Cortex-M3のような他のARM CPUのビットバンド機能について言及したかっただけです。 RAM /周辺機器の一部の領域では、簡単にアクセスできるようにすべてのビットが個別のアドレスにマップされます。
http:/をご覧ください。 /infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Behcjiic.html で詳細をご覧ください。
ポートレジスタに直接アクセスできる場合は簡単です(ARMの経験はありません)、必要なビットに対応するバイナリマスクとビット単位でANDするだけです:
var = (PORT_REGISTER & 0x00008000);
現在の変数には、15番目のビットが「0」の場合は0、15番目のビットが「1」の場合は0x00008000が含まれます。
また、「0」または「1」のいずれかを使用する場合は、それをシフトできます。
var = ((PORT_REGISTER & 0x00008000) >> 15);
コンパイラに付属のヘッダーファイルには、すべてのマイクロコントローラーのレジスターの宣言と、それらのレジスターのビットが含まれます。
この特定の記事では、ポート入力レジスタが PORTA
と呼ばれ、必要なビットに PORTA15
と呼ばれるマスクが定義されているものとします。
次に、そのピンの状態を読み取ります:
PinIsSet = (PORTA & PORTA15) == PORTA15;
または同等に、三項演算子を使用して:
PinIsSet = (PORTA & PORTA15) ? 1 : 0;
一般的なポイントとして、すべてのレジスタとビットの機能についてはリファレンスマニュアルを参照してください。また、いくつかの例を見てください。 ( Keilウェブサイトのこのページには両方が含まれていますが、他にもたくさんあります。ウェブ上の例。)
LPC2378(他のLPC2xxxxマイクロコントローラファミリと同様)では、I / Oポートはシステムメモリにあるため、次のような変数を宣言する必要があります。
#define DALLAS_PIN (*(volatile unsigned long int *)(0xE0028000)) /* Port 0 data register */
#define DALLAS_DDR (*(volatile unsigned long int *)(0xE0028008)) /* Port 0 data direction reg */
#define DALLAS_PIN (1<<15)
0xE0028000はport0のデータレジスタのアドレスであり、0xE0028008はport0のデータ方向レジスタアドレスであることに注意してください。アプリで使用されるポートとビットに応じてこれを変更する必要があります。 その後、コード関数で、write 1、write 0、readのコードまたはマクロは次のようになります。
#define set_dqout() (DALLAS_DDR&=~DALLAS_PIN) /* Let the pull-up force one, putting I/O pin in input mode */
#define reset_dqout() (DALLAS_DDR|=DALLAS_PIN,DALLAS_PORT&=~DALLAS_PIN) /* force zero putting the I/O in output mode and writing zero on it */
#define read_dqin() (DALLAS_DDR&=~DALLAS_PIN,((DALLAS_PORT & DALLAS_PIN)!= 0)) /* put i/o in input mode and test the state of the i/o pin */
これが役立つことを願っています。
よろしく!
ビットをテストする場合は、Cの演算子評価順序を念頭に置いておくとよいでしょう。
if( port & 0x80 && whatever() )
先ほど書いたように、予期しない動作が発生する可能性があります
if( port & (0x80 && whatever()) )
しかしおそらくメンション
if( (port & 0x80) && whatever() )