如何在代码本身中找出闪存的大小?

How do I find out the size of the flash memory in the code itself?

我想在代码中自己获取flash的限制地址,或者至少是这个flash的大小。

我在stm32f302xc.h文件中只找到了flash的起始地址,没有找到结束地址

/** @addtogroup Peripheral_memory_map
  * @{
  */

#define FLASH_BASE            0x08000000UL /*!< FLASH base address in the alias region */
#define SRAM_BASE             0x20000000UL /*!< SRAM base address in the alias region */
#define PERIPH_BASE           0x40000000UL /*!< Peripheral base address in the alias region */
#define SRAM_BB_BASE          0x22000000UL /*!< SRAM base address in the bit-band region */
#define PERIPH_BB_BASE        0x42000000UL /*!< Peripheral base address in the bit-band region */

什么定义负责这个,谢谢。

参考手册RM036629.2内存大小数据寄存器.[=13部分描述了你想要的内容=]

ST 提供此功能,但出于某种原因,他们并不总是提供一种在 headers.

中访问它的简单方法

这个寄存器的地址是FLASHSIZE_BASE。你必须在run-time阅读它,例如:

uint16_t flash_size_kb = *(const uint16_t*)FLASHSIZE_BASE;

STM32 MCU 系列有不同的闪存大小,这就是为什么它没有在它们的头文件中定义。虽然 STM32CubeMX 代码生成器理论上可以在您 select MCU 的确切型号时添加它。但这意味着如果您将其闪存到具有不同闪存大小的变体,代码可能无法正常工作。

然而,一些 STM32 MCU 带有一个闪存大小数据寄存器,其中包含有关闪存大小的信息。这个地址通常在头文件中找到,有时还包含一个宏。注意不是编译时常量,而是需要在运行时读取的ROM常量。

stm32f3xx_hal_flash_ex.h包含以下寄存器地址:

#define FLASH_SIZE_DATA_REGISTER (0x1FFFF7CCU)

你可以这样使用它:

const size_t FLASH_SIZE = (*((uint16_t*)FLASH_SIZE_DATA_REGISTER)) << 10;

对于 stm32g4xx,在 stm32g4xx_hal_flash.h 中定义了一个宏:

FLASH_SIZE

为此编写自己的宏时要小心,因为闪存大小并不总是与寄存器中的值成线性关系。在 stm32g4xx 的情况下,值 0xFFFF 表示 128kiB 或 512kiB,如下所示:

#define FLASH_SIZE_DATA_REGISTER        FLASHSIZE_BASE

#if defined (FLASH_OPTR_DBANK)
#define FLASH_SIZE                      ((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0xFFFFU)) ? (0x200UL << 10U) : \
                                        (((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & 0xFFFFUL) << 10U))
#define FLASH_BANK_SIZE                 (FLASH_SIZE >> 1)
#define FLASH_PAGE_NB                   128U
#define FLASH_PAGE_SIZE_128_BITS        0x1000U /* 4 KB */
#else
#define FLASH_SIZE                      ((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0xFFFFU)) ? (0x80UL << 10U) : \
                                        (((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & 0xFFFFUL) << 10U))
#define FLASH_BANK_SIZE                 (FLASH_SIZE)
#define FLASH_PAGE_NB                   ((FLASH_SIZE == 0x00080000U) ? 256U : 64U)
#endif

这同样适用于 Flash 页面大小。页面大小取决于系列,有时还取决于闪存大小。有时 ST 也为此提供了一个宏。