This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

External memory interface & Uart

Hi All,

I add the UART code into EMI example from the ST and compile the following code with the configuration Options->Target
-> off-chip RAM1 0x3c000000 size 0x400000
-> on-chip IRAM1 0x4000000 size 0x18000

The message " EMI Example ***" cannot be sent to the Hyperterminal. However, the EMI works fine.

Anyone has experiences with EMI and UART? Could you please point out where I am wrong? Greatly appreciate your help.

u8 TxBuffer[] = "EMI Example ****\n\r"
int main()
{

#ifdef DEBUG debug();
#endif

/*CPU running @96MHZ*/ MCLK_Config ();

/* Configure the system clocks */ SCU_Configuration();

/* Configure the GPIO ports */ GPIO_Configuration();

/* UART0 configuration -------------------------------------------------------*/ /* UART0 configured as follow: - Word Length = 7 Bits - Two Stop Bit - No parity - BaudRate = 115200 baud - Hardware flow control enabled (RTS and CTS signals) - Receive and transmit enabled - Receive and transmit FIFOs are enabled - Transmit and Receive FIFOs levels have 8 bytes depth */ UART_InitStructure.UART_WordLength = UART_WordLength_8D; UART_InitStructure.UART_StopBits = UART_StopBits_1; UART_InitStructure.UART_Parity = UART_Parity_No ; UART_InitStructure.UART_BaudRate = 115200; UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None; UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx; UART_InitStructure.UART_FIFO = UART_FIFO_Disable;

UART_DeInit(UART0); UART_Init(UART0, &UART_InitStructure);

/* Enable the UART0 */ UART_Cmd(UART0, ENABLE);

/* EMI default configuration : Reset configuration*/ EMI_DeInit();

/**************************EMI configuration*********************************/

EMI_StructInit(&EMI_InitStruct); /* Number of bus turnaround cycles added between read and write accesses.*/ EMI_InitStruct.EMI_Bank_IDCY = 0x3 ;

/* Number of wait states for read accesses*/ //EMI_InitStruct.EMI_Bank_WSTRD = 0x3 ; EMI_InitStruct.EMI_Bank_WSTRD = 0x5 ; /* Number of wait states for write accesses*/ //EMI_InitStruct.EMI_Bank_WSTWR = 0x3 ; EMI_InitStruct.EMI_Bank_WSTWR = 0x4 ;

/*Output enable assertion delay from chip select assertion*/ EMI_InitStruct.EMI_Bank_WSTROEN = 0x2;

/*Write enable assertion delay from chip select assertion*/ EMI_InitStruct.EMI_Bank_WSTWEN = 0x2;

/*This member Controls the memory width*/ EMI_InitStruct.EMI_Bank_MemWidth = EMI_Width_HalfWord;

/*Write protection feature */ EMI_InitStruct.EMI_Bank_WriteProtection = EMI_Bank_NonWriteProtect;

/*Use Bank1 (CS1)*/ EMI_Init( EMI_Bank1, &EMI_InitStruct);

/* Send a buffer from UART to hyperterminal */ while(NbrOfDataToTransfer--) { UART_SendData(UART0, TxBuffer[TxCounter++]); while(UART_GetFlagStatus(UART0, UART_FLAG_TxFIFOFull) != RESET);

}

while (1) {

/*Write in the external memory*/

for (k = 0; k < 32; k++)

*(u16*)(0x3C000000 + (k*2)) = Buffer_Write[k] ;
// *(u16*)(0x3C000000 + (k*2)) = 0x0101 ;

/*Read from the external memory*/

for (k = 0; k < 32; k++)

Buffer_Read[k] = *(u16*)(0x3C000000 + (k * 2)) ;

/*Comparaison*/

/* Check the received data with the send ones */ TransferStatus = Buffercmp(Buffer_Write, Buffer_Read, 32);

if (TransferStatus != 0) UART_SendData(UART0, (u8)(TransferStatus+48));

}

}
/*******************************************************************************
* Function Name : SCU_Configuration
* Description : Configures the system clocks.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SCU_Configuration(void)
{

/* Enable the clock for EMI*/ SCU_AHBPeriphClockConfig(__EMI | __EMI_MEM_CLK, ENABLE);

