EMSWIN GUIBuilder移植到开发板

2024-03-01 15:38

本文主要是介绍EMSWIN GUIBuilder移植到开发板,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

广告
广告
推荐: 古清生:雪天摘橙美如画 令狐冲练易筋经是骗局?

公告:请您及时更换请请请您正在使用的模版将于2周后被下线,请您及时更换

×
何其有幸遇到懂你的人
加载中…

硬汉Eric2013的博客

【emWin实战教程V2.0】第6章 GUIBuilder5.32的使用方法

转载 2016-12-10 15:33:26
标签: fatfs freertos stemwin stm32 usb

完整65章+12章附件教程下载地址:

http://bbs.armfly.com/read.php?tid=19834



第6章        GUIBuilder5.32的使用方法

本小节主要带领大家学习GUIBuilder5.32的使用,很好的利用这个软件,能使得STemWin界面设计事半功倍。

 6.1 初学者重要提示

6.2  GUIBuilder5.32的使用步骤

6.3  emWin5.32模拟器上运行GUIBuilder5.32生成的代码

6.4  移植GUIBuilder5.32生成的代码到开发板

6.5  实验例程说明(RTOS)

6.6  实验例程说明(裸机)

6.7          总结

 

6.1  初学者重要提示

1、  模拟器使用的emWin是5.32版本,如果SEGGER官网以后有更高版本的推出,使用方法是一样的。另外,开发板用的STemWin版本也是5.32,如果STemWin有升级版发布,使用方法也是相同的。

2、​  模拟器的运行是采用的VC6.0精简版,大小仅16MB,支持XP系统,WIN7的32位和64位系统,WIN8和WIN10不支持,下载地址提供下:http://bbs.armfly.com/read.php?tid=10428。实际测试比较好用。默认情况下,本教程运行模拟器,全部用的是此软件。

如果用的是VS2013,参照这里的方法设置:http://bbs.armfly.com/read.php?tid=10656

3、 对于初学者来说,务必要掌握GUIBuilder的使用方法,以及将其生成的代码移植到模拟器和开发板的方法。具体用到的emWin功能会在后面的章节中逐一讲解,本章节主要是学习使用方法。

6.2   GUIBuilder5.32的使用步骤

首先需要大家按照第2章2.3.4小节的说明下载STemWin的软件包,其中GUIBuilder5.32位于路径:STM32Cube_FW_F4_V1.13.0\Middlewares\ST\STemWin\Software里面

6.2.1   第一步:建立一个对话框

1、  找到GUIBuilder后,打开这个软件,并按照如下方式建立一个对话框。

2、  修改对话框大小为800*480。

3、  下面设置对话框标题的字体,对齐方式,和显示的文本。首先,在建立的对话框上面右击鼠标,选择Set font。

弹出如下界面,并选择字体GUI_FONT_32B_ASCII,点击OK。

设置好字体以后再设置对齐方式,还是右击鼠标,选择Set text alignment,并选择居中。

配置完成后,上面的字体Framewin字体会居中显示,然后还是鼠标右击,选择Set title text,并更改Framewin为armfly,修改的地方在左下角:

设置好以后,对话框就算建立完毕。

6.2.2  第二步:在对话上面建立按钮

按钮的建立方法和上面的对话框是一样的。按钮上面的字体大小和显示内容,大家可以任意设置。按钮上的文本不支持对齐方式设置,默认是居中显示,这里是显示字符armfly,字体GUI_FONT_24B_ASCII,建立后的效果如下所示:

对于建立的按钮控件,用户可以任意拖动,并通过鼠标调整其大小,调整方法如下:先左击选中相应控件,会出现绿色的边框,在边框的地方拖动鼠标即可修改大小

6.2.3  第三步:在对话框上面建立滚动条

同样的方法,添加滚动条后的效果如下所示:

6.2.4  第四步:在对话框上面建立滑动条

同样的方法,添加滑动条后显示效果如下:

6.2.5  第五步:建立好后点击File->save

保存方法如下:

保存后生成的文件在GUIBuilder5.32软件所在的文件夹里面:

6.3  emWin5.32模拟器上运行GUIBuilder5.32生成的代码

这里为大家讲解emWin5.32上面运行GUIBuilder5.32所生成代码的方法。另外,很多没有用过VC6.0的初学者不知道怎么使用,这里就简单的啰嗦下。

首先,按照第2章的2.3.3小节所讲述的方法,将模拟器下载下来,然后解压模拟器软件包,VC6.0要打开的工程文件名是如下这个文件(先将VC6.0打开,然后将这个文件拖动到VC6.0上即可):

VC6.0打开emWin5.32模拟器后,左侧栏是这样的:

展开上面截图的‘+’后就可以看到:

然后再展开Application文件分组:

这里打开GUIDEMO_Start.c,将此文件里面的内容全部删掉,然后将本章节6.2.5小节里面生成的FramewinDLG.c文件里的所有内容复制到GUIDEMO_Start.c文件里,仅这样程序还是不能够运行的,需要在GUIDEMO_Start.c文件的内容末尾再加入如下代码就可以运行了。

void MainTask(void)

{

WM_SetCreateFlags(WM_CF_MEMDEV);

 

   

GUI_Init();

 

CreateFramewin();

 

while(1)

{

GUI_Delay(10);

}

}

GUIDEMO_Start.c文件中完整的内容如下:

 

// USER START (Optionally insertadditional includes)

// USER END

 

#include "DIALOG.h"

 

#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)

#define ID_BUTTON_0 (GUI_ID_USER + 0x01)

#define ID_SCROLLBAR_0 (GUI_ID_USER + 0x02)

#define ID_SLIDER_0 (GUI_ID_USER + 0x03)

 

 

// USER START (Optionally insertadditional defines)

// USER END

 

 

// USER START (Optionally insertadditional static data)

// USER END

 

static const GUI_WIDGET_CREATE_INFO_aDialogCreate[] = {

  {FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 800, 480,0, 0x64, 0 },

  {BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 130, 28, 147, 35, 0,0x0, 0 },

  {SCROLLBAR_CreateIndirect, "Scrollbar", ID_SCROLLBAR_0, 129, 74, 147,28, 0, 0x0, 0 },

  {SLIDER_CreateIndirect, "Slider", ID_SLIDER_0, 133, 118, 137, 25, 0,0x0, 0 },

  // USERSTART (Optionally insert additional widgets)

  // USEREND

};

 

 

