STM32H750XB_RT-THREAD/48-MDK编译过程及文件全解/SCT文件应用/2.优先使用内部SRAM并把堆分配到SDRAM空间/User/main.c
2025-07-21 14:34:29 +08:00

185 lines
5.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2018-xx-xx
* @brief FMC-SDRAM
******************************************************************
* @attention
*
* 实验平台:野火 STM32H750开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :http://firestm32.taobao.com
*
******************************************************************
*/
#include <stdlib.h>
#include "stm32h7xx.h"
#include "main.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_usart.h"
#include "./sdram/bsp_sdram.h"
#include "./delay/core_delay.h"
void SystemClock_Config(void);
void Delay(__IO uint32_t nCount);
//设置变量定义到“EXRAM”节区的宏
#define __EXRAM __attribute__ ((section ("EXRAM")))
//定义变量到SDRAM
uint32_t testValue __EXRAM =7 ;
//上述语句等效于:
//uint32_t testValue __attribute__ ((section ("EXRAM"))) =7 ;
//定义变量到SRAM
uint32_t testValue2 =7 ;
//定义数组到SDRAM
uint8_t testGrup[3] __EXRAM ={1,2,3};
//定义数组到SRAM
uint8_t testGrup2[3] ={1,2,3};
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
uint32_t inerTestValue =10;
uint32_t * pointer;
/* 系统时钟初始化成400 MHz */
SystemClock_Config();
/* LED 端口初始化 */
LED_GPIO_Config();
/* 初始化串口 */
UARTx_Config();
printf("\r\nSCT文件应用——自动分配变量到SDRAM实验\r\n");
printf("\r\n使用“ uint32_t inerTestValue =10; ”语句定义的局部变量:\r\n");
printf("结果它的地址为0x%x,变量值为:%d\r\n",(uint32_t)&inerTestValue,inerTestValue);
printf("\r\n使用“uint32_t testValue =7 ;”语句定义的全局变量:\r\n");
printf("结果它的地址为0x%x,变量值为:%d\r\n",(uint32_t)&testValue,testValue);
printf("\r\n使用“uint32_t testValue2 =0 ; ”语句定义的全局变量:\r\n");
printf("结果它的地址为0x%x,变量值为:%d\r\n",(uint32_t)&testValue2,testValue2);
printf("\r\n使用“uint8_t testGrup[100] ={0};”语句定义的全局数组:\r\n");
printf("结果它的地址为0x%x,变量值为:%d,%d,%d\r\n",(uint32_t)&testGrup,testGrup[0],testGrup[1],testGrup[2]);
printf("\r\n使用“uint8_t testGrup2[100] ={1,2,3};”语句定义的全局数组:\r\n");
printf("结果它的地址为0x%x,变量值为:%d%d,%d\r\n",(uint32_t)&testGrup2,testGrup2[0],testGrup2[1],testGrup2[2]);
pointer = (uint32_t*)malloc(sizeof(uint32_t)*3);
if(pointer != NULL)
{
*(pointer)=1;
*(++pointer)=2;
*(++pointer)=3;
printf("\r\n使用“ uint32_t *pointer = (uint32_t*)malloc(sizeof(uint32_t)*3); ”动态分配的变量\r\n");
printf("\r\n定义后的操作为:\r\n*(pointer++)=1;\r\n*(pointer++)=2;\r\n*pointer=3;");
printf("\r\n结果操作后它的地址为0x%x,查看变量值操作:\r\n",(uint32_t)pointer);
printf("*(pointer--)=%d, \r\n",*(pointer--));
printf("*(pointer--)=%d, \r\n",*(pointer--));
printf("*(pointer)=%d, \r\n",*(pointer));
}
else
{
printf("\r\n使用malloc动态分配变量出错\r\n");
}
/*绿灯亮*/
LED_BLUE;
while(1);
}
/**
* @brief System Clock 配置
* system Clock 配置如下:
* System Clock source = PLL (HSE)
* SYSCLK(Hz) = 400000000 (CPU Clock)
* HCLK(Hz) = 200000000 (AXI and AHBs Clock)
* AHB Prescaler = 2
* D1 APB3 Prescaler = 2 (APB3 Clock 100MHz)
* D2 APB1 Prescaler = 2 (APB1 Clock 100MHz)
* D2 APB2 Prescaler = 2 (APB2 Clock 100MHz)
* D3 APB4 Prescaler = 2 (APB4 Clock 100MHz)
* HSE Frequency(Hz) = 25000000
* PLL_M = 5
* PLL_N = 160
* PLL_P = 2
* PLL_Q = 4
* PLL_R = 2
* VDD(V) = 3.3
* Flash Latency(WS) = 4
* @param None
* @retval None
*/
void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
HAL_StatusTypeDef ret = HAL_OK;
/*使能供电配置更新 */
MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);
/* 当器件的时钟频率低于最大系统频率时,电压调节可以优化功耗,
关于系统频率的电压调节值的更新可以参考产品数据手册。 */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
/* 启用HSE振荡器并使用HSE作为源激活PLL */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 5;
RCC_OscInitStruct.PLL.PLLN = 160;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLQ = 2;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
if(ret != HAL_OK)
{
while(1) { ; }
}
/* 选择PLL作为系统时钟源并配置总线时钟分频器 */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | \
RCC_CLOCKTYPE_HCLK | \
RCC_CLOCKTYPE_D1PCLK1 | \
RCC_CLOCKTYPE_PCLK1 | \
RCC_CLOCKTYPE_PCLK2 | \
RCC_CLOCKTYPE_D3PCLK1);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
if(ret != HAL_OK)
{
while(1) { ; }
}
}
/****************************END OF FILE***************************/