/*BCLK=96Mhz*/ SCU_EMIBCLKDivisorConfig(SCU_EMIBCLK_Div1);

/*Enable the Mux mode*/ SCU_EMIModeConfig(SCU_EMI_MUX);

/*ALE length and polarity definition*/ SCU_EMIALEConfig(SCU_EMIALE_LEN1, SCU_EMIALE_POLHigh);

/* Enable the GPIO7 Clock */ SCU_APBPeriphClockConfig(__GPIO7 , ENABLE); SCU_APBPeriphReset(__GPIO7,DISABLE);

SCU_APBPeriphClockConfig(__UART0, ENABLE); SCU_APBPeriphReset(__UART0,DISABLE);

/* Enable the GPIO2 Clock */ SCU_APBPeriphClockConfig(__GPIO2, ENABLE); SCU_APBPeriphReset(__GPIO2,DISABLE); /* Enable the GPIO3 Clock */ SCU_APBPeriphClockConfig(__GPIO3, ENABLE); SCU_APBPeriphReset(__GPIO3,DISABLE);

/* Enable the GPIO8 Clock */ SCU_APBPeriphClockConfig(__GPIO8, ENABLE); SCU_APBPeriphReset(__GPIO8,DISABLE); /* Enable the GPIO9 Clock */ SCU_APBPeriphClockConfig(__GPIO9, ENABLE); SCU_APBPeriphReset(__GPIO9,DISABLE);

}

/*******************************************************************************
* Function Name : GPIO_Configuration
* Description : Configures the different GPIO ports.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void GPIO_Configuration(void)
{ /* GPIO8,GPIO9 Configuration*/

GPIO_EMIConfig(ENABLE);

/* GPIO7 Configuration */ GPIO_DeInit(GPIO7); GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
/* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 ; */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull; GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2 ; GPIO_Init (GPIO7, &GPIO_InitStructure);

//uart0 setup

GPIO_DeInit(GPIO3); /*Gonfigure UART0_Rx pin GPIO3.0*/ GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable; GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1 ; GPIO_Init (GPIO3, &GPIO_InitStructure);

/* GPIO_DeInit(GPIO3); */ /*Gonfigure UART0_Tx pin GPIO3.1*/ GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2 ; GPIO_Init (GPIO3, &GPIO_InitStructure);
}

