トップ 一覧 検索 ヘルプ RSS ログイン

LM4F120 Stellaris LaunchPad の UART5 が動かないの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{category 電子工作}}
!!!現象

CCS についてくる UART0 (PA0,PA1)を使うサンプル、たとえば usb_dev_serial なんかをほかの UART にアサインするとうまく動作しない。



PA0,PA1 はデバッガ(の同一マイコンのPA0,PA1)に接続されて、こちらもシリアルポートとして見えているので、このサンプルは USB-USB の仮想シリアルケーブルとして使えるすぐれものなのですが、片方をピンヘッダに出して、格安 USB-Serial 変換機として使おうと UART5 に変更したつもりが、はまりました。

まず、だれでも思いつくのが下記の変更

usb_dev_serial.c の該当箇所

 #define USB_UART_BASE           UART5_BASE
 #define USB_UART_PERIPH         SYSCTL_PERIPH_UART5
 #define USB_UART_INT            INT_UART5

 #define TX_GPIO_BASE            GPIO_PORTE_BASE
 #define TX_GPIO_PERIPH          SYSCTL_PERIPH_GPIOE
 #define TX_GPIO_PIN             GPIO_PIN_5

 #define RX_GPIO_BASE            GPIO_PORTE_BASE
 #define RX_GPIO_PERIPH          SYSCTL_PERIPH_GPIOE
 #define RX_GPIO_PIN             GPIO_PIN_4

あと、ちょっと他のマイコンに慣れた人だとベクタテーブル(startup_ccs.c) の UART0 と UART5 の変更(下記)、くらいは思いつくでしょう。


startup_ccs.c 91 行目あたり
    //USBUARTIntHandler,                    // UART0 Rx and Tx
    IntDefaultHandler,                      // UART0 Rx and Tx

startup_ccs.c 147 行目あたり
    //IntDefaultHandler,                    // UART5 Rx and Tx
    USBUARTIntHandler,                      // UART5 Rx and Tx



あとはペリフェラルの個別有効化、重複ピンファンクションの設定、というのが定石です。

しかし、API でそれをやっていそうだし、現に UART0 は動作しています。なんなんでしょう。

!!!原因

CCS のデバッガで、動作している UART0 の GPIO と UART5 のときの違いをみていたら、あー、というのがありました。

UART0(PA0,PA1) は最初っから UART として使えるようになっているので、その分の初期化が省かれているようです。

!!!対処

サンプルのまま UART5 を使おうとすると、GPIOPCTL が初期化されないので、初期化コードをいれるとよい。

gpio_jtag というサンプルに、

 GPIOPinConfigure(GPIO_PA0_U0RX);
 GPIOPinConfigure(GPIO_PA1_U0TX);

というコートがあったので、真似して

 ROM_GPIOPinConfigure(GPIO_PE4_U5RX);
 ROM_GPIOPinConfigure(GPIO_PE5_U5TX);

こんなコードをでっち上げて、初期化部(ROM_SysCtlPeripheralEnable() を呼んでいる後あたり)に挿入したら、動きました。

!!!考察というか愚痴

このことは、データシート(SPMS294D)の 
 Table 10-5. GPIO Pins With Non-Zero Reset Values
にしっかりと書いてありますが、せめてサンプルコードの該当箇所に UART を変更したときはこうしろ、とかコメント書いてよ.....

でも安かったから許す.....

'''追記:マニュアルに下記の記述がありました。'''

'''PC 上の専用ソフトをを使用して、デバイスのペリフェラルを簡単かつ直観的に設定する方法については、'''

http://www.ti.com/tool/lm4f_pinmux

'''の Stellaris® LM4F Pinmux Utility をご参照ください。このソフトによりGPIO の代替機能を正しく簡単に設定ができます。'''

だそうです...

たしかにコードがでてくるので、便利です。はじめっからこれ見ればよかったのね...orz

----
類似の記事
[[LM4F120 の DFU を使う]]