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

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

3天内不再提示

第二十五章 FLASH

W55MH32 来源:W55MH32 作者:W55MH32 2025-05-29 16:03 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机

W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm® Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。

在封装规格上,W55MH32 提供了两种选择:QFN68和QFN100。

W55MH32Q采用QFN68封装版本,尺寸为8x8mm,它拥有36个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、3个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN以及1个USB2.0。在保持与同系列其他版本一致的核心性能基础上,仅减少了部分GPIO以及SDIO接口,其他参数保持一致,性价比优势显著,尤其适合网关模组等对空间布局要求较高的场景。紧凑的尺寸和精简化外设配置,使其能够在有限空间内实现高效的网络连接与数据交互,成为物联网网关、边缘计算节点等紧凑型设备的理想选择。 同系列还有QFN100封装的W55MH32L版本,该版本拥有更丰富的外设资源,适用于需要多接口扩展的复杂工控场景,软件使用方法一致。更多信息和资料请进入http://www.w5500.com/网站或者私信获取。

此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及MQTT SSL等,为网络通信安全再添保障。

为助力开发者快速上手与深入开发,基于W55MH32Q这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。

若您想获取芯片和开发板的更多详细信息,包括产品特性、技术参数以及价格等,欢迎访问官方网页:http://www.w5500.com/,我们期待与您共同探索W55MH32的无限可能。

wKgZO2gbOfaAVPzkACJSygzv-rI600.png

第二十五章 FLASH

1 W55MH32 FLASH 简介

WMH32的闪存模块由主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。

主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每一页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是 0x08000000,B0、B1 都接 GND 的时候,就是从0x08000000 开始运行代码的。

信息块,该部分分为 2 个小部分,其中启动程序代码,用来存储 ST 自带的启动程序,用来串口下载代码,当 B0 接 3V3,B1 接 GND 的时候,运行的就是这部分代码。用户选中字节,则一般用于配置写保护、读保护等功能,本章不作介绍了。

闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制结构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行。既在进行写或擦除操作时,不能进行代码或数据的读取操作。

型号 W55MH32L W55MH32Q
Flash(KB) 1024 1024
SRAM(KB) 96 96
高级定时器 2 2
通用定时器 10 10
基本定时器 2 2
SPI 2 2
I2C 2 2
USART/UART 5 3
USB 1 1
CAN 1 1
SDIO 1 -
Ethernet 1 1
GPIO 端口 66 36
12 位 ADC(通道数) 3(12 个通道) 3(12 个通道)
12 位 DAC(通道数) 2(2 个通道) 2(2 个通道)
随机数模块 支持 支持
硬件加密算法单元 支持 支持
页大小(K 字节) 4 4
CPU 频率 216M 216M
工作电压 2.0 - 3.6V 2.0 - 3.6V
工作温度 -40 - +85℃ -40 - +85℃

2 闪存的读取

内置闪存模块可以在通用地址空间直接寻址,任何 32 位数据的读操作都能访问闪存模块的内容并得到相应的数据。读接口在闪存端包含一个读控制器,还包含一个 AHB 接口与 CPU衔接。这个接口的主要工作是产生读内存的控制信号并预取 CPU 要求的指令块,预取指令块仅用于在 I-Code 总线上的取指操作,数据常量是通过 D-Code 总线访问的。这两条总线的访问目标是相同的闪存模块,访问 D-Code 将比预取指令优先级高。

这里要特别留意一个闪存等待时间,因为 CPU 运行速度比 FLASH 快得多,W55MH32的 FLASH 最快访问速度≤24Mhz,如果 CPU 频率超过这个速度,那么必须加入等待时间,比如我们一般使用 72Mhz 的主频,那么 FLASH 等待周期就必须设置为 2,该设置通过FLASH_ACR 寄存器设置。

例如,我们要从地址 addr,读取一个半字(半字为 16 位,字为 32 位),可以通过如下的

语句读取:

data = *(vu16*)addr;

将 addr 强制转换为 vu16 指针,然后取该指针所指向的地址的值,即得到了 addr 地址的值。类似的,将上面的 vu16 改为 vu8,即可读取指定地址的一个字节。相对 FLASH 读取来说,W55MH32 FLASH 的写就复杂一点了。

3 闪存的编程和擦除

W55MH32 的闪存编程是由 FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含 7 个 32位寄存器,它们分别是:

⚪FPEC 键寄存器(FLASH_KEYR)

⚪选择字节键寄存器(FLASH_OPTKEYR)

⚪闪存控制寄存器(FLASH_CR)

⚪闪存状态寄存器(FLASH_SR)

⚪闪存地址寄存器(FLASH_AR)

⚪ 选择字节寄存器(FLASH_WRPR)

其中 FPEC 键寄存器总共有 3 个键值:

⚪RDPRT 键 = 0X0000 00A5