Parents
  • I post the code again.
    Thank you for your help.

    Lillian

    int main()
    {
    
    #ifdef DEBUG
      debug();
    #endif
    
      /*CPU running @96MHZ*/
      MCLK_Config ();
    
      /* Configure the system clocks */
      SCU_Configuration();
    
      /* Configure the GPIO ports */
      GPIO_Configuration();
    
    
       /* UART0 configuration -------------------------------------------------------*/
      /* UART0 configured as follow:
            - Word Length = 7 Bits
            - Two Stop Bit
            - No parity
            - BaudRate = 115200 baud
            - Hardware flow control enabled (RTS and CTS signals)
            - Receive and transmit enabled
            - Receive and transmit FIFOs are enabled
            - Transmit and Receive FIFOs levels have 8 bytes depth
      */
      UART_InitStructure.UART_WordLength = UART_WordLength_8D;
      UART_InitStructure.UART_StopBits = UART_StopBits_1;
      UART_InitStructure.UART_Parity = UART_Parity_No ;
      UART_InitStructure.UART_BaudRate = 115200;
      UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
      UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx;
      UART_InitStructure.UART_FIFO = UART_FIFO_Disable;
    
      UART_DeInit(UART0);
      UART_Init(UART0, &UART_InitStructure);
    
       /* Enable the UART0 */
      UART_Cmd(UART0, ENABLE);
    
      /* EMI default configuration : Reset configuration*/
      EMI_DeInit();
    
    
      /**************************EMI configuration*********************************/
    
      EMI_StructInit(&EMI_InitStruct);
      /* Number of bus turnaround cycles added between read and write accesses.*/
      EMI_InitStruct.EMI_Bank_IDCY = 0x3 ;
    
      /* Number of wait states for read accesses*/
      //EMI_InitStruct.EMI_Bank_WSTRD = 0x3 ;
      EMI_InitStruct.EMI_Bank_WSTRD = 0x5 ;
      /* Number of wait states for write accesses*/
      //EMI_InitStruct.EMI_Bank_WSTWR = 0x3 ;
      EMI_InitStruct.EMI_Bank_WSTWR = 0x4 ;
    
      /*Output enable assertion delay from chip select assertion*/
      EMI_InitStruct.EMI_Bank_WSTROEN = 0x2;
    
      /*Write enable assertion delay from chip select assertion*/
      EMI_InitStruct.EMI_Bank_WSTWEN = 0x2;
    
      /*This member Controls the memory width*/
      EMI_InitStruct.EMI_Bank_MemWidth = EMI_Width_HalfWord;
    
      /*Write protection feature */
      EMI_InitStruct.EMI_Bank_WriteProtection =  EMI_Bank_NonWriteProtect;
    
      /*Use Bank1 (CS1)*/
      EMI_Init( EMI_Bank1, &EMI_InitStruct);
    
        /* Send a buffer from UART to hyperterminal */
      while(NbrOfDataToTransfer--)
      {
        UART_SendData(UART0, TxBuffer[TxCounter++]);
        while(UART_GetFlagStatus(UART0, UART_FLAG_TxFIFOFull) != RESET);
    
      }
    
    
     while (1)
      {
    
    
        /*Write in the external memory*/
    
        for (k = 0; k < 32; k++)
    
          *(u16*)(0x3C000000 + (k*2)) = Buffer_Write[k] ;
    //              *(u16*)(0x3C000000 + (k*2)) = 0x0101 ;
    
    
        /*Read from the external memory*/
    
        for (k = 0; k < 32; k++)
    
          Buffer_Read[k] = *(u16*)(0x3C000000 + (k * 2))  ;
    
        /*Comparaison*/
    
        /* Check the received data with the send ones */
        TransferStatus = Buffercmp(Buffer_Write, Buffer_Read, 32);
    
    
            if (TransferStatus != 0) UART_SendData(UART0, (u8)(TransferStatus+48));
    
    
      }
    
    }
    /*******************************************************************************
    * Function Name  : SCU_Configuration
    * Description    : Configures the system clocks.
    * Input          : None
    * Output         : None
    * Return         : None
    *******************************************************************************/
    void SCU_Configuration(void)
    {
    
      /* Enable the clock for EMI*/
      SCU_AHBPeriphClockConfig(__EMI | __EMI_MEM_CLK, ENABLE);
    
      /*BCLK=96Mhz*/
      SCU_EMIBCLKDivisorConfig(SCU_EMIBCLK_Div1);
    
      /*Enable the Mux mode*/
      SCU_EMIModeConfig(SCU_EMI_MUX);
    
      /*ALE length and polarity definition*/
      SCU_EMIALEConfig(SCU_EMIALE_LEN1, SCU_EMIALE_POLHigh);
    
      /* Enable the GPIO7 Clock */
      SCU_APBPeriphClockConfig(__GPIO7 , ENABLE);
      SCU_APBPeriphReset(__GPIO7,DISABLE);
    
      SCU_APBPeriphClockConfig(__UART0, ENABLE);
      SCU_APBPeriphReset(__UART0,DISABLE);
    
      /* Enable the GPIO2 Clock */
      SCU_APBPeriphClockConfig(__GPIO2, ENABLE);
      SCU_APBPeriphReset(__GPIO2,DISABLE);
      /* Enable the GPIO3 Clock */
      SCU_APBPeriphClockConfig(__GPIO3, ENABLE);
      SCU_APBPeriphReset(__GPIO3,DISABLE);
    
       /* Enable the GPIO8 Clock */
      SCU_APBPeriphClockConfig(__GPIO8, ENABLE);
      SCU_APBPeriphReset(__GPIO8,DISABLE);
      /* Enable the GPIO9 Clock */
      SCU_APBPeriphClockConfig(__GPIO9, ENABLE);
      SCU_APBPeriphReset(__GPIO9,DISABLE);
    
    }
    
    /*******************************************************************************
    * Function Name  : GPIO_Configuration
    * Description    : Configures the different GPIO ports.
    * Input          : None
    * Output         : None
    * Return         : None
    *******************************************************************************/
    void GPIO_Configuration(void)
    {
      /* GPIO8,GPIO9 Configuration*/
    
      GPIO_EMIConfig(ENABLE);
    
      /* GPIO7 Configuration */
      GPIO_DeInit(GPIO7);
      GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_7;
    
      GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
      GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2 ;
      GPIO_Init (GPIO7, &GPIO_InitStructure);
    
    //uart0 setup
    
      GPIO_DeInit(GPIO3);
      /*Gonfigure UART0_Rx pin GPIO3.0*/
      GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
      GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
      GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
      GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1  ;
      GPIO_Init (GPIO3, &GPIO_InitStructure);
    
     /*  GPIO_DeInit(GPIO3); */
      /*Gonfigure UART0_Tx pin GPIO3.1*/
      GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
      GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
      GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2  ;
      GPIO_Init (GPIO3, &GPIO_InitStructure);
    }
    
    /
    

