{{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 を使う]]