// USER START (Optionally insertadditional static code)

// USER END

 

static void _cbDialog(WM_MESSAGE * pMsg) {

  WM_HWINhItem;

  int     NCode;

  int     Id;

 // USER START (Optionally insert additional variables)

 // USER END

 

  switch(pMsg->MsgId) {

  caseWM_INIT_DIALOG:

    //

   // Initialization of 'Framewin'

   //

    hItem =pMsg->hWin;

   FRAMEWIN_SetFont(hItem, GUI_FONT_32B_ASCII);

   FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);

   FRAMEWIN_SetText(hItem, "armfly");

   //

   // Initialization of 'Button'

   //

    hItem =WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);

   BUTTON_SetFont(hItem, GUI_FONT_24B_ASCII);

   BUTTON_SetText(hItem, "armfly");

    // USER START(Optionally insert additional code for further widget initialization)

   // USER END

    break;

  caseWM_NOTIFY_PARENT:

    Id    = WM_GetId(pMsg->hWinSrc);

    NCode =pMsg->Data.v;

   switch(Id) {

    caseID_BUTTON_0: // Notifications sent by 'Button'

     switch(NCode) {

      caseWM_NOTIFICATION_CLICKED:

       // USER START (Optionally insert code for reacting on notificationmessage)

       // USER END

       break;

      caseWM_NOTIFICATION_RELEASED:

        // USER START(Optionally insert code for reacting on notification message)

       // USER END

       break;

     // USER START (Optionally insert additional code for furthernotification handling)

     // USER END

      }

      break;

    caseID_SCROLLBAR_0: // Notifications sent by 'Scrollbar'

     switch(NCode) {

      caseWM_NOTIFICATION_CLICKED:

        // USER START(Optionally insert code for reacting on notification message)

       // USER END

        break;

      caseWM_NOTIFICATION_RELEASED:

       // USER START (Optionally insert code for reacting on notificationmessage)

       // USER END

       break;

      caseWM_NOTIFICATION_VALUE_CHANGED:

       // USER START (Optionally insert code for reacting on notificationmessage)

       // USER END

       break;

     // USER START (Optionally insert additional code for furthernotification handling)

     // USER END

      }

      break;

    caseID_SLIDER_0: // Notifications sent by 'Slider'

     switch(NCode) {

      caseWM_NOTIFICATION_CLICKED:

       // USER START (Optionally insert code for reacting on notificationmessage)

       // USER END

       break;

      caseWM_NOTIFICATION_RELEASED:

        // USER START(Optionally insert code for reacting on notification message)

       // USER END

       break;

      caseWM_NOTIFICATION_VALUE_CHANGED:

       // USER START (Optionally insert code for reacting on notificationmessage)

       // USER END

       break;

      // USER START(Optionally insert additional code for further notification handling)

     // USER END

     }

      break;

   // USER START (Optionally insert additional code for further Ids)

   // USER END

    }

    break;

 // USER START (Optionally insert additional message handling)

 // USER END

  default:

   WM_DefaultProc(pMsg);

    break;

  }

}

 

WM_HWIN CreateFramewin(void);

WM_HWIN CreateFramewin(void) {

  WM_HWINhWin;

 

  hWin =GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog,WM_HBKWIN, 0, 0);

  returnhWin;

}

 

 

void MainTask(void)

{

    

     WM_SetCreateFlags(WM_CF_MEMDEV);

 

    

     GUI_Init();

 

     CreateFramewin();

 

     while(1)

     {

         GUI_Delay(10);

     }

}

点击这里进行编译和运行:

实际显示效果如下:

此处初学者会有疑问,我们设置界面分辨率不是800*480吗,怎么显示的不全?这是因为默认的界面分辨率是320*240。第8章跟大家讲emWin模拟器的使用方法时,再详细讲解如何修改显示分辨率。

6.4  移植GUIBuilder5.32生成的代码到开发板

移植到模拟器跟移植到开发板上的方法是一样的,先将本章节6.2.5小节里面生成的FramewinDLG.c文件里的所有内容复制到MDK或者IAR工程模板的MainTask.c文件里(这里以带RTOS的emWin模板为例进行截图,裸机版本是一样的,也是这个文件):

仅这样程序还是不能够运行的,需要在MainTask.c文件的内容末尾再加入如下代码就可以运行了。

void MainTask(void)

{

WM_SetCreateFlags(WM_CF_MEMDEV);

 

   

GUI_Init();

 

CreateFramewin();

 

while(1)

{

GUI_Delay(10);

}

}

本章6.5小节和6.6小节讲解的实验例程都是用的这个代码,不过修改了注释使其更加规范并修改了MainTask函数,使emWin在STM32F429/439的运行性能发挥到最佳,修改后的代码如下:

void MainTask(void)

{

    

    

     GUI_Init();

    

    

     WM_MULTIBUF_Enable(1);

    

    

   //TOUCH_Calibration();

    

    

     CreateFramewin();

        

     while(1)

     {

         GUI_Delay(10);

     }

}

6.5  实验例程说明(RTOS)

配套例子:

V6-502_STemWin实验_GUIBuilder的使用(RTOS)

实验目的:

1.     学习GUIBuilder的使用。

2.     emWin功能的实现在MainTask.c文件里面。

实验内容:

1.     K1按键按下,串口打印任务执行情况(波特率115200,数据位8,奇偶校验位无,停止位1)。

2.     K2按键按下,实现截图功能,将图片以BMP格式保存到SD卡中。

3.     各个任务实现的功能如下:

              App Task Start   任务:实现按键和触摸扫描。

              App Task MspPro任务 :实现截图功能,将图片以BMP格式保存到SD卡中。

              App Task UserIF  任务:按键消息处理。

              App Task COM   任务:暂未使用。

App Task GUI    任务:GUI任务。

μCOS-III任务调试信息(按K1按键,串口打印):

STemWin界面显示效果:

800*480分辨率界面效果,小分辨率显示屏仅可以显示一部分。

STemWin动态内存配置:

GUIConf.c文件中的配置如下:

#define EX_SRAM  1

 

