0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32L052 FLASH存储器

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2024-02-28 17:43 次阅读

BD网盘链接:

https://pan.baidu.com/s/1dmtMWcK1TII-vutsS8X0Og?pwd=5wwy
提取码:5wwy

概述

CW32L052内部集成了64KB嵌入式FLASH供用户使用,可用来存储应用程序和用户数据

芯片支持对 FLASH 存储器的读、擦除和写操作,支持 擦写保护和读保护

芯片内置 FLASH 编程所需的高压 BOOST 电路, 无须额外提供编程电压

FLASH存储器组织

  • 总容量64KB,分页管理
  • 每页 512 字节
  • 共 128 页

FLASH存储器保护

FLASH 存储器具有擦写保护读保护功能。

  • 擦写保护

包括锁定页擦写保护和PC 地址页擦写保护,处于保护状态的页面不能被擦写,可避免 FLASH 内容被意外改写。

  • 读保护

整片FLASH为保护对象,不支持单页保护,可避免用户代码被非法读取。

FLASH存储器操作

FLASH 存储器操作包括:读操作、擦除、写(编程)操作。

页擦除

FLASH 的页擦除操作的最小单位为 1 页,即 512 字节。页擦除操作完成后,该页所有地址空间的数据内容均为 0xFF

如果对未解锁的 FLASH 页面进行页擦除操作,或者对*正在运行的程序[^1]*进行擦除操作,会操作失败,产生 错误中断标志

CW32L052 内部 FLASH 存储器被划分为 128 页,每 8 页对应擦写锁定寄存器1 个锁定位 。擦写锁定寄存器的各位域与 FLASH 锁定页面的对应关系如下表所示:
0fcb76c86bd5b5d35365f25a6895bb0a3493144165354211_.jpg

写操作

基于嵌入式 FLASH 的特性,写操作只能将 FLASH 存储器中位数据 由'1'改写为'0' ,不能由'0'改写为'1', 因此在写数据之前先要对对应地址所在页进行擦除操作。

基于以上陈述,总结出以下三个原则:

  • 不可对数据位内容为'0'的地址写入
  • 不可对锁定区域内的地址写入
  • 不可对 PC(程序指针)所在的页的地址写入

读操作

CW32L052 对 FLASH 的读操作支持 3 种不同位宽,可采用直接访问绝对地址方式读取,读取的数据位宽必 须和对应地址边界对齐。

核心代码

//单片机头文件
#include "main.h"
//硬件驱动
#include "gpio.h"
#include "delay.h"

//子程序
void LCD_Configuration(void);       //段式LCD配置函数
void LCD_Display(uint16_t dispdata);     //段式LCD显示函数
uint8_t FLASH_Erase(void);         //FLASH页擦除函数
uint8_t FLASH_Write(uint8_t *ByteData,uint16_t amount); //FLASH写操作函数

int main(void)
{
 int i;
 int temp8;
 uint8_t cnt=0;
 uint8_t WriteBuf[256];

    LED_Init();    //初始化程序运行情况指示灯
 LCD_Configuration();    //配置LCD液晶显示屏

 FLASH_Erase();          //页擦除操作
 for(i=0;i< 256;i++)      //验证是否擦除成功
 {
  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++)      //准备写入FLASH存储器的数据
 {
  WriteBuf[i]=i;
 }
 FLASH_Write(WriteBuf,256); //写操作
 for(i=0;i< 255;i++)           //验证是否写入正确
 {
  temp8=*((volatile uint8_t*)(512*127+i));
  if(temp8!=i)
  {
   while(1)
   {
    LED1_ON();     //LED1、LED2同时闪烁指示写入失败
    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上依次显示写入的数据
  Delay_ms(500);
  cnt++;
    }
}

uint8_t FLASH_Erase(void)    //页擦除
{
 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);
 }

}

视频演示
2月28日 00_00_00-00_00_30.gif

补充
FLASH存储器和EEPROM存储器对比

一般性的总结:
7e689d56eb93c13b4fa97e4d66a8bc803493144165354211_.jpg

使用场景侧重:

  • EEPROM:频繁的擦写操作,如存储计数器、传感器数据等
  • FLASH:大容量、高速读写,如存储程序代码和固件等

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    453

    文章

    50397

    浏览量

    421796
  • FlaSh
    +关注

    关注

    10

    文章

    1621

    浏览量

    147749
  • 存储器
    +关注

    关注

    38

    文章

    7452

    浏览量

    163605
  • CW32
    +关注

    关注

    1

    文章

    183

    浏览量

    587
