FLM文件

代码下载地址

FLM示例代码下载

官方提供的示例目录在:Keil_v5\ARM\Flash_Template目录下

程序

FlashPrg.c关键文件

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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
/* History:
* Version 1.1.0
* Initial release
*/
#include "FlashOS.h" // FlashOS Structures

typedef volatile unsigned char vu8;
typedef volatile unsigned long vu32;
typedef volatile unsigned short vu16;

#define M8(adr) (*((vu8 *) (adr)))
#define M16(adr) (*((vu16 *) (adr)))
#define M32(adr) (*((vu32 *) (adr)))

// Peripheral Memory Map
#define IWDG_BASE 0x40003000
#define FLASH_BASE 0x40022000
#define RCC_BASE (0x40021000)

#define IWDG ((IWDG_TypeDef *) IWDG_BASE)
#define FLASH ((FLASH_TypeDef*) FLASH_BASE)
#define RCC ((RCC_TypeDef *) RCC_BASE)

// FLASH BANK size
#define BANK1_SIZE 0x00080000 // Bank1 Size = 512kB
// System Memory size
#define SYSMEMORY_SIZE 0x00004000 // System Memory Size = 16kB

// Independent WATCHDOG
typedef struct {
vu32 KR;
vu32 PR;
vu32 RLR;
vu32 SR;
} IWDG_TypeDef;

// Flash Registers
typedef struct {
vu32 ACR; // offset 0x000
vu32 KEYR; // offset 0x004
vu32 OPTKEYR; // offset 0x008
vu32 SR; // offset 0x00C
vu32 CR; // offset 0x010
vu32 AR; // offset 0x014
vu32 RESERVED0[1];
vu32 OBR; // offset 0x01C
vu32 WRPR; // offset 0x020
} FLASH_TypeDef;

typedef struct
{
vu32 CTRL;
vu32 CFG;
vu32 CLKINT;
vu32 APB2PRST;
vu32 APB1PRST;
vu32 AHBPCLKEN;
vu32 APB2PCLKEN;
vu32 APB1PCLKEN;
vu32 LDCTRL;
vu32 CTRLSTS;
vu32 AHBPRST;
vu32 CFG2;
vu32 CFG3;
vu32 RDCTRL;
vu32 Reserve0;
vu32 Reserve1;
vu32 PLLHSIPRE;
vu32 SRAM_CTRLSTS;
} RCC_TypeDef;


// Flash Keys
#define RDPRT_KEY 0x5AA5
#define FLASH_KEY1 0x45670123
#define FLASH_KEY2 0xCDEF89AB

// Flash Control Register definitions
#define FLASH_PG 0x00000001
#define FLASH_PER 0x00000002

#define CR_PER_Reset 0x00001FFD

#define FLASH_MER 0x00000004
#define FLASH_OPTPG 0x00000010
#define FLASH_OPTER 0x00000020
#define FLASH_STRT 0x00000040
#define FLASH_LOCK 0x00000080
#define FLASH_OPTWRE 0x00000100

// Flash Status Register definitions
#define FLASH_BSY 0x00000001
#define FLASH_PGERR 0x00000004
#define FLASH_WRPRTERR 0x00000010
#define FLASH_EOP 0x00000020

#define FLASH_PROG_MASK (FLASH_OPTWRE | FLASH_OPTER | FLASH_OPTPG | FLASH_MER | FLASH_PER | FLASH_PG)

// RCC register definitiions
#define RCC_HSI_ENABLE (0x00000001)


unsigned long base_adr;


/*
* Initialize Flash Programming Functions
* Parameter: adr: Device Base Address
* clk: Clock Frequency (Hz)
* fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify)
* Return Value: 0 - OK, 1 - Failed
*/

#ifdef FLASH_MEM
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {

(void)adr;
(void)clk;
(void)fnc;

RCC->CTRL |= RCC_HSI_ENABLE; /*Enable HSI*/

IWDG->KR = 0xAAAA; //reload IWDG

// Set IWDG time out to ~32.768 second
IWDG->KR = 0x5555; // Enable write access to IWDG_PR and IWDG_RLR
IWDG->PR = 0x06; // Set prescaler to 256
IWDG->RLR = 4095; // Set reload value to 4095

IWDG->KR = 0xAAAA; //reload IWDG


/*flash latency set to maximum value*/
FLASH->ACR = 0x00000003;

// Unlock Flash
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;

return (0);
}
#endif



/*
* De-Initialize Flash Programming Functions
* Parameter: fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify)
* Return Value: 0 - OK, 1 - Failed
*/

int UnInit (unsigned long fnc) {

(void)fnc;
// Lock Flash
FLASH->CR |= FLASH_LOCK;
return (0);
}

/*
* Erase complete Flash Memory
* Return Value: 0 - OK, 1 - Failed
*/

int EraseChip (void) {

unsigned long temp;

temp = FLASH->CR;
temp &= ~FLASH_PROG_MASK; /* Clear all flash operation flag */
temp |= FLASH_MER; /* Set Mass Erase flag */
FLASH->CR = temp; // Mass Erase Enabled

FLASH->CR |= FLASH_STRT; // Start Erase

while (FLASH->SR & FLASH_BSY) {
IWDG->KR = 0xAAAA; // Reload IWDG
}

FLASH->CR &= ~FLASH_MER; // Mass Erase Disabled

return (0); // Done
}

