好記心不如爛筆頭,為方便以后查看代碼及代碼重復利用,這里貼出S3C2440 Camera驅動代碼。使用友善MINI2440開發板,開發環境為RealView MDK 4.22。
原始工程下載地址:點擊打開鏈接
最初,本人在網上下載了許多mini2440 camera驅動的代碼,但結果都不盡人意,因為這些代碼看起來都比較晦澀難懂,都是直接對寄存器進行位與位或操作,且有的代碼排版布局很亂,對初學者來說難度較大。由于本人接觸了STM32開發后,覺得STM32的庫函數給初學者提供了很大幫助,僅僅通過函數名及變量名就能知道當前操作的是哪個寄存器,這樣在閱讀代碼時就能很容易明白代碼的含義了,增強了程序的可讀性。由此啟發,本人也仿照STM32庫函數的風格,寫了一個基于S3C2440 CAMIF的庫函數,這樣當以后自己回過頭來再看自己寫的代碼時就能很快理解代碼的含義,也能幫助其他學習2440 camera的初學者,讓他們能更容易理解代碼的思路。
結構體定義:
typedef struct
{
//SOURCE FORMAT REGISTER
u32 ITU601_656n;
u32 UVOffset;
u32 SourceHsize;
u32 Order422;
u32 SourceVsize;
//WINDOW OPTION REGISTER
u32 WinOfsEn;
u32 WinHorOfst;
u32 WinVerOfst;
//GLOBAL CONTROL REGISTER
u32 TestPattern;
u32 InvPolCAMPCLK;
u32 InvPolCAMVSYNC;
u32 InvPolCAMHREF;
}CAMIF_InitTypeDef;
typedef struct
{
//Y START ADDRESS REGISTER
u32 YStartAddr1;
u32 YStartAddr2;
u32 YStartAddr3;
u32 YStartAddr4;
//Cb START ADDRESS REGISTER
u32 CbStartAddr1;
u32 CbStartAddr2;
u32 CbStartAddr3;
u32 CbStartAddr4;
//Cr START ADDRESS REGISTER
u32 CrStartAddr1;
u32 CrStartAddr2;
u32 CrStartAddr3;
u32 CrStartAddr4;
//CODEC TARGET FORMAT REGISTER
u32 In422_Co;
u32 Out422_Co;
u32 TargetHsize_Co;
u32 FlipMd_Co;
u32 TargetVsize_Co;
//CODEC DMA CONTROL REGISTER
u32 Yburst1_Co;
u32 Yburst2_Co;
u32 Cburst1_Co;
u32 Cburst2_Co;
//CODEC PRE-SCALER CONTROL REGISTER
u32 SHfactor_Co;
u32 PreHorRatio_Co;
u32 PreVerRatio_Co;
u32 PreDstWidth_Co;
u32 PreDstHeight_Co;
//CODEC MAIN-SCALER CONTROL REGISTER
u32 ScalerBypass_Co;
u32 ScaleUpDown_Co;
u32 MainHorRatio_Co;
u32 MainVerRatio_Co;
//CODEC DMA TARGET AREA REGISTER
u32 TargetArea_Co;
}CAMIF_CodecInitTypeDef;
typedef struct
{
//RGB START ADDRESS REGISTER
u32 RGBStartAddr1;
u32 RGBStartAddr2;
u32 RGBStartAddr3;
u32 RGBStartAddr4;
//PREVIEW TARGET FORMAT REGISTER
u32 TargetHsize_Pr;
u32 FlipMd_Pr;
u32 TargetVsize_Pr;
//PREVIEW DMA CONTROL REGISTER
u32 RGBburst1_Pr;
u32 RGBburst2_Pr;
//PREVIEW PRE-SCALER CONTROL REGISTER
u32 SHfactor_Pr;
u32 PreHorRatio_Pr;
u32 PreVerRatio_Pr;
u32 PreDstWidth_Pr;
u32 PreDstHeight_Pr;
//PREVIEW MAIN-SCALER CONTROL REGISTER
u32 RGBformat_Pr;
u32 ScaleUpDown_Pr;
u32 MainHorRatio_Pr;
u32 MainVerRatio_Pr;
//PREVIEW DMA TARGET AREA REGISTER
u32 TargetArea_Pr;
}CAMIF_PreviewInitTypeDef;
CAMIF接口的配置(主要寄存器的配置):
void CAMIF_Config(unsigned int HorOfst, unsigned int VerOfst)
{
CAMIF_InitTypeDef CAMIF_InitStruct;
CAMIF_CodecInitTypeDef CAMIF_CoInitStruct;
CAMIF_PreviewInitTypeDef CAMIF_PrInitStruct;
unsigned int mainburst, remainburst;
unsigned int H_Shift, V_Shift;
unsigned int PreHorRatio, PreVerRatio;
unsigned int MainHorRatio, MainVerRatio;
unsigned int SRC_Width, SRC_Height;
unsigned int DST_Width, DST_Height;
/*********************** global parameters ****************************/
CAMIF_InitStruct.ITU601_656n = ITU_601;
CAMIF_InitStruct.UVOffset = UVOffest_0;
CAMIF_InitStruct.Order422 = Order_YCbYCr;
CAMIF_InitStruct.SourceHsize = CAM_XSIZE;
CAMIF_InitStruct.SourceVsize = CAM_YSIZE;
CAMIF_InitStruct.WinOfsEn = (HorOfst || VerOfst) ? 1 : 0;
CAMIF_InitStruct.WinHorOfst = HorOfst;
CAMIF_InitStruct.WinVerOfst = VerOfst;
CAMIF_InitStruct.TestPattern = Pattern_Normal;
CAMIF_InitStruct.InvPolCAMPCLK = ENABLE;
CAMIF_InitStruct.InvPolCAMHREF = DISABLE;
CAMIF_InitStruct.InvPolCAMVSYNC = DISABLE;
CAMIF_Init(&CAMIF_InitStruct);
/*********************** preview scaler parameters ********************/
CAMIF_PrInitStruct.RGBStartAddr1 = (u32)LCD_BUFFER;
CAMIF_PrInitStruct.RGBStartAddr2 = (u32)LCD_BUFFER;
CAMIF_PrInitStruct.RGBStartAddr3 = (u32)LCD_BUFFER;
CAMIF_PrInitStruct.RGBStartAddr4 = (u32)LCD_BUFFER;
CAMIF_PrInitStruct.RGBformat_Pr = RGBformat_16;
CAMIF_PrInitStruct.FlipMd_Pr = FlipMode_Xmirror;
CAMIF_PrInitStruct.TargetHsize_Pr = LCD_XSIZE;
CAMIF_PrInitStruct.TargetVsize_Pr = LCD_YSIZE;
CAMIF_PrInitStruct.TargetArea_Pr = LCD_XSIZE * LCD_YSIZE;
CalcBurstSize(LCD_XSIZE * 2, &mainburst, &remainburst);
CAMIF_PrInitStruct.RGBburst1_Pr = mainburst;
CAMIF_PrInitStruct.RGBburst2_Pr = remainburst;
SRC_Width = CAM_XSIZE - (2 * HorOfst);
SRC_Height = CAM_YSIZE - (2 * VerOfst);
DST_Width = LCD_XSIZE;
DST_Height = LCD_YSIZE;
CalcPrescaleParam(SRC_Width, DST_Width, &PreHorRatio, &H_Shift);
CalcPrescaleParam(SRC_Height, DST_Height, &PreVerRatio, &V_Shift);
CAMIF_PrInitStruct.SHfactor_Pr = 10 - H_Shift - V_Shift;
CAMIF_PrInitStruct.PreHorRatio_Pr = PreHorRatio;
CAMIF_PrInitStruct.PreVerRatio_Pr = PreVerRatio;
CAMIF_PrInitStruct.PreDstWidth_Pr = SRC_Width / PreHorRatio;
CAMIF_PrInitStruct.PreDstHeight_Pr = SRC_Height / PreVerRatio;
MainHorRatio=(SRC_Width << 8) / (DST_Width << H_Shift);
MainVerRatio=(SRC_Height << 8) / (DST_Height << V_Shift);
CAMIF_PrInitStruct.MainHorRatio_Pr = MainHorRatio;
CAMIF_PrInitStruct.MainVerRatio_Pr = MainVerRatio;
CAMIF_PrInitStruct.ScaleUpDown_Pr = (SRC_Width <= DST_Width) ? ScaleUp : ScaleDown;
CAMIF_PreviewInit(&CAMIF_PrInitStruct);
/******************* codec scaler parameters **************************/
CAMIF_CoInitStruct.YStartAddr1 = (u32)CaptureY_Buf;
CAMIF_CoInitStruct.YStartAddr2 = (u32)CaptureY_Buf;
CAMIF_CoInitStruct.YStartAddr3 = (u32)CaptureY_Buf;
CAMIF_CoInitStruct.YStartAddr4 = (u32)CaptureY_Buf;
CAMIF_CoInitStruct.CbStartAddr1 = (u32)CaptureCb_Buf;
CAMIF_CoInitStruct.CbStartAddr2 = (u32)CaptureCb_Buf;
CAMIF_CoInitStruct.CbStartAddr3 = (u32)CaptureCb_Buf;
CAMIF_CoInitStruct.CbStartAddr4 = (u32)CaptureCb_Buf;
CAMIF_CoInitStruct.CrStartAddr1 = (u32)CaptureCr_Buf;
CAMIF_CoInitStruct.CrStartAddr2 = (u32)CaptureCr_Buf;
CAMIF_CoInitStruct.CrStartAddr3 = (u32)CaptureCr_Buf;
CAMIF_CoInitStruct.CrStartAddr4 = (u32)CaptureCr_Buf;
CAMIF_CoInitStruct.In422_Co = YCbCr_422;
CAMIF_CoInitStruct.Out422_Co = YCbCr_422;
CAMIF_CoInitStruct.FlipMd_Co = FlipMode_Xmirror;
CAMIF_CoInitStruct.TargetHsize_Co = LCD_XSIZE;
CAMIF_CoInitStruct.TargetVsize_Co = LCD_YSIZE;
CAMIF_CoInitStruct.TargetArea_Co = LCD_XSIZE * LCD_YSIZE;
CalcBurstSize(LCD_XSIZE, &mainburst, &remainburst);
CAMIF_CoInitStruct.Yburst1_Co = mainburst;
CAMIF_CoInitStruct.Yburst2_Co = remainburst;
CalcBurstSize(LCD_YSIZE/2, &mainburst, &remainburst);
CAMIF_CoInitStruct.Cburst1_Co = mainburst;
CAMIF_CoInitStruct.Cburst2_Co = remainburst;
SRC_Width = CAM_XSIZE - (2 * HorOfst);
SRC_Height = CAM_YSIZE - (2 * VerOfst);
DST_Width = LCD_XSIZE;
DST_Height = LCD_YSIZE;
CalcPrescaleParam(SRC_Width, DST_Width, &PreHorRatio, &H_Shift);
CalcPrescaleParam(SRC_Height, DST_Height, &PreVerRatio, &V_Shift);
CAMIF_CoInitStruct.SHfactor_Co = 10 - H_Shift - V_Shift;
CAMIF_CoInitStruct.PreHorRatio_Co = PreHorRatio;
CAMIF_CoInitStruct.PreVerRatio_Co = PreVerRatio;
CAMIF_CoInitStruct.PreDstWidth_Co = SRC_Width / PreHorRatio;
CAMIF_CoInitStruct.PreDstHeight_Co = SRC_Height / PreVerRatio;
MainHorRatio=(SRC_Width << 8) / (DST_Width << H_Shift);
MainVerRatio=(SRC_Height << 8) / (DST_Height << V_Shift);
CAMIF_CoInitStruct.MainHorRatio_Co = MainHorRatio;
CAMIF_CoInitStruct.MainVerRatio_Co = MainVerRatio;
CAMIF_CoInitStruct.ScaleUpDown_Co = (SRC_Width <= DST_Width) ? ScaleUp : ScaleDown;
CAMIF_CoInitStruct.ScalerBypass_Co = DISABLE;
CAMIF_CodecInit(&CAMIF_CoInitStruct);
}
CAMIF_Init函數,實現對全局參數寄存器的配置:
void CAMIF_Init(CAMIF_InitTypeDef *pInitStruct)
{
//SOURCE FORMAT REGISTER
rCISRCFMT &= ~(0x1FFF << 0);
rCISRCFMT |= (pInitStruct->SourceVsize << 0);
rCISRCFMT &= ~(3 << 14);
rCISRCFMT |= (pInitStruct->Order422 << 14);
rCISRCFMT &= ~(0x1FFF << 16);
rCISRCFMT |= (pInitStruct->SourceHsize << 16);
rCISRCFMT &= ~(1 << 30);
rCISRCFMT |= (pInitStruct->UVOffset << 30);
rCISRCFMT &= ~(1 << 31);
rCISRCFMT |= (pInitStruct->ITU601_656n << 31);
//WINDOW OPTION REGISTER
rCIWDOFST &= ~(0x7FF << 0);
rCIWDOFST |= (pInitStruct->WinVerOfst << 0);
rCIWDOFST &= ~(0x7FF << 16);
rCIWDOFST |= (pInitStruct->WinHorOfst << 16);
rCIWDOFST &= ~(1 << 31);
rCIWDOFST |= (pInitStruct->WinOfsEn << 31);
//GLOBAL CONTROL REGISTER
rCIGCTRL &= ~(1 << 24);
rCIGCTRL |= (pInitStruct->InvPolCAMVSYNC << 24);
rCIGCTRL &= ~(1 << 25);
rCIGCTRL |= (pInitStruct->InvPolCAMHREF << 25);
rCIGCTRL &= ~(1 << 26);
rCIGCTRL |= (pInitStruct->InvPolCAMPCLK << 26);
rCIGCTRL &= ~(3 << 27);
rCIGCTRL |= (pInitStruct->TestPattern << 27);
rCIGCTRL |= (1 << 29);
}
CAMIF_PreviewInit函數,實現對Preview參數寄存器的配置:
void CAMIF_PreviewInit(CAMIF_PreviewInitTypeDef *pPreInitStruct)
{
//RGB START ADDRESS REGISTER
rCIPRCLRSA1 = pPreInitStruct->RGBStartAddr1;
rCIPRCLRSA2 = pPreInitStruct->RGBStartAddr2;
rCIPRCLRSA3 = pPreInitStruct->RGBStartAddr3;
rCIPRCLRSA4 = pPreInitStruct->RGBStartAddr4;
//PREVIEW TARGET FORMAT REGISTER
rCIPRTRGFMT &= ~(0x1FFF << 0);
rCIPRTRGFMT |= (pPreInitStruct->TargetVsize_Pr << 0);
rCIPRTRGFMT &= ~(3 << 14);
rCIPRTRGFMT |= (pPreInitStruct->FlipMd_Pr << 14);
rCIPRTRGFMT &= ~(0x1FFF << 16);
rCIPRTRGFMT |= (pPreInitStruct->TargetHsize_Pr << 16);
//PREVIEW DMA CONTROL REGISTER
rCIPRCTRL &= ~(1 << 2);
rCIPRCTRL &= ~(0x1F << 14);
rCIPRCTRL |= (pPreInitStruct->RGBburst2_Pr << 14);
rCIPRCTRL &= ~(0x1F << 19);
rCIPRCTRL |= (pPreInitStruct->RGBburst1_Pr << 19);
//PREVIEW PRE-SCALER CONTROL REGISTER
rCIPRSCPRERATIO &= ~(0x7F << 0);
rCIPRSCPRERATIO |= (pPreInitStruct->PreVerRatio_Pr << 0);
rCIPRSCPRERATIO &= ~(0x7F << 16);
rCIPRSCPRERATIO |= (pPreInitStruct->PreHorRatio_Pr << 16);
rCIPRSCPRERATIO &= ~(0xF << 28);
rCIPRSCPRERATIO |= (pPreInitStruct->SHfactor_Pr << 28);
rCIPRSCPREDST &= ~(0xFFF << 0);
rCIPRSCPREDST |= (pPreInitStruct->PreDstHeight_Pr << 0);
rCIPRSCPREDST &= ~(0xFFF << 16);
rCIPRSCPREDST |= (pPreInitStruct->PreDstWidth_Pr << 16);
//PREVIEW MAIN-SCALER CONTROL REGISTER
rCIPRSCCTRL &= ~(0x1FF << 0);
rCIPRSCCTRL |= (pPreInitStruct->MainVerRatio_Pr << 0);
rCIPRSCCTRL &= ~(1 << 15);
rCIPRSCCTRL &= ~(0x1FF << 16);
rCIPRSCCTRL |= (pPreInitStruct->MainHorRatio_Pr << 16);
rCIPRSCCTRL &= ~(3 << 28);
rCIPRSCCTRL |= (pPreInitStruct->ScaleUpDown_Pr << 28);
rCIPRSCCTRL &= ~(1 << 30);
rCIPRSCCTRL |= (pPreInitStruct->RGBformat_Pr << 30);
rCIPRSCCTRL |= (1 << 31);
//PREVIEW DMA TARGET AREA REGISTER
rCIPRTAREA = pPreInitStruct->TargetArea_Pr;
}
CAMIF_CodecInit函數,實現對Codec參數寄存器的配置:
void CAMIF_CodecInit(CAMIF_CodecInitTypeDef *pCoInitStruct)
{
//Y START ADDRESS REGISTER
rCICOYSA1 = (u32)pCoInitStruct->YStartAddr1;
rCICOYSA2 = (u32)pCoInitStruct->YStartAddr2;
rCICOYSA3 = (u32)pCoInitStruct->YStartAddr3;
rCICOYSA4 = (u32)pCoInitStruct->YStartAddr4;
//CB START ADDRESS REGISTER
rCICOCBSA1 = (u32)pCoInitStruct->CbStartAddr1;
rCICOCBSA2 = (u32)pCoInitStruct->CbStartAddr2;
rCICOCBSA3 = (u32)pCoInitStruct->CbStartAddr3;
rCICOCBSA4 = (u32)pCoInitStruct->CbStartAddr4;
//CR START ADDRESS REGISTER
rCICOCRSA1 = (u32)pCoInitStruct->CrStartAddr1;
rCICOCRSA2 = (u32)pCoInitStruct->CrStartAddr2;
rCICOCRSA3 = (u32)pCoInitStruct->CrStartAddr3;
rCICOCRSA4 = (u32)pCoInitStruct->CrStartAddr4;
//CODEC TARGET FORMAT REGISTER
rCICOTRGFMT &= ~(0x1FFF << 0);
rCICOTRGFMT |= (pCoInitStruct->TargetVsize_Co << 0);
rCICOTRGFMT &= ~(3 << 14);
rCICOTRGFMT |= (pCoInitStruct->FlipMd_Co << 14);
rCICOTRGFMT &= ~(0x1FFF << 16);
rCICOTRGFMT |= (pCoInitStruct->TargetHsize_Co << 16);
rCICOTRGFMT &= ~(1 << 30);
rCICOTRGFMT |= (pCoInitStruct->Out422_Co << 30);
rCICOTRGFMT &= ~(1 << 31);
rCICOTRGFMT |= (pCoInitStruct->In422_Co << 31);
//CODEC DMA CONTROL REGISTER
rCICOCTRL &= ~(1 << 2);
rCICOCTRL &= ~(0x1F << 4);
rCICOCTRL |= (pCoInitStruct->Cburst2_Co << 4);
rCICOCTRL &= ~(0x1F << 9);
rCICOCTRL |= (pCoInitStruct->Cburst1_Co << 9);
rCICOCTRL &= ~(0x1F << 14);
rCICOCTRL |= (pCoInitStruct->Yburst2_Co << 14);
rCICOCTRL &= ~(0x1F << 19);
rCICOCTRL |= (pCoInitStruct->Yburst1_Co << 19);
//CODEC PRE-SCALER CONTROL REGISTER
rCICOSCPRERATIO &= ~(0x7F << 0);
rCICOSCPRERATIO |= (pCoInitStruct->PreVerRatio_Co << 0);
rCICOSCPRERATIO &= ~(0x7F << 16);
rCICOSCPRERATIO |= (pCoInitStruct->PreHorRatio_Co << 16);
rCICOSCPRERATIO &= ~(0xF << 28);
rCICOSCPRERATIO |= (pCoInitStruct->SHfactor_Co << 28);
rCICOSCPREDST &= ~(0xFFF << 0);
rCICOSCPREDST |= (pCoInitStruct->PreDstHeight_Co << 0);
rCICOSCPREDST &= ~(0xFFF << 16);
rCICOSCPREDST |= (pCoInitStruct->PreDstWidth_Co << 16);
//CODEC MAIN-SCALER CONTROL REGISTER
rCICOSCCTRL &= ~(0x1FF << 0);
rCICOSCCTRL |= (pCoInitStruct->MainVerRatio_Co << 0);
rCICOSCCTRL &= ~(1 << 15);
rCICOSCCTRL &= ~(0x1FF << 16);
rCICOSCCTRL |= (pCoInitStruct->MainHorRatio_Co << 16);
rCICOSCCTRL &= ~(3 << 29);
rCICOSCCTRL |= (pCoInitStruct->ScaleUpDown_Co << 29);
rCICOSCCTRL &= ~(1 << 31);
rCICOSCCTRL |= (pCoInitStruct->ScalerBypass_Co << 31);
//CODEC DMA TARGET AREA REGISTER
rCICOTAREA = pCoInitStruct->TargetArea_Co;
}
開啟Preview:
void CAMIF_StartPreview(void)
{
rCIPRSCCTRL |= (1 << 15);
rCIIMGCPT |= (1 << 29);
rCIIMGCPT |= (1 << 31);
}
開啟Codec:
void CAMIF_StartCapture(void)
{
rCICOSCCTRL |= (1 << 15);
rCIIMGCPT |= (1 << 30);
rCIIMGCPT |= (1 << 31);
}
Camera sensor模塊初始化時調用順序:
void OV9650_Init(void)
{
CAMIF_Clock_Init();
CAMIF_GPIO_Config();
CAMIF_ResetIF();
CAMIF_ResetMoudle();
CAMIF_Config(0, 0);
SCCB_Init();
OV9650_CheckPID();
OV9650_Config();
CAMIF_StartPreview();
CAMIF_StartCapture();
}
執行到這里,你的LCD上就能顯示預覽的圖像了。關于更詳細的代碼,請下載源碼工程自行研究。
上一篇:STM32F429 CAN2通信
下一篇:S3C2440之UART驅動代碼模板(RealView MDK)
推薦閱讀
史海拾趣
創世公司(CS)的創立源于對未來技術趨勢的敏銳洞察。在5G、人工智能、物聯網等行業還未廣泛崛起的初期,創世公司就預見到這些技術將引領未來電子行業的發展。基于這種戰略眼光,創世公司決定專注于SD NAND存儲產品的研發和生產。這一決策不僅為公司的后續發展奠定了堅實的基礎,也展示了創始團隊對未來技術趨勢的堅定信心。
在電子行業中,不同客戶對電動工具的需求各異。Apex Tool Group深知這一點,因此提供了定制化服務,根據客戶的具體需求設計和生產電動工具。有一次,一家大型電子企業因為特殊生產工藝的需要,對電動工具提出了特殊要求。Apex Tool Group迅速響應,組織研發團隊進行攻關,最終成功研發出符合客戶需求的定制化產品。這一成功案例不僅展示了Apex Tool Group的技術實力,也進一步鞏固了與客戶的合作關系。
Corsair Memory Inc公司,由Don Lieberman、John Beekley與Andy Paul于1994年在美國加州佛利蒙創立。起初,公司專注于為英特爾系統生產Cache-On-A-Stick (COAST)模組。然而,隨著英特爾將快取內存由主板移至處理器晶體中,Corsair迅速調整戰略,將注意力轉向電腦內存市場。這一轉變不僅使Corsair避開了潛在的市場風險,更為其后續的內存業務奠定了堅實的基礎。
在電子行業中,技術創新是企業保持競爭力的關鍵。E-Switch公司深知這一點,因此不斷投入研發力量,尋求技術突破。近年來,公司在開關產品的智能化、小型化、高可靠性等方面取得了顯著成果,多項技術處于行業領先地位。這些技術突破不僅提升了產品的性能,也進一步鞏固了E-Switch在電子行業中的領先地位。
面對全球電子行業的激烈競爭,FINECHIPS公司意識到供應鏈優化的重要性。公司積極調整供應鏈策略,與全球領先的半導體制造商和原材料供應商建立長期穩定的合作關系,確保原材料的穩定供應和成本控制。同時,FINECHIPS還在全球范圍內設立生產基地和研發中心,實現本地化生產和快速響應市場需求,進一步提升了公司的全球競爭力。
在快速發展的過程中,Electronic-Bauteile Goerlitz GmbH公司非常重視企業文化和團隊建設。公司倡導以人為本的管理理念,注重員工的培養和發展。公司定期組織各種培訓和學習活動,提高員工的專業素質和工作能力;同時,公司還建立了完善的激勵機制和福利待遇體系,確保員工能夠全身心地投入到工作中。這些努力使得公司形成了一支高效、團結、富有創新精神的團隊,為公司的發展提供了堅實的保障。
請注意,以上故事均為模擬構建,旨在展示一個電子公司可能的發展過程和相關故事。如有需要,您可以根據具體情況進行調整和補充。
因為單位封了博客....所以只能在論壇記錄每天的工作內容了...初學水平大家見諒...主要目的是為了督促自己 使用LM3S8962 開發板 學習以太網的相關開發 8962集成了mac 和 phy 貌似沒有協議棧, 現在還沒看懂例程的lwip 所以索性先隨 ...… 查看全部問答∨ |
|
原來開發板給的是將物理串口0作為調試串口,現在我想把調試串口改為由串口1來做調試輸出,我的物理串口1需要使用別的通信,這個該怎么該啊,請教各位了。… 查看全部問答∨ |
三星s3c2410手冊上寫了支持3個串口,但是一般的bsp上帶的只有2個串口的驅動,系統調試過程中還需要占用其中一個串口。 小弟初學,不知道怎么驅動第三個串口? 現在三個串口都需要使用,需要將系統調試占用的串口也進行回收使用,不讓其作為調試信 ...… 查看全部問答∨ |
請回答時能加上哪張圖和標題,麻煩了謝謝。分不夠我在加。 [img=http://pic.wenwen.soso.com/p/20100615/20100615121134-105367426.jpg[/img]… 查看全部問答∨ |
|
我用EVC下載到PDA上時提示the arm unknown cpu does not support configuration test - win32( 我用EVC下載到PDA上時提示the arm unknown cpu does not support configuration test - win32(wce armv4)… 查看全部問答∨ |
為什么窗口函數放在含非主函數的.cpp文件下屬性頁就彈不出來?? 為什么創建屬性頁的WM_command函數(LPARAM CommandShowProp())放在主函數WINMAIN的.cpp文件 中可以用彈出屬性頁,把函數(LPARAM CommandShowProp())放在其他.cpp函數下屬性頁就彈不出來??… 查看全部問答∨ |