收藏 人收藏

    评论

    相关推荐

    使用SD Flash为TMS320C28x器件编程外部非易失性存储器

    电子发烧友网站提供《使用SD Flash为TMS320C28x器件编程外部非易失性存储器.pdf》资料免费下载
    发表于 10-15 11:48 0次下载
    使用SD <b class='flag-5'>Flash</b>为TMS320C28x器件编程外部非易失性<b class='flag-5'>存储器</b>

    存储器分为随机存储器和什么

    存储器是计算机系统中用于临时存储数据和程序的关键部件,它直接影响到计算机的运行速度和性能。内存储器主要分为两大类:随机存储器(RAM,Random Access Memory)和只读
    的头像 发表于 10-14 09:54 609次阅读

    CW32L010安全低功耗MCU,树立M0+产品行业新标杆!

    是基于eFlash的单芯片低功耗微控制,集成了主频高达48MHz的ARM®Cortex®-M0+内核、高速嵌入式存储器(多至64K字节FLASH和多至4K字节SRAM)以及
    的头像 发表于 10-09 10:12 436次阅读
    <b class='flag-5'>CW32L</b>010安全低功耗MCU,树立M0+产品行业新标杆!

    CW32L010安全低功耗MCU,树立M0+产品行业新标杆!

    是基于 eFlash 的单芯片低功耗微控制,集成了主频高达 48MHz 的 ARM® Cortex®-M0+ 内核、高速嵌入式存储器(多至 64K 字节 FLASH 和多至 4K 字节 SRAM)以及一系列
    发表于 10-09 10:08

    铁电存储器Flash的区别

    铁电存储器(Ferroelectric RAM, FRAM)与闪存(Flash)是两种不同类型的非易失性存储器,它们在工作原理、性能特点、应用场景等方面存在显著的差异。
    的头像 发表于 09-29 15:25 694次阅读

    NAND Flash与其他类型存储器的区别

    NAND Flash作为一种基于NAND技术的非易失性存储器,具有多个显著优点,这些优点使其在数据存储领域得到了广泛应用。以下是对NAND Flash优点的详细阐述,并简要探讨与其他类
    的头像 发表于 08-20 10:24 643次阅读

    ram存储器和rom存储器的区别是什么

    定义: RAM(Random Access Memory):随机存取存储器,是一种易失性存储器,主要用于计算机和其他设备的临时存储。 ROM(Read-Only Memory):只读存储器
    的头像 发表于 08-06 09:17 574次阅读

    昂科烧录支持MindMotion灵动微电子的32位微控制MM32L052NT

    。 MM32L052NT使用高性能的ARM® Cortex®-M0为内核的32位微控制,最高工作频率可达48MHz,内置高速存储器,丰富的增强型I/O端口和外设连接到外部总线。MM32L05
    的头像 发表于 07-04 14:49 434次阅读
    昂科烧录<b class='flag-5'>器</b>支持MindMotion灵动微电子的32位微控制<b class='flag-5'>器</b>MM32<b class='flag-5'>L052</b>NT

    EEPROM与Flash存储器的区别

    可编程只读存储器)和Flash存储器是两种常见的非易失性存储器,它们具有各自的特点和应用场景。本文将深入分析和比较EEPROM与Flash
    的头像 发表于 05-23 16:35 5512次阅读

    STM32L053如何在FLASH程序存储器模式下将程序烧录成功?

    用的是STM32L053芯片,自举模式为FLASH程序存储器模式,此时如何烧录程序?
    发表于 03-25 06:09

    CW32L052 DMA直接内存访问

    CW32L052支持DMA(Direct Memory Access),即直接内存访问,无需CPU干预,实现高速数据传输。数据的传输可以发生在: • 外设和内存之间 :例如ADC采集数据到内存,这种
    的头像 发表于 02-28 16:48 884次阅读
    <b class='flag-5'>CW32L052</b> DMA直接内存访问

    CW32L052单片机支持DMA实现高速数据传输

    CW32L052支持DMA(Direct Memory Access),即直接内存访问,无需CPU干预,实现高速数据传输。
    的头像 发表于 02-27 11:36 947次阅读

    浅谈flash存储器的特点和优缺点

    Flash存储器的写操作具有特殊性,它只能将数据位从1写成0,而不能从0写成1。因此,在对存储器进行写入操作之前,必须先执行擦除操作,将预写入的数据位初始化为1。
    的头像 发表于 02-19 11:37 3099次阅读
    浅谈<b class='flag-5'>flash</b><b class='flag-5'>存储器</b>的特点和优缺点

    stm32 flash写数据怎么存储

    stm32 flash写数据怎么存储的  STM32是一款广泛应用于嵌入式系统开发的微控制,它的Flash存储器是其中一个重要的组成部分。
    的头像 发表于 01-31 15:46 2262次阅读

    fpga配置flash怎么用来存储数据

    要求使用其他存储设备,如Flash存储器,来存储数据。 Flash存储器是一种非易失性
    的头像 发表于 12-15 15:42 2341次阅读