/*
* Erase Sector in Flash Memory
* Parameter: adr: Sector Address
* Return Value: 0 - OK, 1 - Failed
*/

int EraseSector (unsigned long adr) {

unsigned long temp;

temp = FLASH->CR;
temp &= ~FLASH_PROG_MASK; /* Clear all flash operation flag */
temp |= FLASH_PER; /* Set Page Erase flag */
FLASH->CR = temp; // Page Erase Enabled

FLASH->AR = adr; // Page Address
FLASH->CR |= FLASH_STRT; // Start Erase

while (FLASH->SR & FLASH_BSY) {
IWDG->KR = 0xAAAA; // Reload IWDG
}

FLASH->CR &= ~FLASH_PER; // Page Erase Disabled

return (0); // Done
}

/*
* Program Page in Flash Memory
* Parameter: adr: Page Start Address
* sz: Page Size
* buf: Page Data
* Return Value: 0 - OK, 1 - Failed
*/
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

IWDG->KR = 0xAAAA; // Reload IWDG
FLASH->CR &= ~FLASH_PROG_MASK; /* Clear all flash operation flag */

sz = (sz + 3) & ~3; // Adjust size for Words
while (sz) {

FLASH->CR |= FLASH_PG; // Programming Enabled

M32(adr) = *((unsigned int *)buf); // Program Word
while (FLASH->SR & FLASH_BSY);

FLASH->CR &= ~FLASH_PG; // Programming Disabled

// Check for Errors
if (FLASH->SR & (FLASH_PGERR | FLASH_WRPRTERR)) {
FLASH->SR |= FLASH_PGERR | FLASH_WRPRTERR;
return (1); // Failed
}

// Go to next Word
adr += 4;
buf += 4;
sz -= 4;
IWDG->KR = 0xAAAA; // Reload IWDG
}
return (0); // Done
}

FlashOS.h关键文件

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
/* History:
* Version 1.00
* Initial release
*/

#define VERS 1 // Interface Version 1.01

#define UNKNOWN 0 // Unknown
#define ONCHIP 1 // On-chip Flash Memory
#define EXT8BIT 2 // External Flash Device on 8-bit Bus
#define EXT16BIT 3 // External Flash Device on 16-bit Bus
#define EXT32BIT 4 // External Flash Device on 32-bit Bus
#define EXTSPI 5 // External Flash Device on SPI

#define SECTOR_NUM 512 // Max Number of Sector Items
#define PAGE_MAX 65536 // Max Page Size for Programming

struct FlashSectors {
unsigned long szSector; //扇区大小(字节) Sector Size in Bytes
unsigned long AddrSector; // Address of Sector
};

#define SECTOR_END 0xFFFFFFFF, 0xFFFFFFFF

struct FlashDevice {
unsigned short Vers; // Version Number and Architecture
char DevName[128]; // Device Name and Description
unsigned short DevType; // Device Type: ONCHIP, EXT8BIT, EXT16BIT, ...
unsigned long DevAdr; // Default Device Start Address
unsigned long szDev; // Total Size of Device
unsigned long szPage; // Programming Page Size
unsigned long Res; // Reserved for future Extension
unsigned char valEmpty; // Content of Erased Memory

unsigned long toProg; // Time Out of Program Page Function
unsigned long toErase; // Time Out of Erase Sector Function

struct FlashSectors sectors[SECTOR_NUM];
};

#define FLASH_DRV_VERS (0x0100+VERS) // Driver Version, do not modify!

// Flash Programming Functions (Called by FlashOS)
extern int Init (unsigned long adr, // Initialize Flash
unsigned long clk,
unsigned long fnc);
extern int UnInit (unsigned long fnc); // De-initialize Flash
extern int BlankCheck (unsigned long adr, // Blank Check
unsigned long sz,
unsigned char pat);
extern int EraseChip (void); // Erase complete Device
extern int EraseSector (unsigned long adr); // Erase Sector Function
extern int ProgramPage (unsigned long adr, // Program Page Function
unsigned long sz,
unsigned char *buf);
extern unsigned long Verify (unsigned long adr, // Verify Function
unsigned long sz,
unsigned char *buf);

FlashDev.c

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
/* History:
* Version 1.00
* Initial release
*/

#include "FlashOS.h" // FlashOS Structures


struct FlashDevice const FlashDevice = {
FLASH_DRV_VERS, // 驱动程序版本,请勿修改!
"example Flash", // 设备名称(512kB/384kB/256kB)
ONCHIP, // 设备类型 修改不同存储的地方
0x08000000, // 设备起始地址
0x00080000, // 设备大小(字节)(512kB)
2048, // 编程页面大小
0, // 保留,必须为0
0xFF, // 擦除内存的初始内容
100, // 程序页面超时100毫秒
500, // 擦除扇区超时500毫秒

// 指定扇区的大小和地址
0x0800, 0x000000, //扇区大小2kB(256个扇区)
0x010000, 0x010000, // Sector Size 64kB (2 Sectors)
0x002000, 0x030000, // Sector Size 8kB (8 Sectors)
SECTOR_END
};