網頁

2014年6月11日 星期三

[Visual Studio 2012] Common controls 不見了

 

用 MFC 來寫一些對話盒, 執行一些簡單的動作, 是很方便的事. MFC 提供的一些 common control, 讓這些動作變得更簡單. 如果 common control 不能使用, 那根本是全殘了. 不知道為什麼發生這種事, 不過如果遇到, 可以參考以下的解決辦法.

image

解決的辦法是刪除 C:\Documents and Settings\[username]\Local Settings\Application Data\Microsoft\VisualStudio\11.0, 裡面的 .tbd 檔案.

不過, 這個說來簡單, 但是做起來會有一些小麻煩.

1. 找不到 Documents and Settings 這個目錄. 在 Windows 中, 這個目錄預設是隱藏的. 在控制台中, 選擇 外觀及個人化, 裡面的資料夾選項 : 取消隱藏保護的作業系統檔案, 並勾選顯示隱藏的檔案, 資料夾及磁碟機. 這樣就可以在 Windows 安裝的磁碟, 看到 Documents and Settings 的目錄了.

image

 

2. 打不開 Documents and Settings 這個目錄.

image

在 Documents and Settings 這個目錄上按右鍵, 以啟動資料夾選項, 切換到安全性的分頁

image

按進階, 以進入進階設定

image

按變更權限, 以變更存取權限

image

選擇 “Everyone” , 也就是被拒絕的那一個, 並按下編輯,把原本拒絕那一欄打勾的列出資料夾/讀取資料

image

然後按很多次套用和確定, 回到資料夾. 在到達目標資料夾前, 還會遇到幾次的拒絕存取, 用同樣的方法過關. 最後終於到達目的地.

 image

殺掉 2 個 .tbd 檔案, 以及 2 個 .dat 檔案. 重新開啟 Visual 2012, common control 回來了.

image

[EZ-USB FX3] Create new project


雖然 FX3 SDK 提供了很多 example, 但是當要進行自己的工作時, 還是會想要建一個自己的專案, 至少專案名稱是自己想要的.
不過, FX3 在這方面不太好操作, 自己 create 出來的專案, 完全不能用. 以下說明如何以手動的方式建立一個新的專案

建立專案資料夾

在 FX3 的範例目錄下, ex: C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\firmware\basic_examples, 建立一個新的資料夾, 資料夾名稱就是專案名稱. 在這個例子中是 CxTest
image

複製專案檔案

從一個已經存在的專案範本中, 複製專案內容. 以下是從 cyfxbulksrcsink 複製. 將 cyfxbulksrcsink 下的檔案, 都複製到 CxTest 的目錄.
image

重新命名專案檔案

將 cyfxbulksrcsink.c 重新命名成 CxTest.c
將 cyfxbulksrcsink.h 重新命名成 CxTest.h
將 cyfxbulkdscr.c 重新命名成 CxTestDscr.h
其他的檔案是每一個專案都有, 而且內容一樣的.

修改專案檔案內容

1. 修改 CxTest.c
將 #include "cyfxbulksrcsink.h" 修改為 #include "CxTest.h" 
2. 修改 CxTestDscr.c
將 #include "cyfxbulksrcsink.h" 修改為 #include "CxTest.h"
3. 修改 .project
將 cyfxbulksrcsink 全部取代成 CxTest
4. 修改 .cproject
將 cyfxbulksrcsink 全部取代成 CxTest

import 專案範例

在 File/Import/Existing Projects into Workspace
image
瀏覽至 C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\firmware\basic_examples\CxTest
image
然後就可以在 project explorer 中, 看到新增加的專案
image

2014年6月3日 星期二

[EZ-USB FX3] UART on Development Kit


從 Uart 印一些 message 作 debug 用, 是 firmware 常用的開發技巧. FX3 所附的範例中, 也有一些有印出 debug message, 不過, 實際上操作, Uart 卻是一片空白. 以下用一步一步的操作, 來確認 Uart 的問題.

1. 檢查 Uart 裝置.

現在很多電腦都沒有 Uart/RS232/COM port 這樣的介面, 取而代之的, 是 Uart-USB 的裝置很容易取得. 以下就使用 Uart-USB 來代替 UART 的輸出.
在控制台, 裝置管理員, 可以看到連接埠, 下圖中的 COM10, 就是我們要用的 Uart port.
image

2. 開啟 PC 端的終端機.

不管是用 Hyper Terminal, 或是其他隨便什麼軟體, Uart 都有一些設定要做, 不過很簡單.Port name (COM10), Speed/baud rate (115200), Data bits (8), Stop bits (1), Parity (None),Flow control (None )
image

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 也是可以的.
image

4. 開啟 USBDebug 範例. Build 完 project.

update 到 DVK 上, 嗯, 還是不 work.
image

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 ());