(实验记录)关于stm32cube对SRAM的操作和设置

参考的官方EVAL板的sram实验程序修改为stm32f407discovery板实用,
sram采用IS62WV51216BLL,
A0~A18地址线,D0~D15数据线
文档和stm32cubemx设置如下:


无标题.png


电路连接如下:

5.png


设置如下:

1.png


3.png



2.png


仿真结果如下:

4.png


结果:验证写入和读出正确.
主函数main程序如下:


/[i] Includes ------------------------------------------------------------------[/i]/
#include "stm32f4xx_hal.h"
#include "gpio.h"
#include "fsmc.h"

/[i] USER CODE BEGIN Includes [/i]/
#define SRAM_BANK_ADDR ((uint32_t)0x64000000)
/[i] USER CODE END Includes [/i]/

/[i] Private variables ---------------------------------------------------------[/i]/

/[i] USER CODE BEGIN PV [/i]/

/[i] USER CODE END PV [/i]/

/[i] Private function prototypes -----------------------------------------------[/i]/
void SystemClock_Config(void);

/[i] USER CODE BEGIN PFP [/i]/

/[i] USER CODE END PFP [/i]/

/[i] USER CODE BEGIN 0 [/i]/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;


#define BUFFER_SIZE ((uint32_t)0x0100)
#define WRITE_READ_ADDR ((uint32_t)0x0800)

uint16_t aTxBuffer;
uint16_t aRxBuffer;

__IO uint32_t uwWriteReadStatus = 0;
uint32_t uwIndex = 0;

static void Fill_Buffer(uint16_t *pBuffer, uint32_t uwBufferLenght, uint16_t uwOffset);
static TestStatus Buffercmp(uint16_t [i]pBuffer1, uint16_t [/i]pBuffer2, uint16_t BufferLength);


/[i] USER CODE END 0 [/i]/

