05

はじめに

Githubで公開されている,GitHub - bztsrc/raspi3-tutorial: Bare metal Raspberry Pi 3 tutorialsのコードを読んでいく.今回は05_uart0を理解することを目的とする.

周辺知識

uart0について

The SoCs used on the Raspberry Pis have two built-in UARTs, a PL011 and a mini UART. They are implemented using different hardware blocks, so they have slightly different characteristics.

The Raspberry Pi UARTs - Raspberry Pi Documentation

上で書かれているように,ラズパイのSoCには2種類のUARTが内臓されている.それは,PL011とミニUARTという名前で,uart0とuart1に対応する.チュートリアル03ではミニUART(uart1)を実装したので,今回はPL011(uart1)を実装する.

UARTクロック数の設定について

uart0を使うためには,UARTに関するクロック数を知っておく必要がある.

All clocks are the base clocks for those peripherals, e.g. 3MHz for UART, 50/100MHz for EMMC, not the dividers applied using the peripheral.

Mailbox property interface · raspberrypi/firmware Wiki · GitHub

デフォルトでは3MHzのようだが,今回はメールボックスを使って4MHzに指定する.

ボーレートの設定

上でUARTに関するクロック数を知る必要があると述べたが,それはボーレートを設定するレジスタであるIBRDとFBRDに書き込む値を決定するためである.その式は以下の通り,(式の意味は省略する)

クロック数4MHz, ボーレート115200のとき
BAUDDIV = 4000000 / (16 * 115200) = 2.170138
IBRD(整数部) = 2
FBRD(少数部) = 0.1701 * 64 + 0.5 = 11.3864 = 11 = 0xb

クロック数3MHz, ボーレート115200のとき
BAUDDIV = 3000000 / (16 * 115200)= 1.62760
IBRD(整数部) = 1
FBRD(少数部) = 0.627 * 64 + 0.5 = 40.628 = 40 = 0x28

UARTの初期化手順

どのレジスタにどのような値を書き込むかは「BareMetalで遊ぶ RaspberryPi」に詳しく載っている.ラズパイ3でも同じ設定で大丈夫.ピンをプルダウンにする必要があるのかは,いまだよくわからない.