//非法地址//解锁HAL_FLASH_Unlock();offset=WriteAddr-STM32_FLASH_BASE;sectornum=WriteAddr/STM_SECTOR_SIZE;secoff=(WriteAddr%STM_SECTOR_SIZE)/2;//(2个字节为基本单位)secremain=STM_SECTOR_SIZE/2-secoff;//(2个字节为基本单位)if(
void STMFLASH_Write(uint32_t WriteAddr, uint16_t *PDataBuf, uint16_t Num) { uint32_t offset; uint8_t sectornum; uint16_t secoff; uint16_t secremain; uint16_t i; if((WriteAddr < STM32_FLASH_BASE) || (WriteAddr >= (STM32_FLASH_BASE + STM32_FLASH_SIZE * 1024))) return...
图4 SystemInit函数映射中断向量表 图4中我们可以看到,SCB中关于Vector的地址是通过符号FLASH_BASE和VECT_TAB_OFFSET计算出来的,我们可以找到关于它们的定义,如图5所示。 图5 FLASH_BASE和VECT_TAB_OFFSET的定义 通过图5中的计算,正好可以得出整个中断向量表被映射到了0x8000000地址处。 STM32的FLASH分配 前面的大段...
if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址 FLASH_Unlock(); //解锁 offaddr=WriteAddr-STM32_FLASH_BASE; //实际偏移地址. sec_addr=offaddr/STM_SECTOR_SIZE; //扇区地址 0~256 for STM32F103ZET6 sec_off=(offaddr%STM_SECTOR_S...
if(start_address < STM32_FLASH_BASE || (start_address >= (STM32_FLASH_BASE + STM_SECTOR_SIZE * STM32_FLASH_SIZE))) { //长度不在范围 return; } HAL_FLASH_Unlock();//解锁flash Erase_Flash(start_address , end_address); //擦除Flash ...
(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址FLASH_Unlock();//解锁offaddr=WriteAddr-STM32_FLASH_BASE;//实际偏移地址.secpos=offaddr/STM_SECTOR_SIZE;//扇区地址 0~127 for STM32F103RBT6secoff=(offaddr%STM_SECTOR_SIZE)/2;//在扇区内的偏移(2个字节为基本单位.)secremain=STM...
voidSTMFLASH_Erase(u32 EraseAddr,u16 NumToErase){u32 secpos;//扇区地址u16 secoff;//扇区内偏移地址(16位字计算)u16 secremain;//扇区内剩余地址(16位字计算)u16 i;u32 offaddr;//去掉0X08000000后的地址if(EraseAddr<STM32_FLASH_BASE||(EraseAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE))...
在上面 map 文件的描述中,我们了解到加载及执行空间的基地址(Base)都是0x08000000,它正好是 STM32 内部 FLASH 的首地址,即 STM32 的程序存储空间就直接是执行空间;它们的大小(Size)分别为 0x00000b50 及 0x00000b3c,执行空间的 ROM 比较小的原因就是因为部分 RW-data 类型的变量被拷贝到 RAM 空间了;它们的...
STM32 复位后,FPEC 模块是被保护的,不能写入 FLASH_CR 寄存器;通过写入特定的序列到 FLASH_KEYR 寄存器可以打开 FPEC 模块,只有在写保护被解除后,我们才能操作相关寄存器。 STM32 闪存的编程每次必须写入 16 位(不能单纯的写入 8 位数据哦!),当 FLASH_CR 寄存器的 PG 位为’1’时,在一个闪存地址写入一...
但是使用内部flash是有风险的,比如你对系统进行升级,编译出来的烧写文件变大了,这样就有冲掉flash上数据的可能,模拟eeprom是个说法,说白了就是使用stm32内部flash里面一部分空间用来保存数据,不只是保存程序代码。 基础知识 flash可分为3部分。1主存储器用来存放我们在keil5中写的代码和数据常数(如 const 类型的数据...