#if EX_SRAM

#define GUI_NUMBYTES  (1024*1024*8)

#else

#define GUI_NUMBYTES  (100*1024)

#endif

通过宏定义来配置使用内部SRAM还是外部的SDRAM做为emWin的动态内存,当配置:

#define EX_SRAM    1 表示使用外部SDRAM作为emWin动态内存,大小8MB。

#define EX_SRAM    0 表示使用内部SRAM作为emWin动态内存,大小100KB。

默认情况下,本教程配套的所有emWin例子都是用外部SDRAM作为emWin动态内存。

STemWin底层接口配置:

LCDConf_Lin_Template.c文件中共12项emWin配置:

#define emWin_Optimize   0

 

#define XSIZE_PHYS       800

#define YSIZE_PHYS       480

 

#define NUM_BUFFERS      3

#define NUM_VSCREENS     1

 

#define BK_COLOR         GUI_DARKBLUE

 

#undef GUI_NUM_LAYERS

#define GUI_NUM_LAYERS    1

 

#define LCD_LAYER0_FRAME_BUFFER  EXT_SDRAM_ADDR

#define LCD_LAYER1_FRAME_BUFFER  (LCD_LAYER0_FRAME_BUFFER + XSIZE_PHYS *YSIZE_PHYS * 4 * NUM_VSCREENS *

NUM_BUFFERS)

 

#define_CM_ARGB8888      1

#define _CM_RGB888        2

#define _CM_RGB565        3

#define _CM_ARGB1555      4

#define _CM_ARGB4444      5

#define _CM_L8            6

#define _CM_AL44          7

#define _CM_AL88          8

 

#define COLOR_MODE_0      _CM_RGB565

#define XSIZE_0           XSIZE_PHYS

#define YSIZE_0           YSIZE_PHYS

 

#define COLOR_MODE_1      _CM_RGB565

#define XSIZE_1           XSIZE_PHYS

#define YSIZE_1           YSIZE_PHYS

 

#if  (COLOR_MODE_0 == _CM_ARGB8888)

  #defineCOLOR_CONVERSION_0 GUICC_M8888I

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_32

#elif (COLOR_MODE_0 == _CM_RGB888)

  #defineCOLOR_CONVERSION_0 GUICC_M888

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_24

#elif (COLOR_MODE_0 == _CM_RGB565)

  #defineCOLOR_CONVERSION_0 GUICC_M565

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_16

#elif (COLOR_MODE_0 == _CM_ARGB1555)

  #defineCOLOR_CONVERSION_0 GUICC_M1555I

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_16

#elif (COLOR_MODE_0 == _CM_ARGB4444)

  #defineCOLOR_CONVERSION_0 GUICC_M4444I

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_16

#elif (COLOR_MODE_0 == _CM_L8)

  #defineCOLOR_CONVERSION_0 GUICC_8666

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_8

#elif (COLOR_MODE_0 == _CM_AL44)

  #defineCOLOR_CONVERSION_0 GUICC_1616I

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_8

#elif (COLOR_MODE_0 == _CM_AL88)

  #defineCOLOR_CONVERSION_0 GUICC_88666I

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_16

#else

  #errorIllegal color mode 0!

#endif

 

#if (GUI_NUM_LAYERS > 1)

 

#if  (COLOR_MODE_1 == _CM_ARGB8888)

  #defineCOLOR_CONVERSION_1 GUICC_M8888I

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_32

#elif (COLOR_MODE_1 == _CM_RGB888)

  #defineCOLOR_CONVERSION_1 GUICC_M888

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_24

#elif (COLOR_MODE_1 == _CM_RGB565)

  #defineCOLOR_CONVERSION_1 GUICC_M565

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_16

#elif (COLOR_MODE_1 == _CM_ARGB1555)

  #defineCOLOR_CONVERSION_1 GUICC_M1555I

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_16

#elif (COLOR_MODE_1 == _CM_ARGB4444)

  #defineCOLOR_CONVERSION_1 GUICC_M4444I

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_16

#elif (COLOR_MODE_1 == _CM_L8)

  #defineCOLOR_CONVERSION_1 GUICC_8666

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_8

#elif (COLOR_MODE_1 == _CM_AL44)

  #defineCOLOR_CONVERSION_1 GUICC_1616I

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_8

#elif (COLOR_MODE_1 == _CM_AL88)

  #defineCOLOR_CONVERSION_1 GUICC_88666I

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_16

#else

  #errorIllegal color mode 1!

#endif

 

#else

 

#undef XSIZE_0

#undef YSIZE_0

#define XSIZE_0       XSIZE_PHYS

#define YSIZE_0       YSIZE_PHYS

 

#endif

 

#ifndef  XSIZE_PHYS

  #errorPhysical X size of display is not defined!

#endif

#ifndef  YSIZE_PHYS

  #errorPhysical Y size of display is not defined!

#endif

#ifndef  NUM_VSCREENS

  #defineNUM_VSCREENS 1

#else

  #if(NUM_VSCREENS <= 0)

    #errorAt least one screeen needs to be defined!

  #endif

#endif

#if (NUM_VSCREENS > 1)&& (NUM_BUFFERS> 1)

  #errorVirtual screens and multiple buffers are not allowed!

#endif

对于这12个配置选项,注释说明已经比较详细。默认情况下,本教程配套的emWin例子都是用的三缓冲,RGB565格式,且仅使用单图层。

程序设计:

任务栈大小分配:

μCOS-III任务栈大小在os_cfg.h文件中配置:

#define  APP_CFG_TASK_START_STK_SIZE                     512u

#define  APP_CFG_TASK_MsgPro_STK_SIZE                    512u

#define  APP_CFG_TASK_COM_STK_SIZE                       512u

#define  APP_CFG_TASK_USER_IF_STK_SIZE                    512u

#define  APP_CFG_TASK_GUI_STK_SIZE                        1024u

任务栈大小的单位是4字节,那么每个任务的栈大小如下:

App Task Start   任务:2048字节。

       App Task MspPro任务 :2048字节。

       App Task UserIF  任务:2048字节。

       App Task COM   任务:2048字节。

App Task GUI    任务:4096字节。

系统栈大小分配:

μCOS-III的系统栈大小在os_cfg_app.h文件中配置:

#define  OS_CFG_ISR_STK_SIZE                      512u     

系统栈大小的单位是4字节,那么这里就是配置系统栈大小为2KB。

μCOS-III初始化:

int main(void)

{

   OS_ERR  err; 

    

    

   OSInit(&err); 

 

    

     OSTaskCreate((OS_TCB       *)&AppTaskStartTCB,             

                (CPU_CHAR     *)"App TaskStart", 

                (OS_TASK_PTR   )AppTaskStart,      

                (void         *)0,                 

                (OS_PRIO      )APP_CFG_TASK_START_PRIO,

                (CPU_STK     *)&AppTaskStartStk[0],     

                (CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE / 10,

                (CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE,     

                (OS_MSG_QTY    )0,  

                (OS_TICK       )0, 

                (void         *)0,   

                (OS_OPT       )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),

        

                     

                (OS_ERR       *)&err);

 

    

   OSStart(&err);                                              

   

   (void)&err;

   

    return(0);

}

硬件外设初始化

硬件外设的初始化是在bsp.c文件实现:

void bsp_Init(void)

{

    

    

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);

    

    

     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

    

     SystemCoreClockUpdate();   

 

     bsp_InitUart();       

     bsp_InitKey();        

    

     bsp_InitExtIO();       

     bsp_InitLed();       

    

     bsp_InitI2C();        

    

     bsp_InitExtSDRAM();   

     bsp_DetectLcdType();  

    

     TOUCH_InitHard();    

     LCD_ConfigLTDC();     

    

     result =f_mount(&fs, "0:/", 0);    

}

五个μCOS-III任务的实现:

static void  AppTaskStart (void *p_arg)

{

     OS_ERR      err;

     uint8_t  ucCount = 0;

     uint8_t  ucCount1 = 0;

    

       

   (void)p_arg; 

    

    

     CPU_Init(); 

     bsp_Init();      

     BSP_Tick_Init(); 

    

#if OS_CFG_STAT_TASK_EN > 0u

    OSStatTaskCPUUsageInit(&err);  

#endif

 

#ifdef CPU_CFG_INT_DIS_MEAS_EN

   CPU_IntDisMeasMaxCurReset();

#endif

        

    

     AppTaskCreate();

    

    

     AppObjCreate();

    

    while(1)

    {

        

         if(g_tTP.Enable== 1)

         {

              TOUCH_Scan();

             

             

              ucCount++;

              if(ucCount== 10)

              {

                   ucCount= 0;

                   bsp_KeyScan();

              }

             OSTimeDly(1, OS_OPT_TIME_DLY,& err);          

         }

        

        

         if(g_GT811.Enable== 1)

         {

              bsp_KeyScan();

              ucCount1++;

              if(ucCount1== 2)

              {

                   ucCount1= 0;

                   GT811_OnePiontScan();

              }

             OSTimeDly(10, OS_OPT_TIME_DLY,& err);     

         }

        

        

         if(g_tFT5X06.Enable== 1)

         {

              bsp_KeyScan();

              FT5X06_OnePiontScan();

             OSTimeDly(10, OS_OPT_TIME_DLY, &err);

         }

    }    

}

 

static void AppTaskMsgPro(void *p_arg)

{

     uint32_tulStart, ulEnd;

     OS_ERR      err;

     uint8_t       Pic_Name = 0;

     charbuf[20];

 

     (void)p_arg;

          

     while(1)

     {   

          

         OSSemPend((OS_SEM*)&SEM_SYNCH,

                     (OS_TICK )0,

                     (OS_OPT )OS_OPT_PEND_BLOCKING,

                     (CPU_TS )0,

                     (OS_ERR *)&err);

        

         if(err== OS_ERR_NONE)

         {   

              sprintf(buf,"0:/PicSave/%d.bmp",Pic_Name);

             

             

              ulStart= OSTimeGet(&err);

             

             

              OSSchedLock(&err);

             

             

              result= f_mkdir("0:/PicSave");

             

             

              result= f_open(&file,buf, FA_WRITE|FA_CREATE_ALWAYS);

             

             

              GUI_BMP_Serialize(_WriteByte2File,&file);

             

             

             result = f_close(&file);

             

             

              OSSchedUnlock(&err);

             

             

              ulEnd= OSTimeGet(&err);

              ulEnd-= ulStart;

             

              App_Printf("截图完成,耗时 = %dms\r\n", ulEnd);

              Pic_Name++;      

         }                                                                                                                  

     }  

}

 

static void AppTaskUserIF(void *p_arg)

{

     OS_ERR      err;

     uint8_t  ucKeyCode;

    

     (void)p_arg;               

    

 

     while(1)

     {       

         ucKeyCode= bsp_GetKey();

        

         if(ucKeyCode != KEY_NONE)

         {

              switch(ucKeyCode)

              {

                   caseKEY_DOWN_K1:            

                       DispTaskInfo();        

                       break;

                  

                   caseKEY_DOWN_K2:            

                       OSSemPost((OS_SEM*)&SEM_SYNCH,

                                  (OS_OPT )OS_OPT_POST_1,

                                  (OS_ERR *)&err); 

                       break;

                  

                   default:                     

                       break;

              }

         }

        

         OSTimeDly(20,OS_OPT_TIME_DLY, &err);

     }

}

 

static void AppTaskCOM(void *p_arg)

{

     OS_ERR  err;      

    

     (void)p_arg;

    

     while(1)

     {   

         OSTimeDly(500, OS_OPT_TIME_DLY, &err);

     }                                                                                                

}

 

static void AppTaskGUI(void *p_arg)

{

   (void)p_arg;      

        

     while(1)

     {

         MainTask();

     }

}

emWin任务的具体实现(在MainTask.c文件里面):

#include "MainTask.h"

 

 

 

#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)

#define ID_BUTTON_0 (GUI_ID_USER + 0x01)

#define ID_SCROLLBAR_0 (GUI_ID_USER + 0x02)

#define ID_SLIDER_0 (GUI_ID_USER + 0x03)

 

 

