STM 32 F 407にemwinを移植



STM 32 F 407にemwinを移植
このブログのリンク:http://blog.csdn.net/jdh99,作者:jdh,転載は明記してください.
環境:
ホスト:WIN 8
開発環境:MDK 5.13
Emwinバージョン:STemWinLibrary 522
mcu: stm32f407VGT6
開発ボード:アンフレーSTM 32-X 3
TFT型番:艾藍2.8寸TFT、主制御チップ:ILI 9325
説明:
STM 32 F 407にemwinを移植し、駆動画面インタフェースはFSMC
移行手順:
1.MDK新規ファイル構造:
2.GUIConf.cファイルの変更
a)マクロ定義を追加する:
#define GUI_NUMBYTES  (1024 * 80)
#define GUI_BLOCKSIZE 0x80

  b)GUI_X_Config(void)関数に文を追加します.
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);

    :

/*********************************************************************
*
*       GUI_X_Config
*
* Purpose:
*   Called during the initialization process in order to set up the
*   available memory for the GUI.
*/
void GUI_X_Config(void) {
  //
  // 32 bit aligned memory area
  //
  static U32 aMemory[GUI_NUMBYTES / 4];
  //
  // Assign memory to emWin
  //
  GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
	
	GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
  //
  // Set default font
  //
  GUI_SetDefaultFont(GUI_FONT_6X8);
}

3.LCDConf_FlexColor_Template.cファイルの
a)マクロ を する:
#define LCD_REG_ADDRESS           	BANK1_LCD_REG
#define LCD_DATA_ADDRESS          	BANK1_LCD_RAM


この2つのBANKマクロ は、tftドライバファイルで されます.
#define BANK1_BASE		((uint32_t)(0x60000000 | 0x00000000))
#define BANK1_LCD_RAM	*(__IO uint16_t *)(BANK1_BASE +  (1 << (18 + 1)))	/* FSMC 16      ,FSMC_A18        A19 */
#define BANK1_LCD_REG	*(__IO uint16_t *)(BANK1_BASE)


b) な の
/*********************************************************************
*
*       Local functions
*
**********************************************************************
*/
/********************************************************************
*
*       LcdWriteReg
*
* Function description:
*   Sets display register
*/
static void LcdWriteReg(U16 Data) {
  // ... TBD by user
	LCD_REG_ADDRESS = Data;
}

/********************************************************************
*
*       LcdWriteData
*
* Function description:
*   Writes a value to a display register
*/
static void LcdWriteData(U16 Data) {
  // ... TBD by user
	LCD_DATA_ADDRESS=Data;
}

/********************************************************************
*
*       LcdWriteDataMultiple
*
* Function description:
*   Writes multiple values to a display register.
*/
static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
  while (NumItems--) {
    // ... TBD by user
	  LCD_DATA_ADDRESS=*pData++;
  }
}

/********************************************************************
*
*       LcdReadDataMultiple
*
* Function description:
*   Reads multiple values from a display register.
*/
static void LcdReadDataMultiple(U16 * pData, int NumItems) {
  while (NumItems--) {
    // ... TBD by user
	  *pData++=LCD_DATA_ADDRESS;
  }
}

/*********************************************************************
*
*       Public functions
*
**********************************************************************
*/
/*********************************************************************
*
*       LCD_X_Config
*
* Function description:
*   Called during the initialization process in order to set up the
*   display driver configuration.
*
*/
void LCD_X_Config(void) {
  GUI_DEVICE * pDevice;
  CONFIG_FLEXCOLOR Config = {0};
  GUI_PORT_API PortAPI = {0};
  //
  // Set display driver and color conversion
  //
  pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);
  //
  // Display driver configuration, required for Lin-driver
  //
  LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
  LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
  //
  // Orientation
  //
  //Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;
  Config.FirstCOM = 0;
  Config.FirstSEG = 0;
  //Config.Orientation = GUI_MIRROR_X | GUI_MIRROR_Y;
  Config.NumDummyReads = 2;
  GUIDRV_FlexColor_Config(pDevice, &Config);
  //
  // Set controller and operation mode
  //
  PortAPI.pfWrite16_A0  = LcdWriteReg;
  PortAPI.pfWrite16_A1  = LcdWriteData;
  PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;
  PortAPI.pfReadM16_A1  = LcdReadDataMultiple;
  GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);
	//GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);
}

:GUIDRV_FlexColor_SetFunc の :
     
マスタチップがILI 9325なのでパラメータ GUIDRV_FLEXCOLOR_F66708
4.GUI_X.cファイルの
このファイルはGUIの を しており、タイマーで して することができ、 のように することができます.
      
/*********************************************************************
*
*       Global data
*/
volatile GUI_TIMER_TIME OS_TimeMS;

/*********************************************************************
*
*      Timing:
*                 GUI_X_GetTime()
*                 GUI_X_Delay(int)

  Some timing dependent routines require a GetTime
  and delay function. Default time unit (tick), normally is
  1 ms.
*/

extern __IO int32_t g_iRunTime;
GUI_TIMER_TIME GUI_X_GetTime(void) { 
  //return OS_TimeMS; 
	return g_iRunTime;
}

void GUI_X_Delay(int ms) { 
//  int tEnd = OS_TimeMS + ms;
//  while ((tEnd - OS_TimeMS) > 0);
	
	int tEnd = g_iRunTime + ms;
	while ((tEnd - g_iRunTime) > 0);
}

5. :
int main(void)
{
	/*
		ST               SystemInit()   ,     system_stm32f4xx.c   ,     
	  CPU     ,  Flash    ,  FSMC    SRAM
	*/

	bsp_Init();		/*       */
	PrintfLogo();	/*          1 */
	vLCDInit();
	
//	vClearScreen(Green);
//	vSetTextColor(Red);		
//	vPutString(20,0, "NanJing RF Tracking!!!!!");
//	ShowImage();
	//DemoFatFS();	/* SD          */
	//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); 
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
    GUI_Init();
    GUI_DispString("I am jdh!");

	while (1)
	{
		GUI_Delay(1000);
	}
}

:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);

は です.そうしないとGUIは しません.これはST が のチップをこのGUIで することを する です.
:
STM32F407   emwin_ 1
:
1.STemWin5.22ノートを する.『 emwin ガイドV 1.0.0』
3.アンフレーソースプログラム:x 3 ボード_ STemWin 5.20