Reply
  • I post the code again.
    Thank you for your help.

    Lillian

    int main()
    {
    
    #ifdef DEBUG
      debug();
    #endif
    
      /*CPU running @96MHZ*/
      MCLK_Config ();
    
      /* Configure the system clocks */
      SCU_Configuration();
    
      /* Configure the GPIO ports */
      GPIO_Configuration();
    
    
       /* UART0 configuration -------------------------------------------------------*/
      /* UART0 configured as follow:
            - Word Length = 7 Bits
            - Two Stop Bit
            - No parity
            - BaudRate = 115200 baud
            - Hardware flow control enabled (RTS and CTS signals)
            - Receive and transmit enabled
            - Receive and transmit FIFOs are enabled
            - Transmit and Receive FIFOs levels have 8 bytes depth
      */
      UART_InitStructure.UART_WordLength = UART_WordLength_8D;
      UART_InitStructure.UART_StopBits = UART_StopBits_1;
      UART_InitStructure.UART_Parity = UART_Parity_No ;
      UART_InitStructure.UART_BaudRate = 115200;
      UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
      UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx;
      UART_InitStructure.UART_FIFO = UART_FIFO_Disable;
    
      UART_DeInit(UART0);
      UART_Init(UART0, &UART_InitStructure);
    
       /* Enable the UART0 */
      UART_Cmd(UART0, ENABLE);
    
      /* EMI default configuration : Reset configuration*/
      EMI_DeInit();
    
    
      /**************************EMI configuration*********************************/
    
      EMI_StructInit(&EMI_InitStruct);
      /* Number of bus turnaround cycles added between read and write accesses.*/
      EMI_InitStruct.EMI_Bank_IDCY = 0x3 ;
    
      /* Number of wait states for read accesses*/
      //EMI_InitStruct.EMI_Bank_WSTRD = 0x3 ;
      EMI_InitStruct.EMI_Bank_WSTRD = 0x5 ;
      /* Number of wait states for write accesses*/
      //EMI_InitStruct.EMI_Bank_WSTWR = 0x3 ;
      EMI_InitStruct.EMI_Bank_WSTWR = 0x4 ;
    
      /*Output enable assertion delay from chip select assertion*/
      EMI_InitStruct.EMI_Bank_WSTROEN = 0x2;
    
      /*Write enable assertion delay from chip select assertion*/
      EMI_InitStruct.EMI_Bank_WSTWEN = 0x2;
    
      /*This member Controls the memory width*/
      EMI_InitStruct.EMI_Bank_MemWidth = EMI_Width_HalfWord;
    
      /*Write protection feature */
      EMI_InitStruct.EMI_Bank_WriteProtection =  EMI_Bank_NonWriteProtect;
    
      /*Use Bank1 (CS1)*/
      EMI_Init( EMI_Bank1, &EMI_InitStruct);
    
        /* Send a buffer from UART to hyperterminal */
      while(NbrOfDataToTransfer--)
      {
        UART_SendData(UART0, TxBuffer[TxCounter++]);
        while(UART_GetFlagStatus(UART0, UART_FLAG_TxFIFOFull) != RESET);
    
      }
    
    
     while (1)
      {
    
    
        /*Write in the external memory*/
    
        for (k = 0; k < 32; k++)
    
          *(u16*)(0x3C000000 + (k*2)) = Buffer_Write[k] ;
    //              *(u16*)(0x3C000000 + (k*2)) = 0x0101 ;
    
    
        /*Read from the external memory*/
    
        for (k = 0; k < 32; k++)
    
          Buffer_Read[k] = *(u16*)(0x3C000000 + (k * 2))  ;
    
        /*Comparaison*/
    
        /* Check the received data with the send ones */
        TransferStatus = Buffercmp(Buffer_Write, Buffer_Read, 32);
    
    
            if (TransferStatus != 0) UART_SendData(UART0, (u8)(TransferStatus+48));
    
    
      }
    
    }
    /*******************************************************************************
    * Function Name  : SCU_Configuration
    * Description    : Configures the system clocks.
    * Input          : None
    * Output         : None
    * Return         : None
    *******************************************************************************/
    void SCU_Configuration(void)
    {
    
      /* Enable the clock for EMI*/
      SCU_AHBPeriphClockConfig(__EMI | __EMI_MEM_CLK, ENABLE);
    
      /*BCLK=96Mhz*/
      SCU_EMIBCLKDivisorConfig(SCU_EMIBCLK_Div1);
    
      /*Enable the Mux mode*/
      SCU_EMIModeConfig(SCU_EMI_MUX);
    
      /*ALE length and polarity definition*/
      SCU_EMIALEConfig(SCU_EMIALE_LEN1, SCU_EMIALE_POLHigh);
    
      /* Enable the GPIO7 Clock */
      SCU_APBPeriphClockConfig(__GPIO7 , ENABLE);
      SCU_APBPeriphReset(__GPIO7,DISABLE);
    
      SCU_APBPeriphClockConfig(__UART0, ENABLE);
      SCU_APBPeriphReset(__UART0,DISABLE);
    
      /* Enable the GPIO2 Clock */
      SCU_APBPeriphClockConfig(__GPIO2, ENABLE);
      SCU_APBPeriphReset(__GPIO2,DISABLE);
      /* Enable the GPIO3 Clock */
      SCU_APBPeriphClockConfig(__GPIO3, ENABLE);
      SCU_APBPeriphReset(__GPIO3,DISABLE);
    
       /* Enable the GPIO8 Clock */
      SCU_APBPeriphClockConfig(__GPIO8, ENABLE);
      SCU_APBPeriphReset(__GPIO8,DISABLE);
      /* Enable the GPIO9 Clock */
      SCU_APBPeriphClockConfig(__GPIO9, ENABLE);
      SCU_APBPeriphReset(__GPIO9,DISABLE);
    
    }
    
    /*******************************************************************************
    * Function Name  : GPIO_Configuration
    * Description    : Configures the different GPIO ports.
    * Input          : None
    * Output         : None
    * Return         : None
    *******************************************************************************/
    void GPIO_Configuration(void)
    {
      /* GPIO8,GPIO9 Configuration*/
    
      GPIO_EMIConfig(ENABLE);
    
      /* GPIO7 Configuration */
      GPIO_DeInit(GPIO7);
      GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_7;
    
      GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
      GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2 ;
      GPIO_Init (GPIO7, &GPIO_InitStructure);
    
    //uart0 setup
    
      GPIO_DeInit(GPIO3);
      /*Gonfigure UART0_Rx pin GPIO3.0*/
      GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
      GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
      GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
      GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1  ;
      GPIO_Init (GPIO3, &GPIO_InitStructure);
    
     /*  GPIO_DeInit(GPIO3); */
      /*Gonfigure UART0_Tx pin GPIO3.1*/
      GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
      GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
      GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2  ;
      GPIO_Init (GPIO3, &GPIO_InitStructure);
    }
    
    /
    

Children
No data