123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- /*
- * Copyright (c) 2006-2021, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2018-12-04 Leo first version
- */
- #include <board.h>
- #include <rtthread.h>
- #include "drv_sram.h"
- #ifdef BSP_USING_SRAM
- #define DRV_DEBUG
- #define LOG_TAG "drv.sram"
- #include <drv_log.h>
- uint16_t RT_TxBuffer[RT_BUFFER_SIZE];
- uint16_t RT_RxBuffer[RT_BUFFER_SIZE];
- uint32_t WriteReadStatus = 0, Index = 0;
- #ifdef RT_USING_MEMHEAP_AS_HEAP
- static struct rt_memheap system_heap;
- #endif
- static int rt_hw_sram_Init(void)
- {
- int result = RT_EOK;
- XMC_Bank1_Type *XMC;
- XMC_NORSRAMInitType XMC_NORSRAMInitStructure;
- XMC_NORSRAMTimingInitType p;
- /* Init XMC pin */
- at32_msp_xmc_init(XMC);
- /*-- FSMC Configuration ------------------------------------------------------*/
- p.XMC_AdrOpTime = 0x04;
- p.XMC_AdrHoldTime = 0x04;
- p.XMC_DataOpTime = 0x0a;
- p.XMC_IntervalBetweenOP = 0x0;
- p.XMC_CLKPsc = 0x0;
- p.XMC_DataStableTime = 0x0;
- p.XMC_Mode = XMC_Mode_A;
- XMC_NORSRAMInitStructure.XMC_Bank = XMC_Bank1_NORSRAM3;
- XMC_NORSRAMInitStructure.XMC_DataAdrMux = XMC_DataAdrMux_Disable;
- XMC_NORSRAMInitStructure.XMC_Dev = XMC_Dev_SRAM;
- XMC_NORSRAMInitStructure.XMC_BusType = XMC_BusType_16b;
- XMC_NORSRAMInitStructure.XMC_EnableBurstMode = XMC_BurstMode_Disable;
- XMC_NORSRAMInitStructure.XMC_EnableAsynWait = XMC_AsynWait_Disable;
- XMC_NORSRAMInitStructure.XMC_WaitSignalLv = XMC_WaitSignalLv_Low;
- XMC_NORSRAMInitStructure.XMC_EnableBurstModeSplit = XMC_BurstModeSplit_Disable;
- XMC_NORSRAMInitStructure.XMC_WaitSignalConfig = XMC_WaitSignalConfig_BeforeWaitState;
- XMC_NORSRAMInitStructure.XMC_EnableWrite = XMC_WriteOperation_Enable;
- XMC_NORSRAMInitStructure.XMC_EnableWaitSignal = XMC_WaitSignal_Disable;
- XMC_NORSRAMInitStructure.XMC_EnableWriteTiming = XMC_WriteTiming_Disable;
- XMC_NORSRAMInitStructure.XMC_WriteBurstSyn = XMC_WriteBurstSyn_Disable;
- XMC_NORSRAMInitStructure.XMC_RWTimingStruct = &p;
- XMC_NORSRAMInitStructure.XMC_WTimingStruct = &p;
- XMC_NORSRAMInit(&XMC_NORSRAMInitStructure);
- /*!< Enable FSMC Bank1_SRAM Bank */
- XMC_NORSRAMCmd(XMC_Bank1_NORSRAM3, ENABLE);
- #ifdef RT_USING_MEMHEAP_AS_HEAP
- /* If RT_USING_MEMHEAP_AS_HEAP is enabled, SRAM is initialized to the heap */
- rt_memheap_init(&system_heap, "sram", (void *)EXT_SRAM_BEGIN, SRAM_LENGTH);
- #endif
- return result;
- }
- INIT_BOARD_EXPORT(rt_hw_sram_Init);
- #ifdef DRV_DEBUG
- #ifdef FINSH_USING_MSH
- /**
- * @brief Writes a Half-word buffer to the FSMC SRAM memory.
- * @param pBuffer : pointer to buffer.
- * @param WriteAddr : SRAM memory internal address from which the data will be
- * written.
- * @param NumHalfwordToWrite : number of half-words to write.
- * @retval None
- */
- static void SRAM_WriteBuffer(uint16_t* pBuffer, uint32_t WriteAddr, uint32_t NumHalfwordToWrite)
- {
- for(; NumHalfwordToWrite != 0; NumHalfwordToWrite--) /*!< while there is data to write */
- {
- /*!< Transfer data to the memory */
- *(uint16_t *) (EXT_SRAM_BEGIN + WriteAddr) = *pBuffer++;
- /*!< Increment the address*/
- WriteAddr += 2;
- }
- }
- /**
- * @brief Reads a block of data from the FSMC SRAM memory.
- * @param pBuffer : pointer to the buffer that receives the data read from the
- * SRAM memory.
- * @param ReadAddr : SRAM memory internal address to read from.
- * @param NumHalfwordToRead : number of half-words to read.
- * @retval None
- */
- static void SRAM_ReadBuffer(uint16_t* pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead)
- {
- for(; NumHalfwordToRead != 0; NumHalfwordToRead--) /*!< while there is data to read */
- {
- /*!< Read a half-word from the memory */
- *pBuffer++ = *(__IO uint16_t*) (EXT_SRAM_BEGIN + ReadAddr);
- /*!< Increment the address*/
- ReadAddr += 2;
- }
- }
- /**
- * @brief Fill the global buffer
- * @param pBuffer: pointer on the Buffer to fill
- * @param BufferSize: size of the buffer to fill
- * @param Offset: first value to fill on the Buffer
- */
- static void Fill_Buffer(uint16_t *pBuffer, uint16_t BufferLenght, uint32_t Offset)
- {
- uint16_t IndexTmp = 0;
- /* Put in global buffer same values */
- for (IndexTmp = 0; IndexTmp < BufferLenght; IndexTmp++ )
- {
- pBuffer[IndexTmp] = IndexTmp + Offset;
- }
- }
- int sram_test(void)
- {
- /* Write data to XMC SRAM memory */
- /* Fill the buffer to send */
- Fill_Buffer(RT_TxBuffer, RT_BUFFER_SIZE, 0x3212);
- SRAM_WriteBuffer(RT_TxBuffer, RT_WRITE_READ_ADDR, RT_BUFFER_SIZE);
- /* Read data from XMC SRAM memory */
- SRAM_ReadBuffer(RT_RxBuffer, RT_WRITE_READ_ADDR, RT_BUFFER_SIZE);
- /* Read back SRAM memory and check content correctness */
- for (Index = 0x00; (Index < RT_BUFFER_SIZE) && (WriteReadStatus == 0); Index++)
- {
- if (RT_RxBuffer[Index] != RT_TxBuffer[Index])
- {
- WriteReadStatus = Index + 1;
- }
- }
- if(WriteReadStatus == 0)
- {
- LOG_D("SRAM test success!");
- }
- else
- {
- LOG_E("SRAM test failed!");
- }
- return RT_EOK;
- }
- MSH_CMD_EXPORT(sram_test, sram test)
- #endif /* FINSH_USING_MSH */
- #endif /* DRV_DEBUG */
- #endif /* BSP_USING_SRAM */
|