int main(void)
{

/[i] USER CODE BEGIN 1 [/i]/

/[i] USER CODE END 1 [/i]/

/[i] MCU Configuration----------------------------------------------------------[/i]/

/[i] Reset of all peripherals, Initializes the Flash interface and the Systick. [/i]/
HAL_Init();

/[i] Configure the system clock [/i]/
SystemClock_Config();

/[i] Initialize all configured peripherals [/i]/
MX_GPIO_Init();
MX_FSMC_Init();

/[i] USER CODE BEGIN 2 [/i]/

Fill_Buffer(aTxBuffer, BUFFER_SIZE, 0xC20F);

for (uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
{
[url=__IO uint16_t[/i]]i[/url] (SRAM_BANK_ADDR + WRITE_READ_ADDR + 2*uwIndex) = aTxBuffer;
}

/[i] Read back data from the SRAM memory [/i]/
for (uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
{
aRxBuffer = [url=__IO uint16_t[/i]]i[/url] (SRAM_BANK_ADDR + WRITE_READ_ADDR + 2*uwIndex);
}

/[i][size=16]-3- Checking data integrity [/size]####################################[size=16]#[size=16]#[/i]/ [/size][/size]
uwWriteReadStatus = Buffercmp(aTxBuffer, aRxBuffer, BUFFER_SIZE);

if (uwWriteReadStatus != PASSED)
{
/[i] KO [/i]/
/[i] Turn on LED2 [/i]/
while(1)
{
HAL_Delay (300);
HAL_GPIO_TogglePin (GPIOF,GPIO_PIN_6);
}
}
else
{
/[i] OK [/i]/
/[i] Turn on LED1 [/i]/
while(1)
{
HAL_Delay (1000);
HAL_GPIO_TogglePin (GPIOF,GPIO_PIN_6);
}
}

/[i] USER CODE END 2 [/i]/

/[i] USER CODE BEGIN 3 [/i]/
/[i] Infinite loop [/i]/
while (1)
{
HAL_Delay (2000);
HAL_GPIO_TogglePin (GPIOF,GPIO_PIN_6);
}
/[i] USER CODE END 3 [/i]/

}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;

__PWR_CLK_ENABLE();

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

}

/[i] USER CODE BEGIN 4 [/i]/
static void Fill_Buffer(uint16_t *pBuffer, uint32_t uwBufferLenght, uint16_t uwOffset)
{
uint16_t tmpIndex = 0;

/[i] Put in global buffer different values [/i]/
for (tmpIndex = 0; tmpIndex < uwBufferLenght; tmpIndex++ )
{
pBuffer = tmpIndex + uwOffset;
}
}

/**
* @brief Compares two buffers.
* @param pBuffer1, pBuffer2: buffers to be compared.
* @param BufferLength: buffer's length
* @retval PASSED: pBuffer identical to pBuffer1
* FAILED: pBuffer differs from pBuffer1
*/
static TestStatus Buffercmp(uint16_t[i] pBuffer1, uint16_t[/i] pBuffer2, uint16_t BufferLength)
{
while (BufferLength--)
{
if ([i]pBuffer1 != [/i]pBuffer2)
{
return FAILED;
}

pBuffer1++;
pBuffer2++;
}

return PASSED;
}

/[i] USER CODE END 4 [/i]/


本程序提供下载: 区,文件名:最新stm32f407zgt-sram-cubemx.zip
已邀请:

admin

赞同来自: wuqiling

以上是参考官方的例子写的,但是官方的库函数里面已经有了这样的读写封装,于是我再次修改了使用方法,
如下: 只修改了读写部分的代码
HAL_SRAM_Write_16b (&hsram1 ,(uint32_t *)(SRAM_BANK_ADDR + WRITE_READ_ADDR),aTxBuffer ,0x100);//写

HAL_SRAM_Read_16b (&hsram1 ,(uint32_t *)(SRAM_BANK_ADDR + WRITE_READ_ADDR),aRxBuffer ,0x100);//读


以上的各种setup时间我按照最长的来的(人懒没办法~~)
时间设置要参考芯片的datasheet文档,里面有计算方法........
有知道计算方法的可以来分享下吗?

admin

赞同来自: popdes L

有人问为什么是0x640000000,额,这个芯片的fsmc里有讲的....

7.png

admin

赞同来自: L 981868085@qq.com

通过sheetdata文档和实验测得,时钟在168M的时候,

8.png

上面的图片是这个芯片的文档说明里面的.
看到地址的建立和保持时间都可以是0
而数据的建立时间30ns.
而我们系统时钟是168M相当于5.96ns,也就是只能算成5ns来用
所以按照5ns x 6 = 30ns ,但是考虑到其他因素,将时间放长到7
所以得到以下时间:


Timing.AddressSetupTime = 0;
Timing.AddressHoldTime = 0;
Timing.DataSetupTime = 7;


将上面的程序替换为这个时间,可以大大的加快sram的读写速度.

以上,结束.
本文相关程序已发布到本站 **** 区,大家可以参考使用.

wn1900 - 90H

赞同来自:

很好很好,还没验证,哈哈,一起进步

YJ

赞同来自:

有没有关于stm32cube对SDRAM的操作和设置啊

默以太

赞同来自: Ambrco

我已经验证,HAL_SRAM_Write_16b,HAL_SRAM_Read_16b 读写OK .

____________________

赞同来自:


写入后读出来为什么都是读出的最后一个数值,这官方函数有

问题吗?




/**

  ******************************************************************************

  * File Name          : main.h

  * Description        : This file contains the common defines of the application

  ******************************************************************************

  ** This notice applies to any and all portions of this file

  * that are not between comment pairs USER CODE BEGIN and

  * USER CODE END. Other portions of this file, whether 

  * inserted by the user or by software development tools

  * are owned by their respective copyright owners.

  *

  * COPYRIGHT(c) 2017 STMicroelectronics

  *

  * Redistribution and use in source and binary forms, with or without modification,

  * are permitted provided that the following conditions are met:

  *   1. Redistributions of source code must retain the above copyright notice,

  *      this list of conditions and the following disclaimer.

  *   2. Redistributions in binary form must reproduce the above copyright notice,

  *      this list of conditions and the following disclaimer in the documentation

  *      and/or other materials provided with the distribution.

  *   3. Neither the name of STMicroelectronics nor the names of its contributors

  *      may be used to endorse or promote products derived from this software

  *      without specific prior written permission.

  *

  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE

  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR

  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER

  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,

  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  *

  ******************************************************************************

  */

/* Define to prevent recursive inclusion -------------------------------------*/

#ifndef __MAIN_H

#define __MAIN_H

  /* Includes ------------------------------------------------------------------*/


/* USER CODE BEGIN Includes */


/* USER CODE END Includes */


/* Private define ------------------------------------------------------------*/


#define LED1_Pin GPIO_PIN_1

#define LED1_GPIO_Port GPIOA

#define LED2_Pin GPIO_PIN_2

#define LED2_GPIO_Port GPIOA


/* USER CODE BEGIN Private defines */

#define SRAM_BANK_ADDR                 ((uint32_t)0x68000000)


/* #define SRAM_MEMORY_WIDTH            FMC_NORSRAM_MEM_BUS_WIDTH_8  */

#define SRAM_MEMORY_WIDTH               FMC_NORSRAM_MEM_BUS_WIDTH_16



#define SRAM_TIMEOUT     ((uint32_t)0xFFFF)


/* USER CODE END Private defines */


void _Error_Handler(char *, int);


#define Error_Handler() _Error_Handler(__FILE__, __LINE__)


/**

  * @}

  */ 


/**

  * @}

*/ 


#endif /* __MAIN_H */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/




/**

  ******************************************************************************

  * File Name          : main.c

  * Description        : Main program body

  ******************************************************************************

  ** This notice applies to any and all portions of this file

  * that are not between comment pairs USER CODE BEGIN and

  * USER CODE END. Other portions of this file, whether 

  * inserted by the user or by software development tools

  * are owned by their respective copyright owners.

  *

  * COPYRIGHT(c) 2017 STMicroelectronics

  *

  * Redistribution and use in source and binary forms, with or without modification,

  * are permitted provided that the following conditions are met:

  *   1. Redistributions of source code must retain the above copyright notice,

  *      this list of conditions and the following disclaimer.

  *   2. Redistributions in binary form must reproduce the above copyright notice,

  *      this list of conditions and the following disclaimer in the documentation

  *      and/or other materials provided with the distribution.

  *   3. Neither the name of STMicroelectronics nor the names of its contributors

  *      may be used to endorse or promote products derived from this software

  *      without specific prior written permission.

  *

  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE

  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR

  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER

  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,

  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  *

  ******************************************************************************

  */

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "stm32f7xx_hal.h"

#include "usart.h"

#include "gpio.h"

#include "fmc.h"


/* USER CODE BEGIN Includes */


/* USER CODE END Includes */


/* Private variables ---------------------------------------------------------*/


/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

#define BUFFER_SIZE         ((uint32_t)0x0040)

#define WRITE_READ_ADDR     ((uint32_t)0x0400)

#define WRITING_OFFSET      ((uint32_t)0xC20F)

/* Read/Write Buffers */

static uint16_t aTxBuffer[BUFFER_SIZE];

static uint16_t aRxBuffer[BUFFER_SIZE];


/* Status variables */

__IO uint32_t uwWriteReadStatus = 0;


/* Counter index */

uint32_t uwIndex = 0;

/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);


