|
分享——参考在硬汉的V7-005_TCM,SRAM等五块内存案例,增加了备份区ram操作,并且改成了CubeMx配置方式。
实测可以实现指定地址定义变量,也可以掉电保存
/* USER CODE BEGIN 0 */
/* 定义在512KB AXI SRAM里面的变量 */
__attribute__((section (".AXIRAM_D1"))) uint32_t AXISRAMBuf[10];
__attribute__((section (".AXIRAM_D1"))) uint16_t AXISRAMCount=1;
/* 定义在128KB SRAM1(0x30000000) + 128KB SRAM2(0x30020000) + 32KB SRAM3(0x30040000)里面的变量 */
//STM32H7的D2域SRAM使用注意事项 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)
/*需要在system_stm32h7xx.c中,放到第301行
//使能D2域SRAM时钟,如果不提前使能时钟,则无法在声明变量时初始化该区域
__HAL_RCC_D2SRAM1_CLK_ENABLE();
__HAL_RCC_D2SRAM2_CLK_ENABLE();
__HAL_RCC_D2SRAM3_CLK_ENABLE();
*/
__attribute__((section (".SRAM123_D2"))) uint32_t D2SRAMBuf[10];
__attribute__((section (".SRAM123_D2"))) uint16_t D2SRAMount=101;
/* 定义在64KB SRAM4(0x38000000)里面的变量 */
__attribute__((section (".SRAM4_D3"))) uint32_t D3SRAMBuf[10];
__attribute__((section (".SRAM4_D3"))) uint16_t D3SRAMCount=201;
/* 定义在4KB Backup SRAM(0x38800000)里面的变量 4KB */
__attribute__((section (".BKPSRAM_D3"))) uint32_t BKSRAMBuf[10];
__attribute__((section (".BKPSRAM_D3"))) uint16_t BKSRAMCount;
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t ucKeyCode;//存储按键值
/* USER CODE END 1 */
/* MPU Configuration--------------------------------------------------------*/
MPU_Config();
/* Enable the CPU Cache */
/* Enable I-Cache---------------------------------------------------------*/
SCB_EnableICache();
/* Enable D-Cache---------------------------------------------------------*/
SCB_EnableDCache();
/* 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 */
//需打开这个RCC时钟,不然不能掉电储存
__HAL_RCC_BKPRAM_CLK_ENABLE(); //RCC_AHB4ENR->BKPRAMEN(H7) 使能备份RAM读写时钟
HAL_PWREx_EnableBkUpReg(); //PWR_CR2->BREN(H7) 使能备份调节器
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
bsp_InitLed();
bsp_InitKey();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
PrintfLogo();
PrintfHelp();
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
if (ucKeyCode != KEY_NONE)
{
switch (ucKeyCode)
{
case KEY_DOWN_K1: /* K1键按下,操作AXI SRAM */
AXISRAMBuf[0] = AXISRAMCount++;
AXISRAMBuf[5] = AXISRAMCount++;
AXISRAMBuf[9] = AXISRAMCount++;
printf("K1键按下, AXISRAMBuf[0] = %d, AXISRAMBuf[5] = %d, AXISRAMBuf[9] = %d\r\n",
AXISRAMBuf[0],
AXISRAMBuf[5],
AXISRAMBuf[9]);
printf("AXISRAMaddr = %08X %08X %08X\r\n", (uint32_t)&AXISRAMCount, (uint32_t)&AXISRAMBuf[0], (uint32_t)&AXISRAMBuf[9]);
break;
case KEY_DOWN_K2: /* K2键按下,操作D2域的SRAM1,SRAM2和SRAM3 */
D2SRAMBuf[0] = D2SRAMount++;
D2SRAMBuf[5] = D2SRAMount++;
D2SRAMBuf[9] = D2SRAMount++;
printf("K2键按下, D2SRAMBuf[0] = %d, D2SRAMBuf[5] = %d, D2SRAMBuf[9] = %d\r\n",
D2SRAMBuf[0],
D2SRAMBuf[5],
D2SRAMBuf[9]);
printf("D2SRAMaddr = %08X %08X %08X\r\n", (uint32_t)&D2SRAMount, (uint32_t)&D2SRAMBuf[0], (uint32_t)&D2SRAMBuf[9]);
break;
case KEY_DOWN_K3: /* K3键按下,操作D3域的SRAM4 */
D3SRAMBuf[0] = D3SRAMCount++;
D3SRAMBuf[5] = D3SRAMCount++;
D3SRAMBuf[9] = D3SRAMCount++;
printf("K3键按下, D3SRAMBuf[0] = %d, D3SRAMBuf[5] = %d, D3SRAMBuf[9] = %d\r\n",
D3SRAMBuf[0],
D3SRAMBuf[5],
D3SRAMBuf[9]);
printf("D3SRAMaddr = %08X %08X %08X\r\n", (uint32_t)&D3SRAMCount, (uint32_t)&D3SRAMBuf[0], (uint32_t)&D3SRAMBuf[9]);
BKSRAMBuf[0] = BKSRAMCount++;
BKSRAMBuf[5] = BKSRAMCount++;
BKSRAMBuf[9] = BKSRAMCount++;
printf("K3键按下, BKSRAMBuf[0] = %d, BKSRAMBuf[5] = %d, BKSRAMBuf[9] = %d\r\n",
BKSRAMBuf[0],
BKSRAMBuf[5],
BKSRAMBuf[9]);
printf("BKSRAMaddr = %08X %08X %08X\r\n", (uint32_t)&BKSRAMCount, (uint32_t)&BKSRAMBuf[0], (uint32_t)&BKSRAMBuf[9]);
break;
default:
/* 其它的键值不处理 */
break;
}
}
bsp_LedToggle(1);
HAL_Delay(100);
}
//////////////////////////////////////////////////////////////
附件是工程demo,需要的可以下载试试
|
评分
-
查看全部评分
|