解锁函数:void FLASH_Unlock(void);对 FLASH 进行写操作前必须先解锁,解锁操作也就是必须在 FLASH_KEYR 寄存器写入特定的序列,固件库函数实现很简单:只需要直接调用 FLASH_Unlock();即可。 锁定函数:void FLASH_Lock(void);有解锁当然就有上锁,为了保护Flash,读写和擦除全部需要的Flash后需
确切说应该是(0x1FFF7A23,0x1FFF7A22两个字节), 芯片的这96位ID是产品唯一身份标识。可以从特定的寄存器中读出来。FlashSize表示内部flash的大小,也是固化在芯片内部的。 手册上讲的ChipID的基地址是0x1FFF7A10,ChipSize的基地址也是0x1FFF7A10。肯定是不对的 谷歌了半天才发现真正的ChipSize地址0x1FFF7A20。
确切说应该是(0x1FFF7A23,0x1FFF7A22两个字节), 芯片的这96位ID是产品唯一身份标识。可以从特定的寄存器中读出来。FlashSize表示内部flash的大小,也是固化在芯片内部的。 手册上讲的ChipID的基地址是0x1FFF7A10,ChipSize的基地址也是0x1FFF7A10。肯定是不对的 谷歌了半天才发现真正的ChipSize地址0x1FFF7A20。
锁定函数:void FLASH_Lock(void); 有解锁当然就有上锁,为了保护Flash,读写和擦除全部需要的Flash后需要上锁,只需要调用: FLASH_Lock(); 擦除函数 固件库我们主要使用两个 FLASH 擦除函数: FLASH_Status FLASH_ErasePage(uint32_t Page_Address); FLASH_Status FLASH_EraseAllPages(void); 顾名思义,第一个函...
u32 offaddr;// 去掉0X08000000后的地址// 判断写入地址是否在合法范围内if(WriteAddr < STM32_FLASH_BASE || (WriteAddr >= (STM32_FLASH_BASE +1024* STM32_FLASH_SIZE))) {return;// 非法地址}FLASH_Unlock();// 解锁offaddr = WriteAddr - STM32_FLASH_BASE;// 实际偏移地址secpos = offaddr...
[i]);ucStartAddr+=2;}/* 上锁 */FLASH_Lock();/* 读取操作 */ucStartAddr=ADDR_FLASH_PAGE_255;printf("\n从FLASH中读出的数据为:\n");for(int i=0;i<BufferSize;i++){usFlashReadBuf[i]=*(__IO uint16_t*)ucStartAddr;printf("ucFlashReadBuf[%d] = 0x%.4x\n",i,usFlashReadBuf[...
#if STM32_FLASH_SIZE<256 #define STM_SECTOR_SIZE 1024 //字节 #else #define STM_SECTOR_SIZE 2048 #endif u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];//最多是2K字节 void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite) { u32 sec_addr;//扇区地址 ...
0x08000000,它正好是 STM32 内部 FLASH 的首地址,即 STM32 的程序存储空间就直接是执行空间;它们的大小(Size)分别为 0x00000b50 及 0x00000b3c,执行空间的 ROM 比较小的原因就是因为部分 RW-data 类型的变量被拷贝到 RAM 空间了;它们的最大空间(Max)均为 0x00100000,即 1M 字节,它指的是内部 FLASH 的最...
*/// 根据中文参考手册,大容量产品的每一页是2K字节#ifSTM32_FLASH_SIZE < 256#defineSTM32_SECTOR_SIZE 1024// 字节#else#defineSTM32_SECTOR_SIZE 2048#endif// 一个扇区的内存u16 STM32_FLASH_BUF[STM32_SECTOR_SIZE /2];voidMed_Flash_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite){ ...
#if FLASH_SIZE<256 #define SECTOR_SIZE 1024 //字节 #else #define SECTOR_SIZE 2048 //字节 #endif 1. 2. 3. 4. 5. 6. 7. 虽然ST的库函数比较全面,但都是基本操作,为了使用方面,根据我们自己的需要对其进行再次封装。 对于读操作相对比较简单,内置闪存模块可以在通用地址空间直接寻址,就像读取变量一...