static const GUI_WIDGET_CREATE_INFO_aDialogCreate[] = {

  {FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 800, 480,0, 0x64, 0 },

  {BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 130, 28, 147, 35, 0,0x0, 0 },

  {SCROLLBAR_CreateIndirect, "Scrollbar", ID_SCROLLBAR_0, 129, 74, 147,28, 0, 0x0, 0 },

  {SLIDER_CreateIndirect, "Slider", ID_SLIDER_0, 133, 118, 137, 25, 0,0x0, 0 },

};

 

static void _cbDialog(WM_MESSAGE * pMsg)

{

     WM_HWINhItem;

     int     NCode;

     int     Id;

 

 

     switch(pMsg->MsgId)

     {

         caseWM_INIT_DIALOG:

              //

              //初始化 'Framewin'

              //

              hItem= pMsg->hWin;

              FRAMEWIN_SetFont(hItem,GUI_FONT_32B_ASCII);

              FRAMEWIN_SetTextAlign(hItem,GUI_TA_HCENTER | GUI_TA_VCENTER);

              FRAMEWIN_SetText(hItem,"armfly");

        

              //

              //初始化 'Button'

              //

              hItem= WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);

              BUTTON_SetFont(hItem,GUI_FONT_24B_ASCII);

              BUTTON_SetText(hItem,"armfly");

              break;

        

         caseWM_NOTIFY_PARENT:

              Id    = WM_GetId(pMsg->hWinSrc);

              NCode= pMsg->Data.v;

              switch(Id)

              {

                   caseID_BUTTON_0:

                       switch(NCode)

                       {

                            caseWM_NOTIFICATION_CLICKED:

                                 break;

                           

                            caseWM_NOTIFICATION_RELEASED:

                                 break;

                       }

                       break;

                  

                   caseID_SCROLLBAR_0:

                       switch(NCode)

                       {

                            caseWM_NOTIFICATION_CLICKED:

                                 break;

                           

                            caseWM_NOTIFICATION_RELEASED:

                                 break;

                           

                            caseWM_NOTIFICATION_VALUE_CHANGED:

                                 break;

                       }

                        break;

                  

                   caseID_SLIDER_0:

                       switch(NCode)

                       {

                            caseWM_NOTIFICATION_CLICKED:

                                 break;

                           

                            caseWM_NOTIFICATION_RELEASED:

                                 break;

                           

                            caseWM_NOTIFICATION_VALUE_CHANGED:

                                 break;

                       }

                       break;

              }

              break;

             

         default:

              WM_DefaultProc(pMsg);

              break;

     }

}

 

WM_HWIN CreateFramewin(void)

{

     WM_HWINhWin;

 

     hWin =GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog,WM_HBKWIN, 0, 0);

     returnhWin;

}

 

 

void MainTask(void)

{

    

    

     GUI_Init();

    

    

     WM_MULTIBUF_Enable(1);

    

    

   //TOUCH_Calibration();

    

    

     CreateFramewin();

        

     while(1)

     {

         GUI_Delay(10);

     }

}

6.6  实验例程说明(裸机)

配套例子:

V6-503_STemWin实验_GUIBuilder的使用(裸机)

实验目的:

1.     学习GUIBuilder的使用。

2.     emWin功能的实现在MainTask.c文件里面。

STemWin界面显示效果:

800*480分辨率界面效果,小分辨率显示屏仅可以显示一部分。

STemWin动态内存配置:

GUIConf.c文件中的配置如下:

#define EX_SRAM  1

 

#if EX_SRAM

#define GUI_NUMBYTES  (1024*1024*8)

#else

#define GUI_NUMBYTES  (100*1024)

#endif

通过宏定义来配置使用内部SRAM还是外部的SDRAM做为emWin的动态内存,当配置:

#define EX_SRAM    1 表示使用外部SDRAM作为emWin动态内存,大小8MB。

#define EX_SRAM    0 表示使用内部SRAM作为emWin动态内存,大小100KB。

默认情况下,本教程配套的所有emWin例子都是用外部SDRAM作为emWin动态内存。

STemWin底层接口配置:

LCDConf_Lin_Template.c文件中共12项emWin配置:

#define emWin_Optimize   0

 

#define XSIZE_PHYS       800

#define YSIZE_PHYS       480

 

#define NUM_BUFFERS      3

#define NUM_VSCREENS     1

 

#define BK_COLOR        GUI_DARKBLUE

 

#undef GUI_NUM_LAYERS

#define GUI_NUM_LAYERS    1

 

#define LCD_LAYER0_FRAME_BUFFER  EXT_SDRAM_ADDR

#define LCD_LAYER1_FRAME_BUFFER  (LCD_LAYER0_FRAME_BUFFER + XSIZE_PHYS *YSIZE_PHYS * 4 * NUM_VSCREENS *

NUM_BUFFERS)

 

#define_CM_ARGB8888      1

#define _CM_RGB888        2

#define _CM_RGB565        3

#define _CM_ARGB1555      4

#define _CM_ARGB4444      5

#define _CM_L8            6

#define _CM_AL44          7

#define _CM_AL88          8

 

#define COLOR_MODE_0      _CM_RGB565

#define XSIZE_0           XSIZE_PHYS

#define YSIZE_0           YSIZE_PHYS

 

#define COLOR_MODE_1      _CM_RGB565

#define XSIZE_1           XSIZE_PHYS

#define YSIZE_1           YSIZE_PHYS

 

#if  (COLOR_MODE_0 == _CM_ARGB8888)

  #defineCOLOR_CONVERSION_0 GUICC_M8888I

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_32

#elif (COLOR_MODE_0 == _CM_RGB888)

  #defineCOLOR_CONVERSION_0 GUICC_M888

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_24

#elif (COLOR_MODE_0 == _CM_RGB565)

  #defineCOLOR_CONVERSION_0 GUICC_M565

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_16

#elif (COLOR_MODE_0 == _CM_ARGB1555)

  #defineCOLOR_CONVERSION_0 GUICC_M1555I

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_16

#elif (COLOR_MODE_0 == _CM_ARGB4444)

  #defineCOLOR_CONVERSION_0 GUICC_M4444I

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_16

#elif (COLOR_MODE_0 == _CM_L8)

  #defineCOLOR_CONVERSION_0 GUICC_8666

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_8

#elif (COLOR_MODE_0 == _CM_AL44)

  #defineCOLOR_CONVERSION_0 GUICC_1616I

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_8

