質問: 授業で扱っているアセンブリでのraspberrypiに関するプログラムなのですが、 equ GPIO_BASE, 0x3f200000 @ GPIOベースアドレス .equ GPFSEL0, 0x00 @ GPIOポートの機能を選択する番地のオフセット .equ GPFSEL_IN, 0x0 @ 入力用 .equ GPFSEL_OUT, 0x1 @ 出力用 .equ GPSET0, 0x1C @ GPIOポートの出力値を1にするための番地のオフセット .equ GPCLR0, 0x28 @ GPIOボートの出力値を0にするための番地のオフセット .equ LED_PORT, 10 @ LEDが接続されたGPIOのポート番号 .equ SWITCH_PORT, 13 @ switch1が接続されたGPIOのポート番号 .section .init .global _start _start: ldr r0, =GPIO_BASE mov r3, #(1 << 13) @ GPIO #10 を出力用に設定 mov r1, #(GPFSEL_OUT << (3 * (LED_PORT % 10))) str r1, [r0, #(GPFSEL0 + LED_PORT / 10 * 4)] loop0: ldr r2, [r0, #0x0034] @ GPLEV0のアドレスをr2に代入 and r2, r2, r3 @ 13番ポートの数値のみを残し,残りは0に lsr r2, r2, #13 @ 1番ポートに13番ポートの数値を持ってくる. cmp r2, #1 beq loop1 @ GPIO #10 に 0 を出力 mov r1, #(1 << (LED_PORT % 32)) str r1, [r0, #(GPCLR0 + LED_PORT / 32 * 4)] b loop0 loop1: @ GPIO #10 に 1 を出力 mov r1, #(1 << (LED_PORT % 32)) str r1, [r0, #(GPSET0 + LED_PORT / 32 * 4)] b loop0 loop: b loop このようなプログラムでスイッチを押すとLEDが点灯するように設定することができました。しかし、GPIOのlevel0のアドレス 0x0034という値が授業テキストに 英語で書かれており、なぜそうなるのか よく理解できていません。 教えてくれると幸いです。
回答: 多くのマイコンは特定のアドレスにGPIOなど内蔵回路の機能が割り振ってあって そのアドレスの値を操作することで回路を操作できます。(memory mapped IO) で、ラズパイに積んであるBCM2835というチップの GPIOのlevel0に割り当てられているアドレスが0x0034なんです BCM2835のデータシート90ページぐらいに書いてあります