⚪KEY1 = 0X4567 0123

⚪KEY2 = 0XCDEF 89AB

W55MH32 复位后,FPEC 模块是被保护的,不能写入 FLASH_CR 寄存器;通过写入特定的序列到 FLASH_KEYR 寄存器可以打开 FPEC 模块(即写入 KEY1 和 KEY2),只有在写保护被解除后,我们才能操作相关寄存器。

W55MH32 闪存的编程每次必须写入 16 位(不能单纯的写入 8 位数据),当 FLASH_CR 寄存器的 PG 位为‘1’时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据,FPEC 都会产生总线错误。在编程过程中(BSY 位为’1’),任何读写内存的操作都会使CPU 暂停,直到此次闪存编程结束。同样,W55MH32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的(其值必须是 0xFFFF),否则无法写入,在 FLASH_SR 寄存器的 PGERR 位将得到一个警告。W55MH32 的 FLASH 编程过程如图所示:

wKgZPGg4E8mAR1XOAACOGLbgyk4586.png

闪存编程过程

从上图可以得到闪存的编程顺序如下:

1)检查 FLASH_CR 的 LOCK 是否解锁,如果没有则先解锁

2)检查 FLASH_SR 寄存器的 BSY 位,以确认没有其他正在进行的编程操作

3)设置 FLASH_CR 寄存器的 PG 位为‘1’

4)在指定的地址写入要编程的半字

5)等待 BSY 位变为‘0’

6)读出写入地址并验证数据

前面提到,我们在 W55MH32 的 FLASH 编程的时候,要先判断缩写地址是否被擦出了,所以,我们有必要再介绍一下 W55MH32 的闪存擦除,W55MH32 的闪存擦除分为两种:页擦除和整片擦除。页擦除过程如图 所示:

wKgZO2g4E8mAdiTkAACWvGoBCAg738.png

闪存页擦除过程

从上图可以看出,W55MH32 的页擦除顺序为:

1)检查 FLASH_CR 和 LOCK 是否解锁,如果没有则先解锁

2)检查 FLASH_SR 寄存器的 BSY 位,以确认没有其他正在进行的闪存操作

3)设置 FLASH_CR 寄存器的 PER 位为‘1’

4)用 FLASH_AR 寄存器选择要擦除的页

5)设置 FLASH_CR 寄存器的 STRT 位为‘1’

6)等待 BSY 位变为‘0’

7)读出被擦除的页并做验证

本章我们只用到了 W55MH32 页擦除功能,整片擦除功能我们在这里就不介绍了。

4 FLASH 寄存器

通过上面的讲解,我们基本对 W55MH32 闪存的读写执行步骤有所了解。接下来,我们介绍本实验需要用到的一些 FLASH 寄存器。

4.1 FPEC 键寄存器(FLASH_KEYR)

FPEC 键寄存器描述如图 所示:

wKgZPGg4E8mAQvmjAAJbh19Acmo217.png

FLASH_KEYR 寄存器

该寄存器主要用来解锁 FPEC,必须在该寄存器写入特定的序列(KEY1 和 KEY2)解锁后,才能对 FLASH_CR 寄存器进行写操作。

4.2 FLASH 控制寄存器(FLASH_CR)

FLASH 控制寄存器描述如图所示:

wKgZPGg4E8qANu_7AAW-TLW2K1w810.png

图 FLASH_CR 寄存器

该寄存器我们本章只用到了它的 LOCK、STRT、PER 和 PG 等 4 个位。LOCK 位,该位用于指示 FLASH_CR 寄存器是否被锁住,该位在检测到正确的解锁序列后,硬件将其清零。在一次不成功的解锁操作后,在下次系统复位之前,该位将不再改变。

STRT 位,该位用于开始一次擦除操作。在该位写入 1,将执行一次擦除操作。

PER 位,该位用于选择页擦除操作,在页擦除的时候,需要将该位置 1。

PG 位,该位用于选择编程操作,在往 FLASH 写数据的时候,该位需要置 1。

其他位,我们就不在这里介绍了,请大家参考《W55MH32xxx参考手册》。

4.3 闪存状态寄存器(FLASH_SR)

闪存状态寄存器描述如图所示:

wKgZO2g4E8uATa2wAAifVVmSPvY793.png

图 FLASH_SR 寄存器

该寄存器主要用来指示当前 FPEC 的操作编程状态。由于寄存器中描述比较详细,这里就不重复了。

4.4 闪存地址寄存器(FLASH_AR)

闪存地址寄存器描述如图所示:

wKgZO2g4E8uAMycBAAQyZxLeEk0669.png

图FLASH_AR 寄存器

该寄存器在本章,我们主要用来设置要擦除的页。关 于 W55MH32 FLASH 的 介 绍 , 我 们 就 介 绍 到 这 里 。 更 详 细 的 介 绍 , 可 以 参 考《W55MH32参考手册》。

