



/*------------ Functions used for all STM32F10x devices -----*/void FLASH_SetLatency(uint32_t FLASH_Latency);void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess);void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer);void FLASH_Unlock(void);void FLASH_Lock(void);FLASH_Status FLASH_ErasePage(uint32_t Page_Address);FLASH_Status FLASH_EraseAllPages(void);FLASH_Status FLASH_EraseOptionBytes(void);FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages);FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState);FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY);uint32_t FLASH_GetUserOptionByte(void);uint32_t FLASH_GetWriteProtectionOptionByte(void);FlagStatus FLASH_GetReadOutProtectionStatus(void);FlagStatus FLASH_GetPrefetchBufferStatus(void);void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState);FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG);void FLASH_ClearFlag(uint32_t FLASH_FLAG);FLASH_Status FLASH_GetStatus(void);FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);/*------------ New function used for all STM32F10x devices -----*/void FLASH_UnlockBank1(void);void FLASH_LockBank1(void);FLASH_Status FLASH_EraseAllBank1Pages(void);FLASH_Status FLASH_GetBank1Status(void);FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout);

//不检查的写入//WriteAddr:起始地址//pBuffer:数据指针//NumToWrite:半字(16位)数void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite){u16 i;for(i=0;i<NumToWrite;i++){FLASH_ProgramHalfWord(WriteAddr,pBuffer);WriteAddr+=2;//地址增加2.}}
//从指定地址开始写入指定长度的数据//WriteAddr:起始地址(此地址必须为2的倍数!!)//pBuffer:数据指针//NumToWrite:半字(16位)数(就是要写入的16位数据的个数.)u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];//最多是2K字节void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite){u32 secpos; //扇区地址u16 secoff; //扇区内偏移地址(16位字计算)u16 secremain; //扇区内剩余地址(16位字计算)u16 i;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/STM_SECTOR_SIZE; //扇区地址 0~127 for STM32F103RBT6secoff=(offaddr%STM_SECTOR_SIZE)/2; //在扇区内的偏移(2个字节为基本单位.)secremain=STM_SECTOR_SIZE/2-secoff; //扇区剩余空间大小if(NumToWrite<=secremain){secremain=NumToWrite;//不大于该扇区范围}while(1){STMFLASH_Read(((secpos*STM_SECTOR_SIZE)+STM32_FLASH_BASE),STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容for(i=0;i<secremain;i++)//校验数据// for(i=0;i<(STM_SECTOR_SIZE/2);i++)//校验数据{if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除// if(STMFLASH_BUF!=0XFFFF)break;//需要擦除}FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);if(i<secremain)//需要擦除// if(i<(STM_SECTOR_SIZE/2))//需要擦除{FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区for(i=0;i<secremain;i++)//复制{STMFLASH_BUF[i+secoff]=pBuffer;}STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.if(NumToWrite==secremain)break;//写入结束了else//写入未结束{secpos++; //扇区地址增1secoff=0; //偏移位置为0pBuffer+=secremain; //指针偏移WriteAddr+=(secremain*2); //写地址偏移NumToWrite-=secremain; //字节(16位)数递减if(NumToWrite>(STM_SECTOR_SIZE/2)){secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完}else{secremain=NumToWrite;//下一个扇区可以写完了}}}FLASH_Lock();//上锁}
/*** [url=home.php?mod=space&uid=247401]@brief[/url] Programs a half word at a specified address.* [url=home.php?mod=space&uid=536309]@NOTE[/url] This function can be used for all STM32F10x devices.* @param Address: specifies the address to be programmed.* @param Data: specifies the data to be programmed.* @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,* FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.*/FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data){FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);FLASH_Status status = FLASH_COMPLETE;/* Check the parameters */assert_param(IS_FLASH_ADDRESS(Address));#ifdef STM32F10X_XL/* Wait for last operation to be completed */status = FLASH_WaitForLastOperation(ProgramTimeout);if(Address < FLASH_BANK1_END_ADDRESS){if(status == FLASH_COMPLETE){/* if the previous operation is completed, proceed to program the new data */FLASH->CR |= CR_PG_Set;*(__IO uint16_t*)Address = Data;/* Wait for last operation to be completed */status = FLASH_WaitForLastBank1Operation(ProgramTimeout);/* Disable the PG Bit */FLASH->CR &= CR_PG_Reset;}}else{if(status == FLASH_COMPLETE){/* if the previous operation is completed, proceed to program the new data */FLASH->CR2 |= CR_PG_Set;*(__IO uint16_t*)Address = Data;/* Wait for last operation to be completed */status = FLASH_WaitForLastBank2Operation(ProgramTimeout);/* Disable the PG Bit */FLASH->CR2 &= CR_PG_Reset;}}#else/* Wait for last operation to be completed */status = FLASH_WaitForLastOperation(ProgramTimeout);if(status == FLASH_COMPLETE){/* if the previous operation is completed, proceed to program the new data */FLASH->CR |= CR_PG_Set;*(__IO uint16_t*)Address = Data;/* Wait for last operation to be completed */status = FLASH_WaitForLastOperation(ProgramTimeout);/* Disable the PG Bit */FLASH->CR &= CR_PG_Reset;}#endif * STM32F10X_XL *//* Return the Program Status */return status;}
//读取指定地址的半字(16位数据)//faddr:读地址(此地址必须为2的倍数!!)//返回值:对应数据.u16 STMFLASH_ReadHalfWord(u32 faddr){return *(vu16*)faddr;}//从指定地址开始读出指定长度的数据//ReadAddr:起始地址//pBuffer:数据指针//NumToWrite:半字(16位)数void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead){u16 i;for(i=0;i<NumToRead;i++){pBuffer=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.ReadAddr+=2;//偏移2个字节.}}
文章转载自嵌入式ARM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




