日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]WINCE6.0 簡單LED驅(qū)動程序的編寫

把它寫成了實驗報告的樣子! 在此BLOG中的有些函數(shù)是針對特定的BSP, 比如:地址的映射函數(shù), 在每一個BSP中它的地址映射函數(shù)都不同, 但是都是地址映射(廢話當(dāng)然是地址映射了)。其實里面有很多的東西都還可以添加:比如添加讀取LED信息狀態(tài), 優(yōu)化地址映射(不必把全部的GPIO都映射, 可以自定義一個小的結(jié)構(gòu)體來實現(xiàn))。
一. 實驗?zāi)康?
a) 掌握流驅(qū)動的結(jié)構(gòu)
b) 掌握一般流驅(qū)動的編寫方法

二. 實驗設(shè)備
a) S3C6410 開發(fā)板一臺
b) PC 機一臺, VS2005, CE6.0 環(huán)境

三. 實驗內(nèi)容
a) 進行簡單 LED 驅(qū)動的編寫。

四. 實驗原理
a) 硬件原理圖
i.
ii.
iii. 從原理圖可以知道如果我們要點亮 LEDx , 只需要 GPMx 輸出高電平, 如果要熄滅 LEDx , 只需要 GPMx 輸出低電平即可。

b) 軟件原理設(shè)計
i. 由于在 WINCE 中使用都是虛擬的地址, 所以需要將實際的物理地址轉(zhuǎn)換為虛擬地址來使用。 在系統(tǒng)提供的 BSP 中提供了一個函數(shù)來實現(xiàn)從物理地址到虛擬地址的映射。
1. void *DrvLib_MapIoSpace (UINT32 PhysicalAddress , UINT32 NumberOfBytes , BOOL CacheEnable )
2. 把物理地址轉(zhuǎn)換為虛擬地址。(其實它就是在地址映射表中查找相應(yīng)的物理地址,然后返回對應(yīng)的虛擬地址加上它的偏移。)
3. UINT32 PhysicalAddress :要實現(xiàn)映射的物理地址的起始地址。
4. UINT32 NumberOfBytes : 要映射物理地址的長度。
5. BOOL CacheEnable :該物理地址是否使用了CACHE.( 具體參照地址映射表) 。
ii. LED 上下文結(jié)構(gòu)體的定義
1. 定義了一個 LED 驅(qū)動的上下文, 用來保存 LED 驅(qū)動的信息。 但是只是簡單的 LED 驅(qū)動, 沒有包含多的數(shù)據(jù)。
typedef struct
{
volatile S3C6410_GPIO_REG *pGPIOReg ;
}LED_PUBLIC_CONTEXT , *PLED_PUBLIC_CONTEXT ;
2 . S3C6410_GPIO_REG 是BSP 預(yù)先定義的一個GPIO 使用的數(shù)據(jù)結(jié)構(gòu)。
iii. GPIO 寄存器的使用。 GPIO 寄存器的地址都映射到了虛擬的地址上。 BSP 提供了一個結(jié)構(gòu)體方便 GPIO 寄存器的使用。
1. typedef struct
{ ……………..
UINT32 GPMCON; // 820
UINT32 GPMDAT; // 824
UINT32 GPMPUD; // 828
………………..
} S3C6410_GPIO_REG, *PS3C6410_GPIO_REG;
2. 在使用這個結(jié)構(gòu)全的時候把 GPIO 的虛擬地址的基地址映射到此結(jié)構(gòu)的開始即可以操作此結(jié)構(gòu)體的數(shù)據(jù)來操作實際的寄存器。
3. 進行GPIO 物理地址到虛擬地址的映射: pLedContext ->pGPIOReg = (volatile S3C6410_GPIO_REG *)DrvLib_MapIoSpace (S3C6410_BASE_REG_PA_GPIO , sizeof (S3C6410_GPIO_REG ), FALSE ) ;
iv. 實現(xiàn) LED 燈狀態(tài)的操作。
1. 獲得了 GPIO 的虛擬地址就可以像實際的物理地址那樣實現(xiàn)寄存器的操作。
2.
a) // 使能上拉
b) pLedContext ->pGPIOReg ->GPMPUD |= 0x0ff;
c) // 設(shè)置為輸出
d) pLedContext ->pGPIOReg ->GPMCON = 0x111111;
e) // 關(guān)閉所有的LED
f) LED_ALL_OFF (pLedContext ->pGPIOReg ->GPMDAT );
3. 為了方便進行操作,定義了一組宏。
// 打開或關(guān)閉LED0
#define LED0_ON (x ) (x |= 0x00000001)
#define LED0_OFF (x ) (x &= 0xfffffffe)
// 打開或關(guān)閉LED1
#define LED1_ON (x ) (x |= 0x00000002)
#define LED1_OFF (x ) (x &= 0xfffffffd)
// 打開或關(guān)閉LED2
#define LED2_ON (x ) (x |= 0x00000004)
#define LED2_OFF (x ) (x &= 0xfffffffb)
// 打開或關(guān)閉LED3
#define LED3_ON (x ) (x |= 0x00000008)
#define LED3_OFF (x ) (x &= 0xfffffff7)
// 打開或關(guān)閉所有的LED
#define LED_ALL_ON (x ) (x |= 0x0000000f)
#define LED_ALL_OFF (x ) (x &= 0xfffffff0)
五. 實驗步驟
a) Xxx_Init 函數(shù)的原型:
i. DWORD XXX_Init( LPCTSTR pContext , DWORD dwBusContext );
ii. pContext: Pointer to a string containing the registry path to the active key for the stream interface driver.
iii. lpvBusContext: Potentially process-mapped pointer passed as the fourth parameter to ActivateDeviceEx . If this driver was loaded through legacy mechanisms, then dwBusContext is zero. This pointer, if used, has only been mapped again as it passes through the protected server library (PSL). The XXX _Init function is responsible for performing all protection checking
iv. 返回值 : Returns a handle to the device context created if successful. Returns zero if not successful. This handle is passed to the XXX_Open (Device Manager) , XXX_PowerDown (Device Manager) , XXX_PowerUp (Device Manager) , and XXX_Deinit (Device Manager) functions
v. 注意:當(dāng)調(diào)用 設(shè)備管理程序當(dāng)調(diào)用 ActivateDeviceEx 函數(shù)的時候會間接調(diào)用到此函數(shù), ActivateDeviceEx 的作用就是加載設(shè)備
vi. LED_Init 函數(shù)的編寫。 LED_Init 最主要的功能就是進行硬件的初使化。
vii. LED_Init 函數(shù)的實現(xiàn):
DWORD Led_Init (LPCTSTR pContext )
{
volatile PLED_PUBLIC_CONTEXT pLedContext ;

RETAILMSG (DEBUG_LED ,(TEXT ("Led_Init Function!/n" )));

// 申請LED 的CONTEXT
pLedContext = (PLED_PUBLIC_CONTEXT )LocalAlloc (LPTR , sizeof (pContext ));
if (!pLedContext )
{
RETAILMSG (DEBUG_LED , (TEXT ("Can't alloc memory for led context!/n" )));
return NULL ;
}

// 得到GPIO 寄存器的地址
pLedContext ->pGPIOReg = (volatile S3C6410_GPIO_REG *)DrvLib_MapIoSpace (S3C6410_BASE_REG_PA_GPIO , sizeof (S3C6410_GPIO_REG ), FALSE );
if (pLedContext ->pGPIOReg == NULL )
{
RETAILMSG (DEBUG_LED , (TEXT ("LED for pGPIORges: DrvLib_MapIoSpace failed!/n" )));
LocalFree (pLedContext );
return NULL ;
}

// 使能上拉
pLedContext ->pGPIOReg ->GPMPUD |= 0x0ff;
// 設(shè)置為輸出
pLedContext ->pGPIOReg ->GPMCON = 0x111111;
// 關(guān)閉所有的LED
LED_ALL_OFF (pLedContext ->pGPIOReg ->GPMDAT );
RETAILMSG (DEBUG_LED , (TEXT ("Led0 on! %d!/n" ), (pLedContext ->pGPIOReg ->GPMDAT )));

return pLedContext ;
` }
a) Xxx_Write 函數(shù)原型:
DWORD XXX_Write(DWORD
hOpenContext
, LPCVOID
pBuffer
, DWORD
Count
);


i. hOpenContext : Handle to the open context of the device. The call to the XXX_Open (Device Manager) function returns this identifier 。
ii. pBuffer : Pointer to the buffer that contains the data to write.
iii. Count: Number of bytes to write from the pBuffer buffer into the device.
iv. 返回值: The number of bytes written indicates success. A value of –1 indicates failure.
v. LED_Write 函數(shù)的作用只是進行對 LED 狀態(tài)的寫入。
自定義結(jié)構(gòu)體:
typedef struct
{
unsigned char cLedNum ;
unsigned char fLedStatue ;
}LED_DATA , *PLED_DATA ;
cLedNum :LED 的標號。0 對應(yīng)第一個LED, 1 對應(yīng)第2 個LED … 4 表示全部熄滅(因為它只有4 個LED )
fLegStatue :將要實現(xiàn)的操作。 0 熄滅, 1 點亮。
vi. LED_Write 函數(shù)的實現(xiàn)。
DWORD Led_Write (DWORD hOpenContext ,
DWORD pBuffer ,
DWORD Count )
{
PLED_DATA pLedData = (PLED_DATA )pBuffer ;
RETAILMSG (DEBUG_LED , (TEXT ("Current hOpenContext %d /n" )), hOpenContext );
RETAILMSG (DEBUG_LED , (TEXT ("Corrent GPMDATA %d!/n" ), (((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT )));

switch (pLedData ->cLedNum )
{
case 0:
if (pLedData ->fLedStatue )
{
LED0_ON (((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT );
RETAILMSG (DEBUG_LED , (TEXT ("Led0 on! %d/n!" ), ((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT ));
}
else
{
LED0_OFF (((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT );
RETAILMSG (DEBUG_LED , (TEXT ("Led0 off!/n!" )));
}
break ;
case 1:
。。。。。。
break ;
case 2:
。。。。。。
break ;
case 3:
。。。。。。
case 4:
if (pLedData ->fLedStatue )
{ LED_ALL_ON (((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT );
}
else
{ LED_ALL_OFF (((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT );
}
default :
break ;
}

return (Count );
}

b) 其它流接口函數(shù)的編寫:其它的流接口函數(shù)并沒有實現(xiàn)函數(shù)過程, 它們一般就直接返回。在Led_Deinit 函數(shù)中進行了申請內(nèi)存的釋放,也調(diào)用了一個放棄映射的函數(shù)DrvLib_UnmapIoSpace , 其實這個函數(shù)在6.0 之中沒有作用, 它是直接返回結(jié)果的函數(shù)。
c) LED 的配置:
設(shè)備管理器要使用LED 流驅(qū)動的接口,就必須將LED 提供的接口函數(shù)導(dǎo)出。在Led.def 文件中添加如下代碼:
LIBRARY LED

EXPORTS Led_Init
Led_Deinit
Led_Open
Led_Close
Led_Read
Led_Write
Led_Seek
Led_PowerDown
Led_PowerUp
Led_IOControl

導(dǎo)出了LED 的接口函數(shù),要把Led.dll 添加到鏡像文件中去還要修改platform.bib 文件。

在 MODULES 節(jié)中添加代碼如圖:


最后修改注冊表 platform.reg :
HKEY_LOCAL_MACHINE/Drives/BuildIn 下添加注冊表項 LED( 任意名字都可 )
注冊表項中的內(nèi)容:

六. 實驗結(jié)果及分析
a) 按照上述步驟進行 LED 流驅(qū)動的編寫, 再編寫一個簡單的應(yīng)用程序即可進行 LED 燈的控制。

 

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