我知道有一個類似的帖子: Steps to make a LED blink from a C/C++ program?使用串行端口從C程序開啓或關閉LED的步驟?
但現在我工作的一個基於ARM的開發板,它似乎有一個,我可以用它來製作一個LED或關閉兩個串行端口。
基本上我認爲流程是,使一個引腳串聯「1」或打開,LED將打開,「0」使其關閉。
是否有一些C語言的參考代碼可以引用?
我知道有一個類似的帖子: Steps to make a LED blink from a C/C++ program?使用串行端口從C程序開啓或關閉LED的步驟?
但現在我工作的一個基於ARM的開發板,它似乎有一個,我可以用它來製作一個LED或關閉兩個串行端口。
基本上我認爲流程是,使一個引腳串聯「1」或打開,LED將打開,「0」使其關閉。
是否有一些C語言的參考代碼可以引用?
這恐怕會嚴重依賴於您使用的特定arm開發板的規格。
您需要找到特定於該板的文檔。
一般來說,電路板應該附帶一些電路板支持包(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服務器。
我以前做過這種編程。
你需要學習的串行端口連接 http://www.lammertbies.nl/comm/cable/RS-232.html http://www.beyondlogic.org/serial/serial.htm
,具有+ 5V,輸出-5V,我記不清楚了。不是每個引腳都需要。
我以前從不使用ARM,但我使用8位PIC控制器對其進行編程。我想你可以在網上找到很多例子。
控制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時鐘都已經設置好了!)
使用串口的接收或發射銷你不能做到這一點。爲此,您只需要控制串口的RTS或CTS引腳。 只需谷歌「訪問VC++代碼中的COM端口」,然後控制RTS和CTS狀態引腳來打開和關閉任何外部設備。
你有沒有這方面的運氣?你有沒有重新登錄檢查? – NoMoreZealots 2009-07-20 14:04:15