BD網(wǎng)盤鏈接:
https://pan.baidu.com/s/1dmtMWcK1TII-vutsS8X0Og?pwd=5wwy
提取碼:5wwy
概述
CW32L052內(nèi)部集成了64KB嵌入式FLASH供用戶使用,可用來(lái)存儲(chǔ)應(yīng)用程序和用戶數(shù)據(jù) 。
芯片支持對(duì) FLASH 存儲(chǔ)器的讀、擦除和寫操作,支持 擦寫保護(hù)和讀保護(hù) 。
芯片內(nèi)置 FLASH 編程所需的高壓 BOOST 電路, 無(wú)須額外提供編程電壓 。
FLASH存儲(chǔ)器組織
- 總?cè)萘?4KB,分頁(yè)管理
- 每頁(yè) 512 字節(jié)
- 共 128 頁(yè)
FLASH存儲(chǔ)器保護(hù)
FLASH 存儲(chǔ)器具有擦寫保護(hù)和讀保護(hù)功能。
- 擦寫保護(hù)
包括鎖定頁(yè)擦寫保護(hù)和PC 地址頁(yè)擦寫保護(hù),處于保護(hù)狀態(tài)的頁(yè)面不能被擦寫,可避免 FLASH 內(nèi)容被意外改寫。
- 讀保護(hù)
以整片F(xiàn)LASH為保護(hù)對(duì)象,不支持單頁(yè)保護(hù),可避免用戶代碼被非法讀取。
FLASH存儲(chǔ)器操作
FLASH 存儲(chǔ)器操作包括:讀操作、擦除、寫(編程)操作。
頁(yè)擦除
FLASH 的頁(yè)擦除操作的最小單位為 1 頁(yè),即 512 字節(jié)。頁(yè)擦除操作完成后,該頁(yè)所有地址空間的數(shù)據(jù)內(nèi)容均為 0xFF 。
如果對(duì)未解鎖的 FLASH 頁(yè)面進(jìn)行頁(yè)擦除操作,或者對(duì)*正在運(yùn)行的程序[^1]*進(jìn)行擦除操作,會(huì)操作失敗,產(chǎn)生 錯(cuò)誤中斷標(biāo)志 。
CW32L052 內(nèi)部 FLASH 存儲(chǔ)器被劃分為 128 頁(yè),每 8 頁(yè)對(duì)應(yīng)擦寫鎖定寄存器的 1 個(gè)鎖定位 。擦寫鎖定寄存器的各位域與 FLASH 鎖定頁(yè)面的對(duì)應(yīng)關(guān)系如下表所示:
寫操作
基于嵌入式 FLASH 的特性,寫操作只能將 FLASH 存儲(chǔ)器中位數(shù)據(jù) 由'1'改寫為'0' ,不能由'0'改寫為'1', 因此在寫數(shù)據(jù)之前先要對(duì)對(duì)應(yīng)地址所在頁(yè)進(jìn)行擦除操作。
基于以上陳述,總結(jié)出以下三個(gè)原則:
- 不可對(duì)數(shù)據(jù)位內(nèi)容為'0'的地址寫入
- 不可對(duì)鎖定區(qū)域內(nèi)的地址寫入
- 不可對(duì) PC(程序指針)所在的頁(yè)的地址寫入
讀操作
CW32L052 對(duì) FLASH 的讀操作支持 3 種不同位寬,可采用直接訪問(wèn)絕對(duì)地址方式讀取,讀取的數(shù)據(jù)位寬必 須和對(duì)應(yīng)地址邊界對(duì)齊。
核心代碼
//單片機(jī)頭文件
#include "main.h"
//硬件驅(qū)動(dòng)
#include "gpio.h"
#include "delay.h"
//子程序
void LCD_Configuration(void); //段式LCD配置函數(shù)
void LCD_Display(uint16_t dispdata); //段式LCD顯示函數(shù)
uint8_t FLASH_Erase(void); //FLASH頁(yè)擦除函數(shù)
uint8_t FLASH_Write(uint8_t *ByteData,uint16_t amount); //FLASH寫操作函數(shù)
int main(void)
{
int i;
int temp8;
uint8_t cnt=0;
uint8_t WriteBuf[256];
LED_Init(); //初始化程序運(yùn)行情況指示燈
LCD_Configuration(); //配置LCD液晶顯示屏
FLASH_Erase(); //頁(yè)擦除操作
for(i=0;i< 256;i++) //驗(yàn)證是否擦除成功
{
temp8=*((volatile uint8_t*)(512*127+i));
if(temp8!=0xff)
{
while(1)
{
LED2_ON(); //LED2閃爍
Delay_ms(300);
LED2_OFF();
Delay_ms(300);
}
}
}
for(i=0;i< 256;i++) //準(zhǔn)備寫入FLASH存儲(chǔ)器的數(shù)據(jù)
{
WriteBuf[i]=i;
}
FLASH_Write(WriteBuf,256); //寫操作
for(i=0;i< 255;i++) //驗(yàn)證是否寫入正確
{
temp8=*((volatile uint8_t*)(512*127+i));
if(temp8!=i)
{
while(1)
{
LED1_ON(); //LED1、LED2同時(shí)閃爍指示寫入失敗
LED2_ON();
Delay_ms(300);
LED1_OFF();
LED2_OFF();
Delay_ms(300);
}
}
}
LED1_ON(); //指示擦除、讀、寫均成功
LED2_ON();
while(1)
{
LCD_Display(*((volatile uint8_t*)(512*127+cnt))); //LCD上依次顯示寫入的數(shù)據(jù)
Delay_ms(500);
cnt++;
}
}
uint8_t FLASH_Erase(void) //頁(yè)擦除
{
int flag=1;
FLASH_UnlockPages(512*127,512*127);
flag=FLASH_ErasePages(512*127,512*127);
FLASH_LockAllPages();
if(flag!=0)
{
while(1)
{
LED1_ON();
Delay_ms(300);
LED1_OFF();
Delay_ms(300);
}
}
return 0;
}
uint8_t FLASH_Write(uint8_t *ByteData,uint16_t amount) //寫操作
{
int flag=1;
FLASH_UnlockPages(512*127,512*127);
flag=FLASH_WriteBytes(512*127,ByteData,amount);
FLASH_LockAllPages();
if(flag!=0)
{
while(1)
{
LED2_ON();
Delay_ms(300);
LED2_OFF();
Delay_ms(300);
}
}
return 0;
}
void LCD_Configuration(void) //段式LCD配置
{
__RCC_LCD_CLK_ENABLE();
RCC_LSI_Enable();
LCD_InitTypeDef LCD_InitStruct = {0};
LCD_InitStruct.LCD_Bias = LCD_Bias_1_3;
LCD_InitStruct.LCD_ClockSource = LCD_CLOCK_SOURCE_LSI;
LCD_InitStruct.LCD_Duty = LCD_Duty_1_4;
LCD_InitStruct.LCD_ScanFreq = LCD_SCAN_FREQ_256HZ;
LCD_InitStruct.LCD_VoltageSource = LCD_VoltageSource_Internal;
LCD_Init(&LCD_InitStruct);
LCD_COMConfig(LCD_COM0 | LCD_COM1 | LCD_COM2 | LCD_COM3, ENABLE);
LCD_SEG0to23Config(LCD_SEG0|LCD_SEG1|LCD_SEG2|LCD_SEG3|LCD_SEG4|LCD_SEG5|LCD_SEG6|LCD_SEG7, ENABLE);
LCD_Cmd(ENABLE);
}
void LCD_Display(uint16_t dispdata) //LCD顯示
{
uint16_t DisBuf[10]={NUM0,NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7,NUM8,NUM9};
LCD_Write(LCD_RAMRegister_0,0x00000000);
LCD_Write(LCD_RAMRegister_1,0x00000000);
if(dispdata< 10)
LCD_Write(LCD_RAMRegister_0,DisBuf[dispdata]);
else if(dispdata< 100)
LCD_Write(LCD_RAMRegister_0,DisBuf[dispdata/10]|DisBuf[dispdata%10]< 16);
else if(dispdata< 1000)
{
LCD_Write(LCD_RAMRegister_0,DisBuf[dispdata/100]|DisBuf[dispdata/10%10]< 16);
LCD_Write(LCD_RAMRegister_1,DisBuf[dispdata%10]);
}
else
{
LCD_Write(LCD_RAMRegister_0,0xffffffff);
LCD_Write(LCD_RAMRegister_1,0xffffffff);
}
}
視頻演示
補(bǔ)充
FLASH存儲(chǔ)器和EEPROM存儲(chǔ)器對(duì)比
一般性的總結(jié):
使用場(chǎng)景側(cè)重:
審核編輯 黃宇
-
芯片
+關(guān)注
關(guān)注
450文章
49630瀏覽量
417104 -
FlaSh
+關(guān)注
關(guān)注
10文章
1598瀏覽量
147331 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7365瀏覽量
163085 -
CW32
+關(guān)注
關(guān)注
1文章
168瀏覽量
500
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論