#define STM32_FLASH_BASE 0x08000000 /* STM32 FLASH 起始地址 */ #define STM32_FLASH_SIZ...
在stm32xxx_hal_flash.h 或者 stm32xxx_hal_flash_ex.h 里面 #define FLASH_SIZE (uint32_t)((*((uint32_t *)FLASHSIZE_BASE)&0xFFFF) * 1024U) #define FLASH_PAGE_SIZE ((uint32_t)128U) /*!< FLASH Page Size in bytes */
图4 SystemInit函数映射中断向量表 图4中我们可以看到,SCB中关于Vector的地址是通过符号FLASH_BASE和VECT_TAB_OFFSET计算出来的,我们可以找到关于它们的定义,如图5所示。 图5 FLASH_BASE和VECT_TAB_OFFSET的定义 通过图5中的计算,正好可以得出整个中断向量表被映射到了0x8000000地址处。 STM32的FLASH分配 前面的大段...
STM32F4 闪存的编程位数可以通过 FLASH_CR的PSIZE 字段配置,PSIZE的设置必须和电源电压匹配,见表46....
/* FLASH结束地址 */ #define STM32FLASH_END (STM32FLASH_BASE | STM32FLASH_SIZE) /* FLASH页大小:1K */ #define STM32FLASH_PAGE_SIZE FLASH_PAGE_SIZE /* FLASH总页数 */ #define STM32FLASH_PAGE_NUM (STM32FLASH_SIZE / STM32FLASH_PAGE_SIZE) ...
HAL_FLASH_Unlock(); offset = WriteAddr - STM32_FLASH_BASE; sectornum = WriteAddr / STM_SECTOR_SIZE; secoff = (WriteAddr % STM_SECTOR_SIZE) / 2; secremain = STM_SECTOR_SIZE / 2 - secoff; if(Num <= secremain) secremain = Num; ...
FLASH_Unlock(); //解锁 offaddr=WriteAddr-STM32_FLASH_BASE; //实际偏移地址. sec_addr=offaddr/STM_SECTOR_SIZE; //扇区地址 0~256 for STM32F103ZET6 sec_off=(offaddr%STM_SECTOR_SIZE)/2; //扇区内的偏移地址(2个字节为基本单位)
{return;// 非法地址}FLASH_Unlock();// 解锁offaddr = WriteAddr - STM32_FLASH_BASE;// 实际偏移地址secpos = offaddr / STM32_SECTOR_SIZE;// 扇区地址secoff = (offaddr % STM32_SECTOR_SIZE) /2;// 在扇区内的偏移(2个字节为基本单位)secremain = STM32_SECTOR_SIZE /2- secoff;// 扇区...
选择字节寄存器(FLASH_OBR) 写保护寄存器(FLASH_WRPR) STM32 复位后,FPEC 模块是被保护的,不能写入 FLASH_CR 寄存器;通过写入特定的序列到 FLASH_KEYR 寄存器可以打开 FPEC 模块,只有在写保护被解除后,我们才能操作相关寄存器。 STM32 闪存的编程每次必须写入 16 位(不能单纯的写入 8 位数据哦!),当 FLASH...
STM32F4 闪存的编程位数可以通过 FLASH_CR 的 PSIZE 字段配置,PSIZE 的设置必须和电源电压匹配,见下表: 由于我们开发板用的电压是 3.3V,所以 PSIZE 必须设置为 10,即 32 位并行位数。擦除或者编程,都必须以 32 位为基础进行。