| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #include "includes.h"
- ////读取指定地址的半字(16位数据)
- ////faddr:读地址(此地址必须为2的倍数!!)
- ////返回值:对应数据.
- uint16_t STMFLASH_ReadHalfWord(uint32_t faddr)
- {
- return *(volatile uint16_t*)faddr;
- }
- ////从指定地址开始读出指定长度的数据
- ////ReadAddr:起始地址
- ////pBuffer:数据指针
- ////NumToWrite:半字(16位)数
- void STMFLASH_Read(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead)
- {
- uint16_t i;
- for(i=0;i<NumToRead;i++)
- {
- pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
- ReadAddr+=2;//偏移2个字节.
- }
- }
- /**********************************************************************************************************
- *写页数据,擦除整页1024字节,并写入Byte数据,数据可少于1024Btye,但必须是偶数。
- ************************************************************************************************************/
- void WritePageData(unsigned long WriteAddr,unsigned char *pData,unsigned short DataLen)
- {
- uint32_t First_Page;
- uint32_t EraseCounter;
- unsigned short i;
- unsigned short datas;
- FLASH_Status status;
- FLASH_Unlock();//先解锁
- FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR); //清楚相应的标志位
- if(WriteAddr<FLASH_Start_Addr || WriteAddr>=FLASH_End_Addr) return;//非法地址
- if(WriteAddr&0x0000003FF)return;//非页首地址
- status=FLASH_ErasePage(WriteAddr);//擦除这个页
- if(status!=FLASH_COMPLETE){
- return;
- }
-
- /* 写入FLASH */
- for(i = 0; i < DataLen; i+=2)
- {
- //数据8位融合为16位
- datas = (((unsigned short)pData[i+1])<<8) + ((unsigned short)pData[i]);
- FLASH_ProgramHalfWord((WriteAddr+i),datas);
- }
- /* 上锁 */
- FLASH_Lock();
- }
- /**********************************************************************************************************
- ************************************************************************************************************/
- void ReadFlashData(unsigned long ReadAddr,unsigned char *pData,unsigned short DataLen)
- {
- unsigned int i,j;
- unsigned short temp;
- j=0;
- for(i=0;i<DataLen;i+=2)
- {
- temp=STMFLASH_ReadHalfWord(ReadAddr+i);
- pData[j++]=(unsigned char)(temp&0xff);
- pData[j++]=(temp>>8)&0xff;
- }
- }
|