5 例程设计

5.1 FLASH_Eeprom

该通过例程串口输出系统时钟信息和测试提示,在无限循环里不断对 WIZnet FLASH 进行读写操作,并且把读取的数据通过串口输出,以此实现对 FLASH 的读写测试。

5.1 函数声明

声明了UART_Configuration()函数,其功能是配置串口参数。

5.2 常量与数组定义

定义了一个常量字符串数组TEXT_Buffer,内容为"WIZnet FLASH TEST"。

借助SIZE宏定义获取数组长度。

设定了FLASH_SAVE_ADDR常量,此为 FLASH 的保存地址。

5.3 主函数main()

int main(void)
{
    uint8_t datatemp[SIZE], i;

    RCC_ClocksTypeDef clocks;
    delay_init();
    UART_Configuration(115200);
    RCC_GetClocksFreq(&clocks);

    printf("n");
    printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhzn",
           (float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,
           (float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);
    printf("FLASH EEPROM Tset.n");

    while (1)
    {
        WIZFLASH_Write(FLASH_SAVE_ADDR, (u16 *)TEXT_Buffer, SIZE);
        WIZFLASH_Read(FLASH_SAVE_ADDR, (u16 *)datatemp, SIZE);
        for (i = 0; i < SIZE; i++)
        {
            printf("%sn", datatemp);
        }

        memset(datatemp, 0x00, sizeof(datatemp));
        delay_ms(1000);
    }
}

定义了一个用于存储从 FLASH 读取数据的数组datatemp,以及一个循环变量i。

初始化延迟函数、串口配置,并且获取系统时钟频率。

通过printf()函数输出系统时钟频率信息以及测试提示信息。

进入一个无限循环:调用WIZFLASH_Write()函数把TEXT_Buffer数组内容写入到指定的 FLASH 地址。

⚪调用WIZFLASH_Read()函数从该地址读取数据到datatemp数组。

⚪运用for循环遍历datatemp数组,然后通过printf()函数输出数组内容。

⚪调用memset()函数把datatemp数组清零。

⚪调用delay_ms()函数延迟 1 秒。

5.4 串口配置函数UART_Coniguration()

void UART_Configuration(uint32_t bound)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate            = bound;
    USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits            = USART_StopBits_1;
    USART_InitStructure.USART_Parity              = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART_TEST, &USART_InitStructure);
    USART_Cmd(USART_TEST, ENABLE);
}

对 GPIO 和 USART 的初始化结构体进行定义。

使能 USART1 和 GPIOA 的时钟。

配置 GPIOA 的引脚 9 为复用推挽输出模式,引脚 10 为浮空输入模式。

对 USART 的波特率、数据位、停止位、奇偶校验等参数进行配置。

初始化 USART 并使能。

5.5 字符发送函数SER_PutChar()

int SER_PutChar(int ch)
{
    while (!USART_GetFlagStatus(USART_TEST, USART_FLAG_TC));
    USART_SendData(USART_TEST, (uint8_t)ch);

    return ch;
}

等待串口发送完成标志位USART_FLAG_TC置位。

把字符发送到串口。

5.6 重定向函数fputc()

若要发送的字符是换行符n,则先发送回车符r。

调用SER_PutChar()函数发送字符。

6 下载验证

6.1 FLASH_Eeprom

进入主循环后,程序会不断执行以下操作:

把TEXT_Buffer数组中的字符串 "WIZnet FLASH TEST" 写入到指定的 FLASH 地址。

从该 FLASH 地址读取数据到datatemp数组。

借助printf()函数将datatemp数组的内容通过串口输出。

由于for循环的存在,每次读取到的数据会被重复输出SIZE次。不过,原代码里printf("%sn", datatemp);存在错误,它会把整个datatemp数组当作字符串输出,而不是逐个字符输出。正确的做法应该是printf("%c", datatemp[i]);。修正后,串口会每隔 1 秒输出一次 "WIZnet FLASH TEST"。

wKgZO2g4E8mAOcEDAAIAsM9lJA4118.png

WIZnet 是一家无晶圆厂半导体公司,成立于 1998 年。产品包括互联网处理器 iMCU™,它采用 TOE(TCP/IP 卸载引擎)技术,基于独特的专利全硬连线 TCP/IP。iMCU™ 面向各种应用中的嵌入式互联网设备。

WIZnet 在全球拥有 70 多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。

香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。

