硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1229|回复: 1
收起左侧

[STM32H7] 分享——参考在硬汉的V7-005_TCM,SRAM等五块内存案例,增加了备份区ram操作,并且改成了CubeMx配置方式

[复制链接]

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2024-7-2 15:14:15 | 显示全部楼层 |阅读模式


分享——参考在硬汉的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,需要的可以下载试试


2.JPG
1.png

02STM32H743_RAM.rar

1.44 MB, 下载次数: 6

工程案例

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-7-3 10:26:06 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 21:29 , Processed in 0.052147 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表