#elif (COLOR_MODE_0 == _CM_AL88)

  #defineCOLOR_CONVERSION_0 GUICC_88666I

  #defineDISPLAY_DRIVER_0   GUIDRV_LIN_16

#else

  #errorIllegal color mode 0!

#endif

 

#if (GUI_NUM_LAYERS > 1)

 

#if  (COLOR_MODE_1 == _CM_ARGB8888)

  #defineCOLOR_CONVERSION_1 GUICC_M8888I

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_32

#elif (COLOR_MODE_1 == _CM_RGB888)

  #defineCOLOR_CONVERSION_1 GUICC_M888

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_24

#elif (COLOR_MODE_1 == _CM_RGB565)

  #defineCOLOR_CONVERSION_1 GUICC_M565

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_16

#elif (COLOR_MODE_1 == _CM_ARGB1555)

  #defineCOLOR_CONVERSION_1 GUICC_M1555I

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_16

#elif (COLOR_MODE_1 == _CM_ARGB4444)

  #defineCOLOR_CONVERSION_1 GUICC_M4444I

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_16

#elif (COLOR_MODE_1 == _CM_L8)

  #defineCOLOR_CONVERSION_1 GUICC_8666

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_8

#elif (COLOR_MODE_1 == _CM_AL44)

  #defineCOLOR_CONVERSION_1 GUICC_1616I

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_8

#elif (COLOR_MODE_1 == _CM_AL88)

  #defineCOLOR_CONVERSION_1 GUICC_88666I

  #defineDISPLAY_DRIVER_1   GUIDRV_LIN_16

#else

  #errorIllegal color mode 1!

#endif

 

#else

 

#undef XSIZE_0

#undef YSIZE_0

#define XSIZE_0       XSIZE_PHYS

#define YSIZE_0       YSIZE_PHYS

 

#endif

 

#ifndef  XSIZE_PHYS

  #errorPhysical X size of display is not defined!

#endif

#ifndef   YSIZE_PHYS

  #errorPhysical Y size of display is not defined!

#endif

#ifndef  NUM_VSCREENS

  #defineNUM_VSCREENS 1

#else

  #if(NUM_VSCREENS <= 0)

    #errorAt least one screeen needs to be defined!

  #endif

#endif

#if (NUM_VSCREENS > 1)&& (NUM_BUFFERS> 1)

  #errorVirtual screens and multiple buffers are not allowed!

#endif

对于这12个配置选项,注释说明已经比较详细。默认情况下,本教程配套的emWin例子都是用的三缓冲,RGB565格式,且仅使用单图层。

程序设计:

栈大小分配:

系统栈大小在startup_stm32f429_439xx.s文件中配置:

栈大小的单位是字节,那么这里配置的系统栈大小就是8192字节。

主函数初始化:

int main (void)

{   

    

     bsp_Init();

 

    

     MainTask();

}

硬件外设初始化

硬件外设的初始化是在bsp.c文件实现:

void bsp_Init(void)

{

    

    

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);

    

    

     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

    

     SystemCoreClockUpdate();   

 

     bsp_InitUart();       

     bsp_InitKey();        

    

     bsp_InitExtIO();       

     bsp_InitLed();       

    

     bsp_InitI2C();        

    

     bsp_InitExtSDRAM();   

     bsp_DetectLcdType();  

    

     TOUCH_InitHard();    

     LCD_ConfigLTDC();     

    

     result =f_mount(&fs, "0:/", 0);    

}

emWin功能的具体实现(在MainTask.c文件里面):

#include "MainTask.h"

 

 

 

#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)

#define ID_BUTTON_0 (GUI_ID_USER + 0x01)

#define ID_SCROLLBAR_0 (GUI_ID_USER + 0x02)

#define ID_SLIDER_0 (GUI_ID_USER + 0x03)

 

 

static const GUI_WIDGET_CREATE_INFO_aDialogCreate[] = {

  {FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 800, 480,0, 0x64, 0 },

  { BUTTON_CreateIndirect,"Button", ID_BUTTON_0, 130, 28, 147, 35, 0, 0x0, 0 },

  {SCROLLBAR_CreateIndirect, "Scrollbar", ID_SCROLLBAR_0, 129, 74, 147,28, 0, 0x0, 0 },

  {SLIDER_CreateIndirect, "Slider", ID_SLIDER_0, 133, 118, 137, 25, 0,0x0, 0 },

};

 

static void _cbDialog(WM_MESSAGE * pMsg)

{

     WM_HWINhItem;

     int     NCode;

     int     Id;

 

 

     switch(pMsg->MsgId)

     {

         caseWM_INIT_DIALOG:

              //

              // 初始化'Framewin'

              //

              hItem= pMsg->hWin;

              FRAMEWIN_SetFont(hItem,GUI_FONT_32B_ASCII);

              FRAMEWIN_SetTextAlign(hItem,GUI_TA_HCENTER | GUI_TA_VCENTER);

              FRAMEWIN_SetText(hItem,"armfly");

        

              //

              //初始化 'Button'

              //

              hItem= WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);

              BUTTON_SetFont(hItem,GUI_FONT_24B_ASCII);

              BUTTON_SetText(hItem,"armfly");

              break;

        

         caseWM_NOTIFY_PARENT:

              Id    = WM_GetId(pMsg->hWinSrc);

              NCode= pMsg->Data.v;

              switch(Id)

              {

                   caseID_BUTTON_0:

                       switch(NCode)

                       {

                            caseWM_NOTIFICATION_CLICKED:

                                 break;

                           

                            caseWM_NOTIFICATION_RELEASED:

                                 break;

                       }

                       break;

                  

                   caseID_SCROLLBAR_0:

                       switch(NCode)

                       {

                            caseWM_NOTIFICATION_CLICKED:

                                 break;

                           

                            caseWM_NOTIFICATION_RELEASED:

                                 break;

                           

                            caseWM_NOTIFICATION_VALUE_CHANGED:

                                 break;

                       }

                       break;

                  

                   caseID_SLIDER_0:

                       switch(NCode)

                       {

                            caseWM_NOTIFICATION_CLICKED:

                                 break;

                           

                            caseWM_NOTIFICATION_RELEASED:

                                 break;

                           

                            caseWM_NOTIFICATION_VALUE_CHANGED:

                                 break;

                       }

                       break;

              }

              break;

             

         default:

              WM_DefaultProc(pMsg);

              break;

     }

}

 