审核编辑 黄宇

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

    关注

    31

    文章

    5588

    浏览量

    129035
  • FlaSh
    +关注

    关注

    10

    文章

    1715

    浏览量

    154666
  • 闪存编程
    +关注

    关注

    0

    文章

    12

    浏览量

    6854
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    《DNK210使用指南 -CanMV版 V1.0》第二十五章 LCD图片显示实验

    第二十五章 LCD图片显示实验 本章将介绍在LCD上的图片显示。通过本章的学习,读者将学习到LCD上图片的显示。本章分为如下几个小节:25.1 lcd模块介绍25.2 硬件设计25.3 程序设计
    发表于 10-23 09:34

    【正点原子FPGA连载】第二十七章gpio子系统下的LED驱动实验-领航者ZYNQ之linux开发指南

    原子公众号,获取最新资料第二十七章gpio子系统下的LED驱动实验在上一当中已经给大家介绍了linux的gpio子系统,那本章我们就来编写一个基于gpio子系统API的LED驱动程序,本章将在第二十五章
    发表于 09-16 17:40

    在显示器上显示出了静态的彩条图案

    关注正点原子公众号,获取最新资料更新第二十五章HDMI方块移动实验在HDMI彩条显示实验中,我们成功地在显示器上显示出了静态的彩条图案。本章我们通
    发表于 12-07 12:50

    第二十五讲 同步计数器

    第二十五讲 同步计数器 7.3.2 同步计数器一、同步二进制计数器1.同步二进制加法计数器JK触发器组成的4位同步二进制加法
    发表于 03-30 16:28 9900次阅读
    <b class='flag-5'>第二十五</b>讲 同步计数器

    模拟电路网络课件 第二十五节:集成运算放大器中的电流源

    模拟电路网络课件 第二十五节:集成运算放大器中的电流源 6.1 集成运算放大器中的电流源 一、三极管电流源
    发表于 09-17 11:23 2454次阅读
    模拟电路网络课件 <b class='flag-5'>第二十五</b>节:集成运算放大器中的电流源

    【正点原子FPGA连载】第二十五章HDMI方块移动实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    【正点原子FPGA连载】第二十五章HDMI方块移动实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
    发表于 11-24 14:36 13次下载
    【正点原子FPGA连载】<b class='flag-5'>第二十五章</b>HDMI方块移动实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    2023高交会|第二十五届中国国际高新技术交易会·招商工作全面启动

    2023高交会|第二十五届中国国际高新技术交易会·招商工作全面启动
    的头像 发表于 07-21 17:53 1686次阅读
    2023高交会|<b class='flag-5'>第二十五</b>届中国国际高新技术交易会·招商工作全面启动

    火热预定中2023第二十五届中国国际高新技术交易会11.15-11.19日

    火热预定中----2023深圳第二十五届中国国际高新技术交易会11.15-11.19日
    的头像 发表于 08-18 14:39 1242次阅读

    火热招商--2023第二十五届中国国际高新技术交易会11.15-11.19日

    火热招商中----2023第二十五届中国国际高新技术交易会11.15-11.19盛大召开
    的头像 发表于 08-23 09:47 1025次阅读

    中软国际与深开鸿邀您相约第二十五届中国国际软件博览会

    ​ 原文标题:中软国际与深开鸿邀您相约第二十五届中国国际软件博览会 文章出处:【微信公众号:中软国际】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 08-31 13:10 855次阅读

    上海贝岭荣获“第二十五届上市公司金信披奖”

    11月23日,由中国证券报、南通市人民政府联合主办的“2023上市公司高质量发展论坛暨第二十五届上市公司金牛奖颁奖典礼”在江苏南通隆重举行,备受瞩目的上市公司金牛奖榜单正式揭晓。
    的头像 发表于 12-01 10:12 960次阅读

    中国中车多家子公司荣获第二十五届中国专利奖

    近日,国家知识产权局发布了关于第二十五届中国专利奖授奖的决定,中国中车多家子公司获奖。
    的头像 发表于 06-13 11:47 857次阅读

    国星光电荣获第二十五届中国专利优秀奖

    近日,国家知识产权局发布《关于第二十五届中国专利奖授奖的决定》,国星光电凭借发明专利“一种量子点发光器件及其制造方法” 荣获中国专利优秀奖。
    的头像 发表于 06-13 16:04 748次阅读

    云知声AI顾问闪耀第二十五届投洽会

    第二十五届中国国际投资贸易洽谈会期间,由云知声厦门团队打造的15台智能互动一体机—“AI顾问”正式上岗,分布于展馆中心展区、新闻中心、会议中心等多个核心区域,以新颖有趣的形象和智慧化交互为与会嘉宾提供现场AI咨询与互动服务,成为本届投洽会的一大亮点。
    的头像 发表于 09-09 10:50 902次阅读

    智芯公司荣膺第二十五届中国专利奖金奖

    近日,第十四届中国国际专利技术与产品交易会(以下简称“专交会”)开幕式暨第二十五届中国专利奖颁奖大会在大连举行。本届专交会主题为“专利转化运用赋能创新发展”,是我国知识产权领域规格最高、专业性最强、影响力最广的专业展会。
    的头像 发表于 10-18 10:50 907次阅读