/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/


/* USER CODE END PFP */


/* USER CODE BEGIN 0 */

static void Fill_Buffer(uint16_t *pBuffer, uint32_t uwBufferLength, uint32_t uwOffset);

static uint8_t Buffercmp(uint16_t *pBuffer1, uint16_t *pBuffer2, uint16_t BufferLength);

/* USER CODE END 0 */


int main(void)

{


  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration----------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_UART4_Init();

  MX_FMC_Init();

  HAL_Delay (2000);

  /* USER CODE BEGIN 2 */

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);

    /*##-2- SRAM memory read/write access ######################################*/

  /* Fill the buffer to write */

  Fill_Buffer(aTxBuffer, BUFFER_SIZE, WRITING_OFFSET);


  /* Write data to the SRAM memory */

  if( HAL_OK==HAL_SRAM_Write_16b(&hsram1, (uint32_t *)(SRAM_BANK_ADDR + WRITE_READ_ADDR), aTxBuffer, BUFFER_SIZE))

  {

    printf ("\n\r SRAM Write OK \n\r");

  }


  /* Read back data from the SRAM memory */

  if( HAL_OK==HAL_SRAM_Read_16b(&hsram1, (uint32_t *)(SRAM_BANK_ADDR + WRITE_READ_ADDR), aRxBuffer, 0X40))

  {

    printf ("\n\r SRAM Read OK \n\r");

  }


  /*##-3- Checking data integrity ############################################*/

  uwWriteReadStatus = Buffercmp(aTxBuffer, aRxBuffer, BUFFER_SIZE);


  if(uwWriteReadStatus) /* ERR */

  {

    /* Turn on LED2 */

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);

    printf ("err\n\r");

  }

  else /* OK */

  {

    /* Turn on LED1 */

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);

    printf ("OK\n\r");

  }


  

  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

  /* USER CODE END WHILE */


  /* USER CODE BEGIN 3 */


  }

  /* USER CODE END 3 */


}


