123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414 |
- /* USER CODE BEGIN Header */
- /**
- ******************************************************************************
- * File Name : FSMC.c
- * Description : This file provides code for the configuration
- * of the FSMC peripheral.
- ******************************************************************************
- * @attention
- *
- * Copyright (c) 2024 STMicroelectronics.
- * All rights reserved.
- *
- * This software is licensed under terms that can be found in the LICENSE file
- * in the root directory of this software component.
- * If no LICENSE file comes with this software, it is provided AS-IS.
- *
- ******************************************************************************
- */
- /* USER CODE END Header */
- /* Includes ------------------------------------------------------------------*/
- #include "bsp_fsmc_sram.h"
- /* USER CODE BEGIN 0 */
- /* USER CODE END 0 */
- SRAM_HandleTypeDef hsram1;
- /* FSMC initialization function */
- void MX_FSMC_SRAM_Init(void)
- {
- /* USER CODE BEGIN FSMC_Init 0 */
- /* USER CODE END FSMC_Init 0 */
- FSMC_NORSRAM_TimingTypeDef Timing = {0};
- /* USER CODE BEGIN FSMC_Init 1 */
- /* USER CODE END FSMC_Init 1 */
- /** Perform the SRAM1 memory initialization sequence
- */
- hsram1.Instance = FSMC_NORSRAM_DEVICE;
- hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
- /* hsram1.Init */
- hsram1.Init.NSBank = FSMC_NORSRAM_BANK3;
- hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
- hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
- hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
- hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
- hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
- hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
- hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
- hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
-
- hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
- hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
- hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
- hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
- /* Timing */
- Timing.AddressSetupTime = 2;
- Timing.AddressHoldTime = 0;
- Timing.DataSetupTime = 0;
- Timing.BusTurnAroundDuration = 0;
- Timing.CLKDivision = 15;
- Timing.DataLatency = 15;
- Timing.AccessMode = FSMC_ACCESS_MODE_A;
- /* ExtTiming */
- if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
- {
- return ;
- }
- /* USER CODE BEGIN FSMC_Init 2 */
- /* USER CODE END FSMC_Init 2 */
- }
- static uint32_t FSMC_Initialized = 0;
- static void HAL_FSMC_MspInit(void){
- /* USER CODE BEGIN FSMC_MspInit 0 */
- /* USER CODE END FSMC_MspInit 0 */
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- if (FSMC_Initialized) {
- return;
- }
- FSMC_Initialized = 1;
- /* Peripheral clock enable */
- __HAL_RCC_FSMC_CLK_ENABLE();
-
- __HAL_RCC_GPIOD_CLK_ENABLE();
- __HAL_RCC_GPIOE_CLK_ENABLE();
- __HAL_RCC_GPIOF_CLK_ENABLE();
- __HAL_RCC_GPIOG_CLK_ENABLE();
- /** FSMC GPIO Configuration
- PF0 ------> FSMC_A0
- PF1 ------> FSMC_A1
- PF2 ------> FSMC_A2
- PF3 ------> FSMC_A3
- PF4 ------> FSMC_A4
- PF5 ------> FSMC_A5
- PF12 ------> FSMC_A6
- PF13 ------> FSMC_A7
- PF14 ------> FSMC_A8
- PF15 ------> FSMC_A9
- PG0 ------> FSMC_A10
- PG1 ------> FSMC_A11
- PE7 ------> FSMC_D4
- PE8 ------> FSMC_D5
- PE9 ------> FSMC_D6
- PE10 ------> FSMC_D7
- PE11 ------> FSMC_D8
- PE12 ------> FSMC_D9
- PE13 ------> FSMC_D10
- PE14 ------> FSMC_D11
- PE15 ------> FSMC_D12
- PD8 ------> FSMC_D13
- PD9 ------> FSMC_D14
- PD10 ------> FSMC_D15
- PD11 ------> FSMC_A16
- PD12 ------> FSMC_A17
- PD13 ------> FSMC_A18
- PD14 ------> FSMC_D0
- PD15 ------> FSMC_D1
- PG2 ------> FSMC_A12
- PG3 ------> FSMC_A13
- PG4 ------> FSMC_A14
- PG5 ------> FSMC_A15
- PD0 ------> FSMC_D2
- PD1 ------> FSMC_D3
- PD4 ------> FSMC_NOE
- PD5 ------> FSMC_NWE
- PG10 ------> FSMC_NE3
- PE0 ------> FSMC_NBL0
- PE1 ------> FSMC_NBL1
- */
- /* GPIO_InitStruct */
- GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
- |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_12|GPIO_PIN_13
- |GPIO_PIN_14|GPIO_PIN_15;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
- HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
- /* GPIO_InitStruct */
- GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
- |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
- HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
- /* GPIO_InitStruct */
- GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
- |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
- |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
- HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
- /* GPIO_InitStruct */
- GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
- |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15
- |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- /* USER CODE BEGIN FSMC_MspInit 1 */
- /* USER CODE END FSMC_MspInit 1 */
- }
- void HAL_SRAM_MspInit(SRAM_HandleTypeDef* sramHandle){
- /* USER CODE BEGIN SRAM_MspInit 0 */
- /* USER CODE END SRAM_MspInit 0 */
- HAL_FSMC_MspInit();
- /* USER CODE BEGIN SRAM_MspInit 1 */
- /* USER CODE END SRAM_MspInit 1 */
- }
- static uint32_t FSMC_DeInitialized = 0;
- static void HAL_FSMC_MspDeInit(void){
- /* USER CODE BEGIN FSMC_MspDeInit 0 */
- /* USER CODE END FSMC_MspDeInit 0 */
- if (FSMC_DeInitialized) {
- return;
- }
- FSMC_DeInitialized = 1;
- /* Peripheral clock enable */
- __HAL_RCC_FSMC_CLK_DISABLE();
-
- /** FSMC GPIO Configuration
- PF0 ------> FSMC_A0
- PF1 ------> FSMC_A1
- PF2 ------> FSMC_A2
- PF3 ------> FSMC_A3
- PF4 ------> FSMC_A4
- PF5 ------> FSMC_A5
- PF12 ------> FSMC_A6
- PF13 ------> FSMC_A7
- PF14 ------> FSMC_A8
- PF15 ------> FSMC_A9
- PG0 ------> FSMC_A10
- PG1 ------> FSMC_A11
- PE7 ------> FSMC_D4
- PE8 ------> FSMC_D5
- PE9 ------> FSMC_D6
- PE10 ------> FSMC_D7
- PE11 ------> FSMC_D8
- PE12 ------> FSMC_D9
- PE13 ------> FSMC_D10
- PE14 ------> FSMC_D11
- PE15 ------> FSMC_D12
- PD8 ------> FSMC_D13
- PD9 ------> FSMC_D14
- PD10 ------> FSMC_D15
- PD11 ------> FSMC_A16
- PD12 ------> FSMC_A17
- PD13 ------> FSMC_A18
- PD14 ------> FSMC_D0
- PD15 ------> FSMC_D1
- PG2 ------> FSMC_A12
- PG3 ------> FSMC_A13
- PG4 ------> FSMC_A14
- PG5 ------> FSMC_A15
- PD0 ------> FSMC_D2
- PD1 ------> FSMC_D3
- PD4 ------> FSMC_NOE
- PD5 ------> FSMC_NWE
- PG10 ------> FSMC_NE3
- PE0 ------>FSMC_NBL0
- PE1 ------>FSMC_NBL1
- */
- HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
- |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_12|GPIO_PIN_13
- |GPIO_PIN_14|GPIO_PIN_15);
- HAL_GPIO_DeInit(GPIOG, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
- |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10);
- HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
- |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
- |GPIO_PIN_15);
- HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
- |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15
- |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5);
- /* USER CODE BEGIN FSMC_MspDeInit 1 */
- /* USER CODE END FSMC_MspDeInit 1 */
- }
- void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef* sramHandle){
- /* USER CODE BEGIN SRAM_MspDeInit 0 */
- /* USER CODE END SRAM_MspDeInit 0 */
- HAL_FSMC_MspDeInit();
- /* USER CODE BEGIN SRAM_MspDeInit 1 */
- /* USER CODE END SRAM_MspDeInit 1 */
- }
- /**
- * @brief 以“字”为单位向sdram写入数据
- * @param pBuffer: 指向数据的指针
- * @param uwWriteAddress: 要写入的SRAM内部地址
- * @param uwBufferSize: 要写入数据大小
- * @retval None.
- */
- void SRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize)
- {
- __IO uint32_t write_pointer = (uint32_t)uwWriteAddress;
-
- /* 循环写入数据 */
- for (; uwBufferSize != 0; uwBufferSize--)
- {
- /* 发送数据到SRAM */
- *(uint32_t *) (Bank1_SRAM3_ADDR + write_pointer) = *pBuffer++;
- /* 地址自增*/
- write_pointer += 4;
- }
-
- }
- /**
- * @brief 从SRAM中读取数据
- * @param pBuffer: 指向存储数据的buffer
- * @param ReadAddress: 要读取数据的地十
- * @param uwBufferSize: 要读取的数据大小
- * @retval None.
- */
- void SRAM_ReadBuffer(uint32_t* pBuffer, uint32_t uwReadAddress, uint32_t uwBufferSize)
- {
- __IO uint32_t write_pointer = (uint32_t)uwReadAddress;
-
-
- /*读取数据 */
- for(; uwBufferSize != 0x00; uwBufferSize--)
- {
- *pBuffer++ = *(__IO uint32_t *)(Bank1_SRAM3_ADDR + write_pointer );
-
- /* 地址自增*/
- write_pointer += 4;
- }
- }
- /**
- * @brief 测试SRAM是否正常
- * @param None
- * @retval 正常返回1,异常返回0
- */
- uint8_t SRAM_Test(void)
- {
- /*写入数据计数器*/
- uint32_t counter=0;
-
- /* 8位的数据 */
- uint8_t ubWritedata_8b = 0, ubReaddata_8b = 0;
-
- /* 16位的数据 */
- uint16_t uhWritedata_16b = 0, uhReaddata_16b = 0;
-
- /*按8位格式读写数据,并校验*/
-
- /* 把SRAM数据全部重置为0 ,IS62WV51216_SIZE是以8位为单位的 */
- for (counter = 0x00; counter < IS62WV51216_SIZE; counter++)
- {
- *(__IO uint8_t*) (Bank1_SRAM3_ADDR + counter) = (uint8_t)0x0;
- }
-
- /* 向整个SRAM写入数据 8位 */
- for (counter = 0; counter < IS62WV51216_SIZE; counter++)
- {
- *(__IO uint8_t*) (Bank1_SRAM3_ADDR + counter) = (uint8_t)(ubWritedata_8b + counter);
- }
-
- /* 读取 SRAM 数据并检测*/
- for(counter = 0; counter<IS62WV51216_SIZE;counter++ )
- {
- ubReaddata_8b = *(__IO uint8_t*)(Bank1_SRAM3_ADDR + counter); //从该地址读出数据
-
- if(ubReaddata_8b != (uint8_t)(ubWritedata_8b + counter)) //检测数据,若不相等,跳出函数,返回检测失败结果。
- {
- return 0;
- }
- }
-
- /*按16位格式读写数据,并检测*/
-
- /* 把SRAM数据全部重置为0 */
- for (counter = 0x00; counter < IS62WV51216_SIZE/2; counter++)
- {
- *(__IO uint16_t*) (Bank1_SRAM3_ADDR + 2*counter) = (uint16_t)0x00;
- }
-
- /* 向整个SRAM写入数据 16位 */
- for (counter = 0; counter < IS62WV51216_SIZE/2; counter++)
- {
- *(__IO uint16_t*) (Bank1_SRAM3_ADDR + 2*counter) = (uint16_t)(uhWritedata_16b + counter);
- }
-
- /* 读取 SRAM 数据并检测*/
- for(counter = 0; counter<IS62WV51216_SIZE/2;counter++ )
- {
- uhReaddata_16b = *(__IO uint16_t*)(Bank1_SRAM3_ADDR + 2*counter); //从该地址读出数据
-
- if(uhReaddata_16b != (uint16_t)(uhWritedata_16b + counter)) //检测数据,若不相等,跳出函数,返回检测失败结果。
- {
- return 0;
- }
- }
-
- /*检测正常,return 1 */
- return 1;
- }
- /**
- * @}
- */
|