2009-07-19 37 views
1

我知道有一個類似的帖子: Steps to make a LED blink from a C/C++ program?使用串行端口從C程序開啓或關閉LED的步驟?

但現在我工作的一個基於ARM的開發板,它似乎有一個,我可以用它來製作一個LED或關閉兩個串行端口。

基本上我認爲流程是,使一個引腳串聯「1」或打開,LED將打開,「0」使其關閉。

是否有一些C語言的參考代碼可以引用?

+0

你有沒有這方面的運氣?你有沒有重新登錄檢查? – NoMoreZealots 2009-07-20 14:04:15

回答

2

這恐怕會嚴重依賴於您使用的特定arm開發板的規格。

您需要找到特定於該板的文檔。

4

一般來說,電路板應該附帶一些電路板支持包(BSP),它允許您控制內置的I/O。如果您確實想要使用硬件流量控制信號,請查找串行庫。

我建議在電路板上尋找一些GPIO(通用I/O或數字I/O),通常可以將它配置爲輸入或輸出。您應該能夠通過數字I/O線和接地引腳之間的限流電阻連接LED。確保您的LED正確導向,如果您將其反向連接,將阻止電流而不是照明。並且一如既往確保您在連接之前使用數字電壓表檢查它。

即使您沒有用於數字I/O的BSP,配置通常也非常簡單。 在寄存器中設置一位以啓用它,將位設置在另一個寄存器中以選擇輸入或輸出,它們通常將安排在8位「端口」中。某些系統允許您配置單獨的I/O引腳,其他系統只允許您配置整個端口以進行輸入或輸出。然後,您只需在寫入/輸出寄存器中向要控制的位寫入1或0。

ARM芯片通常有大量的建在周邊的今天,所以大部分主板將只是使I/O進行物理連接器在電路板上,您可能需要讀取芯片廠商的文檔查找寄存器內存地圖。更好的電路板供應商將提供文檔,庫(BSP)和示例。 Luminary Micro甚至提供內置以太網MAC和PHY的芯片,只需添加一個連接器和Magnetics,即可擁有1個芯片的Web服務器。

0

控制GPIO的首選方案是通過BSP。因爲這個BSP(板級支持包)可以幫助您將所有外設設置爲良好的默認值,並允許您調用某個功能。可能您選擇的BSP將具有向8位GPIO端口寫入字節的功能;你的LED只有一個位。在這種情況下,您的C代碼可能如下所示:(至少:它會在Luminary Micro套件上這樣工作)。(示例代碼;需要一些額外的工作才能使其編譯,特別是在您的工具包中)。

/* each LED is addressed by an address (byte) and a bit-within-this-byte */ 
struct { 
    address, // address of IO register for LED port 
    bit  // bit of LED 
} LEDConfigPair; 

struct LEDConfigPair LEDConfig[NUMBER_OF_LEDS] = { 
    {GPIO_PORTB_BASE,0}, // LED_0 is at port B0 
    {GPIO_PORTB_BASE,1}  // LED_1 is at port B1 
} ; 



/* function LED_init configures the GPIOs where LEDs are connected as output */ 
led_init(void) 
{ 
    U32 i; 
    for(i=0;i<NUMBER_OF_LEDS;i++) 
    { 
     GPIODirModeSet(LEDConfig[i][0], LEDConfig[i][1], GPIO_DIR_MODE_OUT); 
    } 
} 


/* my LED function 
    set_led_state makes use of the BSP of Luminary Micro to access a GPIO function 

    Implementation: this BSP requires setting 8 port wide IO, so the function will calculate a mask (

*/ 
set_led_state(U8 led,bool state) 
{ 
    U8 andmask; 
    U8 setmask; 

    andmask = ~(1 << LEDConfig[led].bit);// a bitmask with all 1's except bit of LED 

    if (true == state) 
    { 
     setmask = (1 << LEDConfig[led].bit); // set bit for LED 
    } else 
    { 
     setmask = 0; 
    } 
    GPIOPinWrite(LEDConfig[led].address, andmask, setmask); 
} 

當然這都是拼寫出來的;它可以在一個單一的線這樣進行:

#DEFINE SETLEDSTATE(led,state) GPIOPinWrite(LEDConfig[led].address, ~(1<<LEDConfig[led].bit),(state<<LEDConfig[led].bit)) 

這也將這樣做,但只有有道理當你能夢位掩碼,而您只需要切換一些LED調試真正的程序.. 。

替代方案:裸機。 在這種情況下,你需要爲自己設置一切。對於嵌入式系統,你需要了解引腳複用和電源管理(假設內存控制器和CPU時鐘都已經設置好了!)

  • 初始化:設置引腳複用這樣一種方式,功能要控件實際上映射到包上。
  • 初始化pheripheral的(在這種情況下,無論是UART,或在同一引腳上的GPIO功能)
0

使用串口的接收或發射銷你不能做到這一點。爲此,您只需要控制串口的RTS或CTS引腳。 只需谷歌「訪問VC++代碼中的COM端口」,然後控制RTS和CTS狀態引腳來打開和關閉任何外部設備。