從 Uart 印一些 message 作 debug 用, 是 firmware 常用的開發技巧. FX3 所附的範例中, 也有一些有印出 debug message, 不過, 實際上操作, Uart 卻是一片空白. 以下用一步一步的操作, 來確認 Uart 的問題.
1. 檢查 Uart 裝置.
現在很多電腦都沒有 Uart/RS232/COM port 這樣的介面, 取而代之的, 是 Uart-USB 的裝置很容易取得. 以下就使用 Uart-USB 來代替 UART 的輸出.
在控制台, 裝置管理員, 可以看到連接埠, 下圖中的 COM10, 就是我們要用的 Uart port.
2. 開啟 PC 端的終端機.
不管是用 Hyper Terminal, 或是其他隨便什麼軟體, Uart 都有一些設定要做, 不過很簡單.Port name (COM10), Speed/baud rate (115200), Data bits (8), Stop bits (1), Parity (None),Flow control (None )
3. 設定 DVK ( developmen kit ) 上面的 jumper.
J101 1 and 2, GPIO_46=UART_RTS, J101 用來設定 GPIO 46 當作 UART_RTS
J102 1 and 2, GPIO_47=UART_CTS, J102 用來設定 GPIO 47 當作 UART_CTS
J103 1 and 2, GPIO_48=UART_TX, J103 用來設定 GPIO 48 當作 UART_TX
J104 1 and 2, GPIO_49=UART_RX, J104 用來設定 GPIO 49 當作 UART_RX 實際上, CTS/RTS 現在已經很少用到, 所以只跳 J103/J104 也是可以的.
4. 開啟 USBDebug 範例. Build 完 project.
update 到 DVK 上, 嗯, 還是不 work.
5. 修改 USBDebug 範例.
1. cyfxusbdebug.c 的 main()
UART 的 GPIO 的設定應該和以下的程式碼相同. 如果都沒有改過, 應該是一樣的.
/* No LPP or GPIO is being used. */
io_cfg.isDQ32Bit = CyFalse;
io_cfg.s0Mode = CY_U3P_SPORT_INACTIVE;
io_cfg.s1Mode = CY_U3P_SPORT_INACTIVE;
io_cfg.useUart = CyTrue;
io_cfg.useI2C = CyFalse;
io_cfg.useI2S = CyFalse;
io_cfg.useSpi = CyFalse;
io_cfg.lppMode = CY_U3P_IO_MATRIX_LPP_UART_ONLY;
/* No GPIOs are enabled. */
io_cfg.gpioSimpleEn[0] = 0;
io_cfg.gpioSimpleEn[1] = 0;
io_cfg.gpioComplexEn[0] = 0;
io_cfg.gpioComplexEn[1] = 0;
status = CyU3PDeviceConfigureIOMatrix (&io_cfg);
if (status != CY_U3P_SUCCESS)
{
goto handle_fatal_error;
} 以上是設定的 Uart 的 IO. 但是 UART 的 config 卻沒有設, 因此要加入一個 function CyFxDebugInit ()
2. 加入 CyFxDebugInit ()
/* This function initializes the debug module. The debug prints
* are routed to the UART and can be seen using a UART console
* running at 115200 baud rate. */
void CyFxDebugInit (void)
{
CyU3PUartConfig_t uartConfig;
CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS; /* Initialize the UART for printing debug messages */
apiRetStatus = CyU3PUartInit();
if (apiRetStatus != CY_U3P_SUCCESS)
{
/* Error handling */
CyFxAppErrorHandler(apiRetStatus);
} /* Set UART configuration */
CyU3PMemSet ((uint8_t *)&uartConfig, 0, sizeof (uartConfig));
uartConfig.baudRate = CY_U3P_UART_BAUDRATE_115200;
uartConfig.stopBit = CY_U3P_UART_ONE_STOP_BIT;
uartConfig.parity = CY_U3P_UART_NO_PARITY;
uartConfig.txEnable = CyTrue;
uartConfig.rxEnable = CyFalse;
uartConfig.flowCtrl = CyFalse;
uartConfig.isDma = CyTrue; apiRetStatus = CyU3PUartSetConfig (&uartConfig, NULL);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyFxAppErrorHandler(apiRetStatus);
} /* Set the UART transfer to a really large value. */
apiRetStatus = CyU3PUartTxSetBlockXfer (0xFFFFFFFF);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyFxAppErrorHandler(apiRetStatus);
} /* Initialize the debug module. */
apiRetStatus = CyU3PDebugInit (CY_U3P_LPP_SOCKET_UART_CONS, 8);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyFxAppErrorHandler(apiRetStatus);
} CyU3PDebugPreamble (CyFalse); }
3. 呼叫 CyFxDebugInit()
在 ApplnThread_Entry() 中, 呼叫 CyFxDebugInit ()
/* Entry function for the AppThread. */
void
ApplnThread_Entry ( uint32_t input)
{
CyFxDebugInit(); /* Initialize the logger application */
CyFxApplnInit(); for (;;)
{
CyU3PThreadSleep (1000);
if (glIsApplnActive)
{
CyU3PDebugPrint (2, "USB Debug logger: time from start in ticks: %d\n", CyU3PGetTime ());
} CyU3PDebugPrint (2, "USB Debug Hello: %d\n", CyU3PGetTime ());
}
} 到這邊應該就可以在 PC 上看到 debug message 了, 不過, 還有一些地方要注意
Note
1. FX3 的 Uart 不會立刻顯示. 大約要幾秒鐘之後, PC 上才會開始看到字. 並不是 delay, 而是 Uart 要過幾秒鐘才有作用. 2. 文字偏移, 沒有回到左邊界. 如果 PC 的軟體沒有自動把“\n” 取代成 “\r\n” 就會造成文字一直偏移. 這時可以自己加. 例如 :
CyU3PDebugPrint (2, "USB Debug Hello: %d\n", CyU3PGetTime ()); 改成
CyU3PDebugPrint (2, "USB Debug Hello: %d\r\n", CyU3PGetTime ());