Ejemplo n.º 1
0
Archivo: board.c Proyecto: djyos/djyos
// =============================================================================
// 功能:根据具体的板件配置SPI的GPIO的引脚功能,这是与板件相关,所以该函数放在该文件,CPU
//      SPI驱动直接调用该函数来初始化串口的GPIO引脚
//      主要包括GPIO端口和外设时钟使能、GPIO配置、重映射、时钟等
// 参数:无
// 返回:true
// =============================================================================
bool_t Board_SpiGpioInit(u8 SPIx)
{
	if(SPIx == CN_SPI1)
	{
		RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // 使能PORTB时钟
		RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // 使能SPI1时钟

		RCC->AHB1ENR |= 1<<6; // 使能PORTG时钟

		RCC->APB2RSTR |= RCC_APB2RSTR_SPI1;	// 复位SPI1
		RCC->APB2RSTR &= ~RCC_APB2RSTR_SPI1; // 停止复位SPI1

    	GPIO_CfgPinFunc(GPIO_B,PIN4|PIN5|PIN3,GPIO_MODE_AF,GPIO_OTYPE_PP,
    			GPIO_SPEED_50M,GPIO_PUPD_PU); // GPB3、4和5为SCK、MISO和MOSI
       	GPIO_AFSet(GPIO_B,3,5);
    	GPIO_AFSet(GPIO_B,4,5);
    	GPIO_AFSet(GPIO_B,5,5);
#if 0 // CS由设备确定
    	GPIO_CfgPinFunc(GPIO_B,PIN14,GPIO_MODE_OUT,GPIO_OTYPE_PP,
    			GPIO_SPEED_50M,GPIO_PUPD_PU); // GPB14为CS用于NOR

    	GPIO_CfgPinFunc(GPIOG,PIN7,GPIO_MODE_OUT,GPIO_OTYPE_PP,
    			GPIO_SPEED_100M,GPIO_PUPD_PU); // GPG7为CS用于无线模式
    	GPIOG->ODR|=1<<7;

    	GPIO_SettoHigh(GPIO_B,PIN14);// CS为高
#endif
	}
	else
	{
		return false;
	}
	return true;
}
Ejemplo n.º 2
0
// =============================================================================
// 功能: I/O模拟的方式 释放没有复位和使能引脚的IIC器件
// 参数: port I/O口 如 CN_GPIO_B
//      TS_SDA:引脚号
//      TS_SCK:引脚号
// 返回: true/false
// =============================================================================
static bool_t _IIC_Busfree(u32 port,u32 sda_pin,u32 sck_pin)
{
     u32 timeout=0;
     GPIO_CfgPinFunc(port,sda_pin,CN_GPIO_MODE_IN_FLOATING);//TS_SDA
     GPIO_CfgPinFunc(port,sck_pin,CN_GPIO_MODE_GPIO_OUT_OD_50Mhz);//TS_SCK

     while(1)
     {
          timeout++;
          GPIO_SettoLow(port,1<<sck_pin);
          Djy_DelayUs(10);

          GPIO_SettoHigh(port,1<<sck_pin);
          Djy_DelayUs(10);

          if(timeout>=CONFIG_I2C_TIMEOUT)
              return false;
          if( GPIO_GetData(port)&(1<<sda_pin))
              break;
    }

    GPIO_CfgPinFunc(port,sda_pin,CN_GPIO_MODE_GPIO_OUT_OD_50Mhz);//TS_SDA
    //产生停止信号 iic总线释放
    GPIO_SettoLow(port,1<<sda_pin);
    Djy_DelayUs(10);
    GPIO_SettoHigh(port,1<<sda_pin);
    Djy_DelayUs(10);

    return true;
}
Ejemplo n.º 3
0
//----初始化键盘硬件-----------------------------------------------------------
//功能: 如题,初始化后才能扫描键盘
//参数: 无
//返回: 无
//----------------------------------------------------------------------------
bool_t key_hard_init(void)
{
    GPIO_PowerOn(CN_GPIO_C);
    GPIO_CfgPinFunc(CN_GPIO_C,10,CN_GPIO_MODE_IN_PULLUP);
    GPIO_CfgPinFunc(CN_GPIO_C,11,CN_GPIO_MODE_IN_PULLUP);
    GPIO_CfgPinFunc(CN_GPIO_C,12,CN_GPIO_MODE_IN_PULLUP);
    GPIO_CfgPinFunc(CN_GPIO_C,13,CN_GPIO_MODE_IN_PULLUP);
    return true;
}
Ejemplo n.º 4
0
// =============================================================================
// 功能: 硬件GPIO初始化,包括电源等
// 参数: IIC_NO,编号
// 返回: 无
// =============================================================================
static bool_t __IIC_GpioConfig(u8 IIC_NO)
{
    u8 tout;
    pg_rcc_reg->APB2ENR |=(1<<3)|(1<<0);             //开时钟B和复用功能
    switch(IIC_NO)
    {
    case CN_IIC1:
        pg_rcc_reg->APB1ENR |=(1<<21);               //开时钟
        pg_iic1_reg->CR1     |=I2C_CR1_SWRST_MASK;       /* 复位IIC外设   */
        for (tout = 100; tout; tout--);
        pg_iic1_reg->CR1     = 0x0000;
        //对于一些 IIC器件它们没有复位或者使能管脚,像stmpe811 在工作过程中,如果在数据端口为低电平时发生cpu复位
        //将导致iic总线被从器件一直占用 在这里采用I/O模拟的方式产生停止信号释放IIC总线
        if(_IIC_Busfree(CN_GPIO_B,9,8)==false)
            return false;

        GPIO_CfgPinFunc(CN_GPIO_B,9,CN_GPIO_MODE_PERI_OUT_OD_50Mhz);//TS_SDA
        GPIO_CfgPinFunc(CN_GPIO_B,8,CN_GPIO_MODE_PERI_OUT_OD_50Mhz);//TS_SCK

        pg_iic1_reg->CR1     = 0x0001;//PE使能
        pg_iic1_reg->CR2     = 24;    //I2C模块时钟频率  24M
        pg_iic1_reg->CR1     = 0x0000;//PE使能
        pg_iic1_reg->TRISE   = 0x0025;//在快速/标准模式下的最大上升时间(主模式)
        pg_iic1_reg->CCR     = 0x00b4;//快速/标准模式下的时钟控制分频系数(主模式)
        pg_iic1_reg->CR1    |= 0x0401;//PE使能&ACK
        pg_iic1_reg->OAR1    = 0x40A0;//4必须始终由软件保持为’1’。A接口地址
        pg_iic1_reg->CCR|=I2C_CCR_FS_MASK;//快速模式
        break;
    case CN_IIC2:
        pg_rcc_reg->APB1ENR |=(1<<22);//开时钟

        if(_IIC_Busfree(CN_GPIO_B,11,10)==false)
            return false;

        GPIO_CfgPinFunc(CN_GPIO_B,11,CN_GPIO_MODE_PERI_OUT_OD_50Mhz);//TS_SDA
        GPIO_CfgPinFunc(CN_GPIO_B,10,CN_GPIO_MODE_PERI_OUT_OD_50Mhz);//TS_SCK

        pg_iic2_reg->CR1     |= I2C_CR1_SWRST_MASK;    /* 复位IIC外设   */
          for (tout = 100; tout; tout--);
        pg_iic2_reg->CR1     = 0x0000;
        pg_iic2_reg->CR1    |= I2C_CR1_PE_MASK;
        pg_iic2_reg->CR2     = 24;
        pg_iic2_reg->CR1     = 0x0000;
        pg_iic2_reg->TRISE   = 0x0025;
        pg_iic2_reg->CCR     = 0x0078;
        pg_iic2_reg->CR1    |= 0x0401;
        pg_iic2_reg->OAR1    = 0x40A0;
        pg_iic2_reg->CCR|=I2C_CCR_FS_MASK;//快速模式
        break;
    default:
        break;
    }
    return true;
}
Ejemplo n.º 5
0
void led_init(void)
{
    GPIO_PowerOn(CN_GPIO_C);
    GPIO_CfgPinFunc(CN_GPIO_C, 6, CN_GPIO_MODE_GPIO_OUT_PP_2Mhz);
    GPIO_CfgPinFunc(CN_GPIO_C, 4, CN_GPIO_MODE_GPIO_OUT_PP_2Mhz);
    GPIO_CfgPinFunc(CN_GPIO_C, 8, CN_GPIO_MODE_GPIO_OUT_PP_2Mhz);
    GPIO_CfgPinFunc(CN_GPIO_C, 9, CN_GPIO_MODE_GPIO_OUT_PP_2Mhz);

    evtt_led = Djy_EvttRegist(EN_CORRELATIVE, CN_PRIO_RRS, 0, 1,
                                led_flash, NULL,1000, "hello led");
    if (evtt_led != CN_EVTT_ID_INVALID)
    {
        event_led = Djy_EventPop(evtt_led, NULL, 0, NULL, 0, 0);
    }
}
Ejemplo n.º 6
0
Archivo: board.c Proyecto: djyos/djyos
// =============================================================================
// 功能:根据具体的板件配置串口的GPIO的引脚功能,这是与板件相关,所以该函数放在该文件,CPU
//      串口驱动直接调用该函数来初始化串口的GPIO引脚
//      主要包括GPIO端口和串口时钟使能、GPIO配置、重映射、时钟等
// 参数:无
// 返回:true
// =============================================================================
bool_t Board_UartGpioInit(u8 SerialNo)
{
    //初始化IO端口位uart功能
    //Ports  :  GPA10 GPA9 GPA8 GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
    //Signal :   RXD1 TXD1  xx   xx   xx   xx   xx   xx   xx   xx   xx
    switch(SerialNo)
    {
    case CN_UART1:
    	RCC->AHB1ENR|=1<<0;   	//使能PORTA口时钟
    	RCC->APB2ENR|=1<<4;  	//使能串口1时钟
    	GPIO_CfgPinFunc(GPIO_A,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,
    			GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
     	GPIO_AFSet(GPIO_A,9,7);	//PA9,AF7
    	GPIO_AFSet(GPIO_A,10,7);//PA10,AF7
        break;
    case CN_UART2:
        RCC->APB1ENR |= (1<<17);
        RCC->AHB1ENR |= (1<<0);//port A clock enable
        GPIO_CfgPinFunc(GPIO_A,PIN2|PIN3,GPIO_MODE_AF,GPIO_OTYPE_PP,
        		GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
     	GPIO_AFSet(GPIO_A,2,7);	//PA2,AF7
    	GPIO_AFSet(GPIO_A,3,7);//PA3,AF7
        break;
    case CN_UART3:
        RCC->APB1ENR |= (1<<18);//uart3 clock enable
        RCC->AHB1ENR |= (1<<1);// port b clock enable
        GPIO_CfgPinFunc(GPIO_B,PIN10|PIN11,GPIO_MODE_AF,GPIO_OTYPE_PP,
        		GPIO_SPEED_50M,GPIO_PUPD_PU);
     	GPIO_AFSet(GPIO_B,10,7);	//PB10,AF7
    	GPIO_AFSet(GPIO_B,11,7);//PB11,AF7
        break;
    case CN_UART4:
    	RCC->APB1ENR |= (1<<19);//uart4 clock enable
        RCC->AHB1ENR |= (1<<0);//port A clock enable
        GPIO_CfgPinFunc(GPIO_A,PIN0|PIN1,GPIO_MODE_AF,GPIO_OTYPE_PP,
        		GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
     	GPIO_AFSet(GPIO_A,0,7);	//PA2,AF7
    	GPIO_AFSet(GPIO_A,1,7);//PA3,AF7
        break;
    case CN_UART5:
    	RCC->APB1ENR |= (1<<20);//uart5 clock enable
        RCC->AHB1ENR |= (1<<2);//port C clock enable
        GPIO_CfgPinFunc(GPIO_C,PIN11|PIN12,GPIO_MODE_AF,GPIO_OTYPE_PP,
        		GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
     	GPIO_AFSet(GPIO_C,11,7);	//PA2,AF7
    	GPIO_AFSet(GPIO_C,12,7);//PA3,AF7
        break;
    case CN_UART6:
    	RCC->APB2ENR|= (1<<5);  	//使能串口6时钟
        RCC->AHB1ENR |= (1<<2);//port C clock enable
        GPIO_CfgPinFunc(GPIO_C,PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,
        		GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
     	GPIO_AFSet(GPIO_C,6,7);	//PA2,AF7
    	GPIO_AFSet(GPIO_C,7,7);//PA3,AF7
    	break;
    default:
        break;
    }
	return true;
}
Ejemplo n.º 7
0
/*---------------------------------------------------------------------------
功能:    lcd 初始化
---------------------------------------------------------------------------*/
void __lcd_ili9325_init(void)
{
    GPIO_PowerOn(CN_GPIO_F);
    GPIO_PowerOn(CN_GPIO_G);
    GPIO_CfgPinFunc(CN_GPIO_F,10,CN_GPIO_MODE_GPIO_OUT_OD_2Mhz);
    GPIO_CfgPinFunc(CN_GPIO_G,8,CN_GPIO_MODE_GPIO_OUT_PP_2Mhz);
    lcd_backlight_off();
    lcd_reset();

    Djy_DelayUs(100000);

    if( __ili9325_read_reg() != 0x9325)
    {
        return;
    }

    __ili9325_write_reg(0x0000, 0x0001);            //Start internal OSC
    __ili9325_write_reg(0x0001, 0x0000);            // set SS=0 and SM=0  S1---S720
    __ili9325_write_reg(0x0002, 0x0700);            // set 1 line inversion
    __ili9325_write_reg(0x0003, 0x1030);            // set GRAM write direction and BGR=1.
    __ili9325_write_reg(0x0004, 0x0000);            // Resize register
    __ili9325_write_reg(0x0008, 0x0207);            // set the back porch and front porch
    __ili9325_write_reg(0x0009, 0x0000);            // set non-display area refresh cycle ISC[3:0]
    __ili9325_write_reg(0x000a, 0x0000);            // FMARK function
    __ili9325_write_reg(0x000c, 0x0000);            // RGB interface setting
    __ili9325_write_reg(0x000d, 0x0000);            // Frame marker Position
    __ili9325_write_reg(0x000f, 0x0000);            // RGB interface polarity
    //-------------power on sequence------------
    __ili9325_write_reg(0x0010, 0x0000);            // SAP, BT[3:0], AP, DSTB, SLP, STB
    __ili9325_write_reg(0x0011, 0x0007);            // DC1[2:0], DC0[2:0], VC[2:0]
    __ili9325_write_reg(0x0012, 0x0000);                                                            // VREG1OUT voltage
    __ili9325_write_reg(0x0013, 0x0000);                                                            // VDV[4:0] for VCOM amplitude

    Djy_DelayUs(5000);

    __ili9325_write_reg(0x0010, 0x1690);                                                            // SAP, BT[3:0], AP, DSTB, SLP, STB
    __ili9325_write_reg(0x0011, 0x0227);                                                            // R11H=0x0221 at VCI=3.3V, DC1[2:0], DC0[2:0], VC[2:0]

    Djy_DelayUs(5000);

    __ili9325_write_reg(0x0012, 0x001d);                                                            // External reference voltage= Vci;001d

    Djy_DelayUs(5000);

    __ili9325_write_reg(0x0013, 0x0800);                                                            // R13H=1D00 when R12H=009D;VDV[4:0] for VCOM amplitude
    __ili9325_write_reg(0x0029, 0x0014);                                                            // R29H=0013 when R12H=009D;VCM[5:0] for VCOMH
    __ili9325_write_reg(0x002b, 0x000B);                                                            // Frame Rate = 96Hz

    Djy_DelayUs(5000);

    __ili9325_write_reg(0x0020, 0x0000);                                                            // GRAM horizontal Address
    __ili9325_write_reg(0x0021, 0x0000);                                                            // GRAM Vertical Address
    // ----------- Adjust the Gamma Curve ----------
    __ili9325_write_reg(0x0030, 0x0007);
    __ili9325_write_reg(0x0031, 0x0707);
    __ili9325_write_reg(0x0032, 0x0006);
    __ili9325_write_reg(0x0035, 0x0704);
    __ili9325_write_reg(0x0036, 0x1F04);
    __ili9325_write_reg(0x0037, 0x0004);
    __ili9325_write_reg(0x0038, 0x0000);
    __ili9325_write_reg(0x0039, 0x0706);
    __ili9325_write_reg(0x003c, 0x0701);
    __ili9325_write_reg(0x003d, 0x000F);
    // ------------------ Set GRAM area ---------------
    __ili9325_write_reg(0x0050, 0x0000);            // Horizontal GRAM Start Address
    __ili9325_write_reg(0x0051,    239);                // Horizontal GRAM End Address
    __ili9325_write_reg(0x0052, 0x0000);            // Vertical GRAM Start Address
    __ili9325_write_reg(0x0053,    319);                // Vertical GRAM Start Address
    __ili9325_write_reg(0x0060, 0x2700);            // GS=0 320 line
    __ili9325_write_reg(0x0061, 0x0001);            // NDL,VLE(滚屏允许), REV(灰度翻转)
    __ili9325_write_reg(0x006a, 0x0000);            // set scrolling line
    // -------------- Partial Display Control ---------
    __ili9325_write_reg(0x0080, 0x0000);
    __ili9325_write_reg(0x0081, 0x0000);
    __ili9325_write_reg(0x0082, 0x0000);
    __ili9325_write_reg(0x0083, 0x0000);
    __ili9325_write_reg(0x0084, 0x0000);
    __ili9325_write_reg(0x0085, 0x0000);
    // -------------- Panel Control -------------------
    __ili9325_write_reg(0x0090, 0x0010);
    __ili9325_write_reg(0x0092, 0x0000);
    __ili9325_write_reg(0x0093, 0x0003);
    __ili9325_write_reg(0x0095, 0x0110);
    __ili9325_write_reg(0x0097, 0x0000);
    __ili9325_write_reg(0x0098, 0x0000);

    // Set GRAM write direction and BGR = 1
    // I/D=11 (Horizontal : increment, Vertical : increment)
    // AM=0 (address is updated in Horizontal writing direction)
    __ili9325_write_reg(0x0003, 0x1030);

    __ili9325_write_reg(0x0007, 0x0173);                        // 262K color and display ON

    lcd_backlight_on();
}
Ejemplo n.º 8
0
void __lcd_hard_init(void)
{
    u32 x,y,reg;
    u16 *pdata;
    // enable power and setup lcdc.
    Cpucfg_EnableLPSC(cn_PSC1_LCDC);

        /* Palette */
    pdata = (u16*)(u8g_dsp_buffer - CN_PALETTE_SIZE);
#if CN_LCD_TYPE == CN_MODE_GREY_MONO
    *pdata++ = 0;
    *pdata++ = 15;
#elif CN_LCD_TYPE == CN_MODE_GREY_04
    *pdata++ = 0;
    *pdata++ = 5;
    *pdata++ = 10;
    *pdata++ = 15;
#elif CN_LCD_TYPE == CN_MODE_GREY_16
    *pdata++ = 0;
    *pdata++ = 1;
    *pdata++ = 2;
    *pdata++ = 3;
    *pdata++ = 4;
    *pdata++ = 5;
    *pdata++ = 6;
    *pdata++ = 7;
    *pdata++ = 8;
    *pdata++ = 9;
    *pdata++ = 10;
    *pdata++ = 11;
    *pdata++ = 12;
    *pdata++ = 13;
    *pdata++ = 14;
    *pdata++ = 15;
#endif

#if ((CN_LCD_TYPE == CN_MODE_GREY_MONO) || (CN_LCD_TYPE == CN_MODE_GREY_04) || (CN_LCD_TYPE == CN_MODE_GREY_16))

    //以下分配LCD控制器所需的引脚
    GPIO_CfgPinFunc(7,8,cn_p7_8_lcd_d0);
    GPIO_CfgPinFunc(7,9,cn_p7_9_lcd_d1);
    GPIO_CfgPinFunc(7,10,cn_p7_10_lcd_d2);
    GPIO_CfgPinFunc(7,11,cn_p7_11_lcd_d3);
    GPIO_CfgPinFunc(8,10,cn_p8_10_lcd_mclk);
    GPIO_CfgPinFunc(8,11,cn_p8_11_lcd_pclk);
    GPIO_CfgPinFunc(6,0,cn_p6_0_nlcd_ac_enb_cs);
    GPIO_CfgPinFunc(8,8,cn_p8_8_lcd_vsync);
    GPIO_CfgPinFunc(8,9,cn_p8_9_lcd_hsync);

    g_ptSysconfig0Reg->MSTPRI[2] &= 0x0fffffff;      //设置LCD数据传送次高优先级
    g_ptSysconfig0Reg->MSTPRI[2] |= 0x10000000;      //设置LCD数据传送次高优先级
    // Turn raster controller off
    g_ptLcdcReg->RASTER_CTRL       &= 0xfffffffe;

    // Clear status bits
    g_ptLcdcReg->LCD_STAT           = 0x000003ff;

    // PCLK = 1.27MHz, 帧频66,raster mode
    reg = CN_LCD_CLKVAL /(CN_LCD_SIZE_X * CN_LCD_SIZE_Y * 66) * 4;
    g_ptLcdcReg->LCD_CTRL &= ~CN_LCDC_LCD_CTRL_CLKDIV_MASK;
    g_ptLcdcReg->LCD_CTRL |= reg << CN_LCDC_LCD_CTRL_CLKDIV_SHIFT;
    g_ptLcdcReg->LCD_CTRL |= CN_LCDC_LCD_CTRL_MODESEL_MASK;

    g_ptLcdcReg->RASTER_CTRL =
                       (CN_LCDC_RASTER_CTRL_NIB_MODE_ENABLE << CN_LCDC_RASTER_CTRL_NIB_MODE_SHIFT)
                       +(CN_LCDC_RASTER_CTRL_MONO_COLOR_MONOCHROME << CN_LCDC_RASTER_CTRL_MONO_COLOR_SHIFT);


    // HBP = 0; HFP = 0; HSW = 0x3; PPL = 0x13
    g_ptLcdcReg->RASTER_TIMING_0 =
                        (4 << CN_LCDC_RASTER_TIMING_0_HBP_SHIFT)
                       +(4 << CN_LCDC_RASTER_TIMING_0_HFP_SHIFT)
                       +(4 << CN_LCDC_RASTER_TIMING_0_HSW_SHIFT)
                       +((CN_LCD_SIZE_X/16 -1)<< CN_LCDC_RASTER_TIMING_0_PPL_SHIFT);
    // VBP = 0x3; VFP = 0x2; VSW = 0xA: LPP = 0xef;
    g_ptLcdcReg->RASTER_TIMING_1    =
                         (10 << CN_LCDC_RASTER_TIMING_1_VBP_SHIFT)
                        +(9  << CN_LCDC_RASTER_TIMING_1_VFP_SHIFT)
                        +(5  << CN_LCDC_RASTER_TIMING_1_VSW_SHIFT)
                        +((CN_LCD_SIZE_Y -1)<< CN_LCDC_RASTER_TIMING_1_LPP_SHIFT);
    g_ptLcdcReg->RASTER_TIMING_2 =
                         (CN_LCDC_RASTER_TIMING_2_IPC_RISING << CN_LCDC_RASTER_TIMING_2_IPC_SHIFT);

    g_ptLcdcReg->LCDDMA_CTRL        = 0x00000540;
    // Frame buffer start
    g_ptLcdcReg->LCDDMA_FB0_BASE    = (u32)(u8g_dsp_buffer - CN_PALETTE_SIZE);
    // Frame buffer end,不知为何要减1
    g_ptLcdcReg->LCDDMA_FB0_CEILING = (u32)(u8g_dsp_buffer + cn_frame_buffer_size - 1);
    g_ptLcdcReg->RASTER_CTRL       |= 0x00000001;         // Enable controller
#endif

    return;
}
Ejemplo n.º 9
0
Archivo: SRAM.c Proyecto: Mars-Wu/djyos
void SRAM_GPIO_Init(void)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE );

    GPIO_PowerOn(CN_GPIO_D);
    GPIO_PowerOn(CN_GPIO_E);
    GPIO_PowerOn(CN_GPIO_F);
    GPIO_PowerOn(CN_GPIO_G);

    GPIO_CfgPinFunc(CN_GPIO_D, 14, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //d0
    GPIO_CfgPinFunc(CN_GPIO_D, 15, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //d1
    GPIO_CfgPinFunc(CN_GPIO_D, 0, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //d2
    GPIO_CfgPinFunc(CN_GPIO_D, 1, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //d3
    GPIO_CfgPinFunc(CN_GPIO_E, 7, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //d4
    GPIO_CfgPinFunc(CN_GPIO_E, 8, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //d5
    GPIO_CfgPinFunc(CN_GPIO_E, 9, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //d6
    GPIO_CfgPinFunc(CN_GPIO_E, 10, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //d7
    GPIO_CfgPinFunc(CN_GPIO_E, 11, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //d8
    GPIO_CfgPinFunc(CN_GPIO_E, 12, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //d9
    GPIO_CfgPinFunc(CN_GPIO_E, 13, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //d10
    GPIO_CfgPinFunc(CN_GPIO_E, 14, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //d11
    GPIO_CfgPinFunc(CN_GPIO_E, 15, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //d12
    GPIO_CfgPinFunc(CN_GPIO_D, 8, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //d13
    GPIO_CfgPinFunc(CN_GPIO_D, 9, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //d14
    GPIO_CfgPinFunc(CN_GPIO_D, 10, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //d15

    GPIO_CfgPinFunc(CN_GPIO_F, 0, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a0
    GPIO_CfgPinFunc(CN_GPIO_F, 1, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a1
    GPIO_CfgPinFunc(CN_GPIO_F, 2, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a2
    GPIO_CfgPinFunc(CN_GPIO_F, 3, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a3
    GPIO_CfgPinFunc(CN_GPIO_F, 4, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a4
    GPIO_CfgPinFunc(CN_GPIO_F, 5, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a5
    GPIO_CfgPinFunc(CN_GPIO_F, 12, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //a6
    GPIO_CfgPinFunc(CN_GPIO_F, 13, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //a7
    GPIO_CfgPinFunc(CN_GPIO_F, 14, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //a8
    GPIO_CfgPinFunc(CN_GPIO_F, 15, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //a9
    GPIO_CfgPinFunc(CN_GPIO_G, 0, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a10
    GPIO_CfgPinFunc(CN_GPIO_G, 1, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a11
    GPIO_CfgPinFunc(CN_GPIO_G, 2, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a12
    GPIO_CfgPinFunc(CN_GPIO_G, 3, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a13
    GPIO_CfgPinFunc(CN_GPIO_G, 4, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a14
    GPIO_CfgPinFunc(CN_GPIO_G, 5, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a15
    GPIO_CfgPinFunc(CN_GPIO_D, 11, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //a16
    GPIO_CfgPinFunc(CN_GPIO_D, 12, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //a17
    GPIO_CfgPinFunc(CN_GPIO_D, 13, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //a18
    GPIO_CfgPinFunc(CN_GPIO_E, 3, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a19
    GPIO_CfgPinFunc(CN_GPIO_E, 4, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a20
    GPIO_CfgPinFunc(CN_GPIO_E, 5, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //a21

    GPIO_CfgPinFunc(CN_GPIO_D, 5, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //we
    GPIO_CfgPinFunc(CN_GPIO_D, 4, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //re
    GPIO_CfgPinFunc(CN_GPIO_D, 7, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //cs1 for sram
    GPIO_CfgPinFunc(CN_GPIO_G, 9, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //cs2 for nand
    GPIO_CfgPinFunc(CN_GPIO_G, 10, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //cs3 for lcd
    GPIO_CfgPinFunc(CN_GPIO_G, 12, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);   //cs4 for dm9000a


    GPIO_CfgPinFunc(CN_GPIO_E, 0, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //lb
    GPIO_CfgPinFunc(CN_GPIO_E, 1, CN_GPIO_MODE_PERI_OUT_PP_50Mhz);    //ub

}