/** System Clock Configuration

*/

void SystemClock_Config(void)

{


  RCC_OscInitTypeDef RCC_OscInitStruct;

  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;


    /**Configure the main internal regulator output voltage 

    */

  __HAL_RCC_PWR_CLK_ENABLE();


  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);


    /**Initializes the CPU, AHB and APB busses clocks 

    */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.HSICalibrationValue = 16;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLM = 12;

  RCC_OscInitStruct.PLL.PLLN = 216;

  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;

  RCC_OscInitStruct.PLL.PLLQ = 2;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }


    /**Activate the Over-Drive mode 

    */

  if (HAL_PWREx_EnableOverDrive() != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }


    /**Initializes the CPU, AHB and APB busses clocks 

    */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;


  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }


  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_UART4;

  PeriphClkInitStruct.Uart4ClockSelection = RCC_UART4CLKSOURCE_HSI;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }


    /**Configure the Systick interrupt time 

    */

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);


    /**Configure the Systick 

    */

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);


  /* SysTick_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}


/* USER CODE BEGIN 4 */

#ifdef __GNUC__

  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf

     set to 'Yes') calls __io_putchar() */

  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /* __GNUC__ */

/**

  * @brief  Retargets the C library printf function to the USART.

  * @param  None

  * @retval None

  */

PUTCHAR_PROTOTYPE

{

  /* Place your implementation of fputc here */

  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */

  HAL_UART_Transmit(&huart4, (uint8_t *)&ch, 1, 0xFFFF);

 

  return ch;

}

/**

  * @brief  Fills buffer with user predefined data.

  * @param  pBuffer: pointer on the buffer to fill

  * @param  uwBufferLength: size of the buffer to fill

  * @param  uwOffset: first value to fill on the buffer

  * @retval None

  */

static void Fill_Buffer(uint16_t *pBuffer, uint32_t uwBufferLength, uint32_t uwOffset)

{

  uint32_t tmpindex = 0;


  /* Put in global buffer different values */

  for (tmpindex = 0; tmpindex < uwBufferLength; tmpindex++ )

  {

    pBuffer[tmpindex] = tmpindex + uwOffset;

  }

}


/**

  * @brief  Compares two buffers.

  * @param  pBuffer1, pBuffer2: buffers to be compared.

  * @param  BufferLength: buffer's length

  * @retval 1: pBuffer identical to pBuffer1

  *         0: pBuffer differs from pBuffer1

  */

static uint8_t Buffercmp(uint16_t* pBuffer1, uint16_t* pBuffer2, uint16_t BufferLength)

{

  while (BufferLength--)

  {

    if (*pBuffer1 != *pBuffer2)

    {

      return 1;

    }


    pBuffer1++;

    pBuffer2++;

  }


  return 0;

}


/* USER CODE END 4 */


/**

  * @brief  This function is executed in case of error occurrence.

  * @param  None

  * @retval None

  */

void _Error_Handler(char * file, int line)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */

  while(1) 

  {

  }

  /* USER CODE END Error_Handler_Debug */ 

}


#ifdef USE_FULL_ASSERT


/**

   * @brief Reports the name of the source file and the source line number

   * where the assert_param error has occurred.

   * @param file: pointer to the source file name

   * @param line: assert_param error line source number

   * @retval None

   */

void assert_failed(uint8_t* file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */


}


#endif


/**

  * @}

  */ 


/**

  * @}

*/ 


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

QQ截图20170830110114.jpg



admin

赞同来自:

堆叠代码没有任何意义,自己查内存,一步步找

edisondeng

赞同来自:

  请问下载区的文件在哪里?

秀起来

赞同来自:

时钟怎么设置啊


要回复问题请先登录注册