斥巨资买了一块STM32F746G-DISCO开发板,上电工作正常。应该不存在硬件或PCB布线问题。我想仔细的研究一下STM32的所有硬件接口,就开始做实验,但是就是一个SDRAM的实验就让我很崩溃。
过程如下:使用STM32CubeMX最新版6.10.0,参考BOARD Selector的设计,设置了一个简单应用。
参数于参考相同。GPIO的设置也相同,这点很重要,因为默认的GPIO和板子的设计是有出入的。需要修改PC3的引脚。
修改完成后,需要修改CLOCK的设置也要与开发板相同。
因为很多的外设没有设置,所以和参考设计有些出入。但是基本是相同的。接下来就是程序了。代码如下:
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t sdramv[1000] __attribute__ ((at(0xC0000000)));
/* 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_FMC_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
/* USER CODE END 2 */
sdramv[0] = 1000;
sdramv[1] = 2000;
// for(int16_t i=2;i<2000;i++)
// {
// sdramv[i]=(int16_t)i;
// }
printf("value=%d\n",sdramv[0]);
printf("value=%d\n",sdramv[1]);
// for(int16_t i=0;i<2;i++)
// {
// printf("value=%d\n",sdramv[i]);
// }
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(100);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
代码主要是使用一个数组读写数据和printf输出内存数据,检验程序是否成功。
这个程序运行结果与预期相同。但是将程序修改成循环就不一样了。
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t sdramv[1000] __attribute__ ((at(0xC0000000)));
/* 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_FMC_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
/* USER CODE END 2 */
// sdramv[0] = 1000;
// sdramv[1] = 2000;
for(int16_t i=0;i<2;i++)
{
sdramv[i]=(int16_t)i;
}
// printf("value=%d\n",sdramv[0]);
// printf("value=%d\n",sdramv[1]);
for(int16_t i=0;i<2;i++)
{
printf("value=%d\n",sdramv[i]);
}
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(100);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
程序就卡在这里无法继续。程序根本就到不了循环。
程序逻辑上应该没有什么不一样的。请知道的高手给指导。
|