flash.c
2.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "flash.h"
u32 STMFLASH_ReadWord(u32 faddr)
{
return *(vu32*)faddr;
}
uint16_t STMFLASH_GetFlashSector(u32 addr)
{
if(addr<ADDR_FLASH_SECTOR_1)return FLASH_Sector_0;
else if(addr<ADDR_FLASH_SECTOR_2)return FLASH_Sector_1;
else if(addr<ADDR_FLASH_SECTOR_3)return FLASH_Sector_2;
else if(addr<ADDR_FLASH_SECTOR_4)return FLASH_Sector_3;
else if(addr<ADDR_FLASH_SECTOR_5)return FLASH_Sector_4;
else if(addr<ADDR_FLASH_SECTOR_6)return FLASH_Sector_5;
else if(addr<ADDR_FLASH_SECTOR_7)return FLASH_Sector_6;
else if(addr<ADDR_FLASH_SECTOR_8)return FLASH_Sector_7;
else if(addr<ADDR_FLASH_SECTOR_9)return FLASH_Sector_8;
else if(addr<ADDR_FLASH_SECTOR_10)return FLASH_Sector_9;
else if(addr<ADDR_FLASH_SECTOR_11)return FLASH_Sector_10;
return FLASH_Sector_11;
}
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
{
FLASH_Status status = FLASH_COMPLETE;
u32 addrx=0;
u32 endaddr=0;
if(WriteAddr%4)
return; //非法地址
FLASH_Unlock(); //解锁
FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
addrx = WriteAddr; //写入的起始地址
endaddr = WriteAddr + NumToWrite; //写入的结束地址
if(addrx<0X1FFF0000) //只有主存储区,才需要执行擦除操作!!
{
if(addrx == APP_RUN_ADDR)
{
status = FLASH_EraseSector(FLASH_Sector_4,VoltageRange_3);//VCC=2.7~3.6V之间!!
status = FLASH_EraseSector(FLASH_Sector_5,VoltageRange_3);
}
else if (addrx == FLAG_BASE_ADDR)
{
status = FLASH_EraseSector(FLASH_Sector_1,VoltageRange_3);
}
}
if(status==FLASH_COMPLETE)
{
while(WriteAddr<endaddr)//写数据
{
if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据
{
break; //写入异常
}
WriteAddr+=4;
pBuffer++;
}
}
FLASH_DataCacheCmd(ENABLE); //FLASH擦除结束,开启数据缓存
FLASH_Lock();//上锁
}
#define Tracy 0
#if Tracy
void flash_write(u32 addr,u16 data)
{
FLASH_Unlock();
FLASH_ProgramHalfWord(addr,data);
FLASH_Lock();
}
void flash_write_string(u32 addr,u16* buff,u16 length)
{
char i=0;
FLASH_Unlock();
if(length%2==0)
length/=2;
else
length=length/2+1;
for(i=0;i<length;i++)
{
FLASH_ProgramHalfWord(addr,buff[i]);
addr+=2;
}
FLASH_Lock();
}
u16 flash_read(u32 addr)
{
return *(u16 *)(addr);
}
u16 flash_read_halfword(u32 addr)
{
return *(vu16*)addr;
}
void flash_read_string(u32 addr,u16 *rbuff,u16 length)
{
int i;
if(length%2==0)
length/=2;
else
length=length/2+1;
for(i=0;i<length;i++)
{
rbuff[i]=flash_read_halfword(addr);
addr+=2;
}
}
void flash_erase(u32 addrx)
{
FLASH_Unlock();
FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
FLASH_EraseSector(STMFLASH_GetFlashSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之间!!
FLASH_DataCacheCmd(ENABLE); //FLASH擦除结束,开启数据缓存
FLASH_Lock();
}
#endif