WM_HWIN CreateFramewin(void)

{

     WM_HWINhWin;

 

     hWin =GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog,WM_HBKWIN, 0, 0);

     returnhWin;

}

 

 

void MainTask(void)

{

    

    

     GUI_Init();

    

    

     WM_MULTIBUF_Enable(1);

    

    

   //TOUCH_Calibration();

    

    

     CreateFramewin();

        

     while(1)

     {

         GUI_Delay(500);

     }

}

6.7  总结

本章节为大家讲解了GUIBuilder的使用方法,以及将其移植到开发板和模拟器上的方法,初学者务必要多练习并将其掌握。

1
阅读 (253) 评论 (0) 收藏 (0) 转载 (0) 举报
分享
前一篇: 【emWin实战教程V2.0】第5章 em... 后一篇:【emWin实战教程V2.0】第7章 uC...

评论

重要提示:警惕虚假中奖信息
  • 灌水
  • 赞
  • 美好
  • 顶
  • 顶
  • 顶
  • 开心
  • 路过
0条评论 展开
发评论
    收起
    相关阅读

    没有找到相关文章...

    • 康斯坦丁 抛开贾跃亭!法拉第FF91能成功吗?

      抛开贾跃亭的因素不谈,你觉得FF91能成功吗。最开始知道法拉第FF91这款电动汽车的名字时,总感觉怪怪的——像是把法拉利的品牌名和保时捷最经典的车型911糅合在了一起……作为“PPT造车”的开创者,法拉第FF91从项目创立起,就始终伴随着争议...[详细]0张图

      2018-01-10 14:21:30
    • 老贤玉 改变情商管理

      改变自己的128种方法,教你如何变得更优秀情商欠费的10个表现,你中了几条?【45个高情商细节,你做到了哪些?】明明各方面条件相似,可别人却总更受欢迎?你可能要注意这些细节:不在背后妄议他人缺点;言语有分寸,涉及隐私切勿多问;和上司谈话时,把手机调至静音;每天都问候周围的人;与人有约时要提前几分钟到达【不管从事什么职业,你都要知道的影响世界的100个管理定律】管理定律是古往今来各大管理者在无数的实践过程中积累起来,留给后人的经验,是一笔非常宝贵的财富。在管理中,有了管理定律,有时候事情都会事半功倍。...[详细]0张图

      2017-12-19 14:53:01
    • 艾米1895电... 《寻梦环游记》火了,但这十部高分动画电影你也不该错...

      一|《辉夜姬物语》日本2013导演:高畑勋主演:朝仓亚纪/高良健吾/地井武男豆瓣评分:8.3向往返璞归真这件事,没有人比日本更擅长...[详细]0张图

      2017-12-15 15:24:27
    • yoyo 【学习随记】一次失败的语文单元考

      这周二接豆子,他说语文单元考试,作文没写完,差了将近六七行。我很诧异,怎么会差这么多,是什么样的作文题目呢,他说,写《要跟父母说的话》...[详细]0张图

      2017-12-16 08:49:53
    • SASAONE美... 浓妆艳抹的长腿美女小露香肩风情惹人爱

      浓妆艳抹的长腿美女小露香肩,精致锁骨性感撩人,乌黑的秀发随意搭在胸前,不经意间掩饰着那一片丰满的诱人之地。修长的美腿,腿型完美,圆润纤细,在高跟鞋的作用下,小腿显得格外的漂亮。浓妆艳抹的长腿美女小露香肩,精致锁骨性感撩人,乌黑的秀发随意搭在胸前,不经意间掩饰着那一片丰满的诱人之地。修长的美腿,腿型完美,圆润纤细,在高跟鞋的作用下,小腿显得格外的漂亮。浓妆艳抹的长腿美女小露香肩,精致锁骨性感撩人,乌黑的秀发随意搭在胸前,不经意间掩饰着那一片丰满的诱人之地。修长的美腿,腿型完美,圆润纤细,在高跟鞋的作用下,小腿显得格外的漂亮。搜索一下“ SASAONE”,精彩马上到来~!...[详细]0张图

      2017-12-17 14:38:22
    • 驾考宝典 紧急通知!今年起驾考或增两项目,除停车取卡外,还新...

      2018年1月1日起,驾考难度再提升,浙江杭州、衢州、绍兴等部分城市科目二考试中新增加——停车取卡项目。然而本以为新增一项已经够难了,福州却再出新政策:今年,福州市驾考科目或新增两个项目,分别是停车取卡和窄路掉头...[详细]0张图

      2018-01-04 19:35:49
    • 普门妙智 印光大师开示——念佛不可过猛,须按自己精神气力

      至于念佛,必须按自己之精神气力,而为大声,小声,默念,及金刚念(即有声,别人听不见者,持咒家谓之金刚念)之准则,何可过猛,以致受病...[详细]0张图

      2017-12-16 09:18:05
    • 宜昌市中心... 《将军在上》:关于保胎的那些事儿

      (非会员的小伙伴们,本文略含剧透,过敏者请绕行)最近,60集的热播网剧《将军在上》完美收官,辛苦追剧的小编终于可以歇一歇被诡异画风辣得流泪的双眼了...[详细]0张图

      2017-12-16 00:22:34
    • 江平企业 全国农业气象影响预报与评估

      今年秋播以来,北方冬麦区降水前多后少,气温偏低,前期阴雨天气导致黄淮西部、江淮等地秋播进度缓慢,弱苗比例较大;大部地区积温接近常年或偏少,导致冬小麦长势接近去年或偏差...[详细]0张图

      2017-12-22 10:00:48
    • 庐山木大叔 白色客厅的圣诞季装饰

      每年圣诞季来临之前,人们都会花点时间来准备圣诞节装饰。找出家里原有的一些灯光,圣诞树,礼物,花环等,希望能多少改变一点装饰风格,给传统的乡村小屋带来更多梦幻色彩...[详细]0张图

      2017-12-16 09:17:41
    加载中,请稍后
    硬汉Eric2013
    硬汉Eric2013
    加关注
    • 博客等级:
    • 博客积分:20积分
    • 博客访问:366,695
    • 关注人气:305
    • 荣誉徽章:

    相关博文

    • 看完这篇文章成iPhone摄影高手

      Derrick_Zhang_

    • 抛开贾跃亭!法拉第FF91能成功吗?

      康斯坦丁

    • 改变情商管理

      老贤玉

    • 《寻梦环游记》火了,但这十部高分动画电影你也不该错过。

      艾米1895电影街

    • 【学习随记】一次失败的语文单元考

      yoyo

    • 浓妆艳抹的长腿美女小露香肩风情惹人爱

      用户344349348

    • 紧急通知!今年起驾考或增两项目,除停车取卡外,还新增“窄路掉头”?

      驾考宝典

    • 印光大师开示——念佛不可过猛,须按自己精神气力

      普门妙智

    • 《将军在上》:关于保胎的那些事儿

      宜昌市中心人民医院

    • 全国农业气象影响预报与评估

      江平企业

    • 白色客厅的圣诞季装饰

      庐山木大叔

    查看更多

    推荐博文

    • 抛开贾跃亭!法拉第FF91能成

    • 为人维权,为何输给为狗维权?

    • “高铁扒门”事件,大家的炮口是

    • 女子拦堵高铁3分钟:更可怕的是

    • “投资不过山海关”你爱来不来讽

    • 北京房价下跌数月,一套房跌百万

    • 带你去平昌,看一看韩国冬奥会会

    • 上周,扎克伯格教了我,哈佛学生

    • 后版权时代的腾讯音乐、虾米与网

    • 程鹤麟:“家庭医生”不是“私人

    • 云中牧场卡子拉山

      云中牧场卡子拉山

    • 如何成为iPhone摄影高手

      如何成为iPhone摄影高手

    • 惊艳红海,蓝得像一场梦

      惊艳红海,蓝得像一场梦

    • 美女长的漂亮身材好还会搭配

      美女长的漂亮身材好还会.

    • 一封来自小樽的怀旧情书

      一封来自小樽的怀旧情书

    • 长白山下,有中国最后的木屋村落

      长白山下,有中国最后的.

    查看更多

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有

    X
    选择其他平台 >>
    分享到
    • 博客
    • 转载原文
    • 长微博
    • 含“”的博文
    • 含“”的博主
    • 含“”的音乐
    • 含“”的视频
    最近喜欢了的博主:
    加载中…
    幻灯播放
    分享到 X
    更多平台... (133)
    bShare
    提示
    ×
    换一个
    确定 取消

      这篇关于EMSWIN GUIBuilder移植到开发板的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



      http://www.chinasem.cn/article/762954

      相关文章

      FreeRTOS-基本介绍和移植STM32

      FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

      开发板NFS挂载文件目录

      文章目录 序NFS1. 安装 NFS 服务器和客户端在服务器上(NFS 服务器端)在客户端上(NFS 客户端) 2. 配置 NFS 服务器创建共享目录编辑 `/etc/exports` 文件启动 NFS 服务 3. 在客户端挂载 NFS 共享创建挂载点挂载 NFS 共享验证挂载 4. 设置开机自动挂载5. 解决权限问题 序 本节主要实现虚拟机(服务器)与开发板(客户端)通过N

      安卓开发板_联发科MTK开发评估套件串口调试

      串口调试 如果正在进行lk(little kernel ) 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。 1.选购适配器 常用的许多 USB 转串口的适配器,按芯片来分,有以下几种: CH340PL2303CP2104FT232 一般来说,采用 CH340 芯片的适配器,性能比较稳定,价

      RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

      目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.

      libmad音频解码库-Linux交叉编译移植

      下载并解压libmad-0.15.1b.tar.gz 下载链接:https://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz $tar -xvf libmad-0.15.1b.tar.gz$cd libmad-0.15.1b 1、先执行下面的命令:这条命令是为了适配高版本的gcc,因为高版本的gcc已经将-fforce-mem去除了:

      arm linux lua移植

      lua: lua home 1.下载lua源码 lua下载 lua-5.3.4.tar.gz 2.解压: tar xvf lua-5.3.4.tar.gz 3.修改makefile and luaconf.h $修改 lua-5.3.4/Makefile #INSTALL_TOP= /usr/local INSTALL_TOP= $(shell pwd)/out #修改安装目录(当前目录/o

      正点原子阿尔法ARM开发板-IMX6ULL(二)——介绍情况以及汇编

      文章目录 一、裸机开发(21个)二、嵌入式Linux驱动例程三、汇编3.1 处理器内部数据传输指令3.2 存储器访问指令3.3 压栈和出栈指令3.4 跳转指令3.5 算术运算指令3.6 逻辑运算指令 一、裸机开发(21个) 二、嵌入式Linux驱动例程 三、汇编 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编,因为 Cortex-A 芯片一

      s3c2440---PWM使用之蜂鸣器驱动移植

      一、蜂鸣器驱动介绍 1.1.什么是蜂鸣器               蜂鸣器是一种简单的声响发生器,常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音,一般使用交替电流产生声音会比较稳定。 1.2.蜂鸣器的类别 1.有源蜂鸣器 1)结构原理 有源蜂鸣器内部自带振荡源,只需接通电源即可发声。内部电路会自动产生一定频率的振荡信号,从而驱动蜂鸣器发声。

      龙芯L2K0300开发板综合测试

      CPU 查看cpu版本信息 cat /proc/cpuinfo 可以看到cpu是64位的LoongsonArch架构 stress压力测试结果 RAM 久久派板载512MB DDR4-2666内存,查看内存信息 cat /proc/meminfo 可以用memtester进行内存性能测试 memtester <size> <times> memtester测试结果

      实操在聆思CSK6大模型开发板的英文评测SDK中自定义添加单词、短语、句子资源

      引言 英文评测示例通过对用户语音输入的英文单词进行精准识别,提供 单词、短语、句子 三种类型,用户在选择好类型后,可根据屏幕上的提示进行语音输入,评测算法将对输入的英文语音进行精准识别,并对单词的发音、错读、漏读、多读等方面进行评估。 本文将详细介绍在聆思CSK6大模型语音视觉开发板上,如何替换英文评测示例中的单词、短语和句子,从而让您有更好的AI应用体验。 ·· 获取英文评测SDK 部