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

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

3天内不再提示

CW32L012实现外部flash下载算法

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2025-10-09 17:38 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

通过网盘分享的文件:cw32外部flash下载算法源码.zip

链接: https://pan.baidu.com/s/1-svjiviNAkuxRShuk0rNEg?pwd=CW32 提取码: CW32

文件说明

1._Template 为keil 的下载算法模板

2.cw32l012_exflash_down 为cw32平台下的实际测试工程源代码

3.cw32l012_w25qxx.FLM 为生成的FLM下载文件

Q:什么是外部flash 下载算法?

外部flash或者内置的片上flash,都是编译器通过调用写好的FLM文件来实现下载,单片机内部的安装pack包就会有(官方实现),外部flash的情况比较复杂,例如用的哪种flash,用的什么接口,都是不定的,没有办法写好一个通用的下载算法,这里也只是介绍一个通用的方法,实际需要按情况修改。

注意本例程的FLM文件信息如下

1.基于CW32L012

2.使用W25Q128作为外置flash

3.使用SPI3 资源,IO 分配为

SPI3_CS PA8

SPI3_SCK PA9

SPI3_MISO PA10

SPI3_MOSI PA11

4.额外使用了一个开关IO ,PA6 为打开外设的电源控制IO

5.本案例用的外部16mz晶振

Q:外部flash对单片机的性能有要求吗?

没有太大要求。下载算法是加载到RAM中的,对flash 没有要求,RAM通常4K或者以上就可以运行下载算法(当然你的代码要简洁)。例如你的RAM是4K 你的下载算法生成的代码空间就要小于4K,8K就小于8K。

Q:为什么需要外部flash算法?

外部flash算法是用来节省内部flash空间的,在一些应用中,图片数据,字模数据比较占用单片机内存空间,在内存小的单片机中,是存不下这些数据的,通过在一些设置和下载算法,可以将工程中的常量保存到外部flash。

Q:为什么不用其他方式对外部flash下载数据?

1.用文件系统方式。会增加复杂度,增加性能占用。对于性能低的单片机,需要快速传输的数据不适合再走文件系统的接口。

2.用其他方法直接下载数据,比如专门下载数据的工程,或者专门的编程器,这些方案是可以,但是一方面是下载就非常麻烦,另一方面是对于数据的绝对地址管理起来费劲。

下载算法实现需要准备:

1.官方单片机的库文件(或者准备一个工程模板)

2.对应的flash驱动文件

3.Keil对于下载算法编写的工程模板

具体步骤大致分为以下几步

1.复制keil官方下载算法工程,同时复制FlashOS.H文件到工程根目录,然后还需要去配置对应的单片机型号,添加CMSIS的核心文件,最后修改一下文件包含路径使其能编译。编译器最好用AC6,选择代码空间优化。

wKgZPGjaXuGAA7rKAAAqgkrJeWg969.jpg

wKgZO2jaXuGAHnhDAAA5xJnqa4o985.jpg

wKgZO2jngg6ADWvVAASQStAuFS8262.png

wKgZO2jaXuKAREayAADG1nJ_G-M005.jpg

wKgZO2jngieAdGkkAAbkRpa2kUQ280.png

2.修改flashDev.C中的文件,使其符合实际应用需求

wKgZPGjaXuOAH3jDAAB9OCw5b58315.jpg

3.添加对应单片机的库文件并编译,注意:

a.因为下载算法生成的是与位置无关的代码,添加进去的所有文件,所有函数都会参与编译,因此只可以添加需要的文件,文件中有用不到的函数还需要屏蔽!!!

b.注意不需要启动文件!!!

wKgZO2jaXuSAPXSYAABo9rAH0hA563.jpg

▲这里只添加用的到的文件

wKgZO2jnglaAYRXXAAh0qs4h2uw876.png

▲这里大部分用不到的代码都屏蔽

4.添加对应型号的flash驱动,并能正常编译

wKgZPGjaXuWAQILzAAAN-qJRhAY103.jpg

▲Spi 底层外设初始化Nor flash 驱动函数

5.编写初始化my_main函数,初始化外设,并能正常编译

wKgZO2jaXuaADN9-AABEPJ5o7o0572.jpg

wKgZPGjaXueAcD3tAADQiq5ec6Q219.jpg

6.编写flashPrg.c文件,需要实现以下函数,有缺失的自行补齐。这一步是最关键的,最核心的。

http://a.int Init (unsigned long adr, unsigned long clk, unsigned long fnc)

wKgZPGjngmuAEihJAAKX8XTmu24706.png

http://b.int UnInit (unsigned long fnc)

wKgZO2jaXumAWIT8AAAYEEI4YLQ805.jpg

http://c.int EraseChip (void)

wKgZO2jngoSAIwcFAAFav9vzVrw011.png

http://d.int EraseSector (unsigned long adr)

wKgZO2jngoyAYfaLAAIv3zQPILU962.png

http://e.int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf)

wKgZPGjaXuuAHcoaAAAtGPLy7SA498.jpg

http://f.int BlankCheck (unsigned long adr,unsigned long sz,unsigned char pat)

wKgZO2jaXuyATIr3AAAg4lFUDHw588.jpg

g.unsigned long Verify(unsigned long adr,unsigned long sz,unsigned char *buf)

wKgZPGjaXuyAeBCZAAAfIly3c-Y786.jpg

对应为初始化、去初始化、全片擦除、扇区擦除、扇区写入、擦除检测、校验。

以上这些函数都要有,但函数内部有些可以不去实现。

正常编译到这一步就完成了。

7.配置编译文件输出路径

cmd.exe /C copy "Objects%L" ".@L.FLM"

cmd.exe /C copy ".@L.FLM" "C:user_appkeil5ARMFlash@L.FLM"

注意:第二条的路径和keil安装路径有关,需要根据实际情况修改。

wKgZPGjaXu2AYnFBAACM0H8-KUE681.jpg

8.正常编译结果如下

wKgZO2jaXu6ANrrbAABODPJ2TEI702.jpg

下载算法使用

1.添加下载算法

wKgZPGjaXu6AVPFPAACyHoiGeqY046.jpg

2.配置下载算法所使用的RAM空间大小为实际RAM的大小

wKgZO2jaXu-AZGxyAACHuHV99aw269.jpg

3.将需要放到外部flash的资源独立一个c文件保存,并配置存储地址

例如下图测试文件,定义两个const类型的字符串,指定存储地址为0x9000000开始。

wKgZO2jaXu-ADeyXAACrKpS_lGg232.jpg

4.编译查看是否分配到外置flash上

如下图,识别到一个16M的外置flash,已经使用了3.66%,实际数据是一些图片数据,一共有600K字节。

wKgZPGjaXu-AI6mFAACN4sPj0Fk293.jpg

5.如何读取这个数据呢

和普通spi flash 一样,仍然要发送命令的方式来读取,只不过地址为显性的一个地址,也不需要人为去记。

例如下面这个测试程序

定义了两个const类型的数据,数据读取时,直接取地址符取出编译器分配的地址,然后减去一个基地址偏移0x90000000,然后得到的地址就是实际nor flash 需要发送访问的地址

wKgZO2jaXvCAR8U4AABKfI5rFJc516.jpgwKgZPGjaXvGAVTNIAAENAHmmrKw349.jpg

6.实际测试串口打印验证

如下图的测试结果,地址就是我们要求的0x9000000开始的,数据读出来的也是实际存储的数据

wKgZO2jaXvKAYvLIAACkCNb_3aw535.jpg

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

    关注

    6074

    文章

    45335

    浏览量

    663294
  • FlaSh
    +关注

    关注

    10

    文章

    1715

    浏览量

    154663
  • 算法
    +关注

    关注

    23

    文章

    4760

    浏览量

    97121
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    在STLinkV2用下载算法将程序下载到外部flash报错怎么解决?

    你好:在uVision用下载算法将程序下载到外部flash(QSPIFLASH W25Q256JV) .使用CMSIS_DAP可以下載,執行正常. 但是改用STLinkV2,就会出现
    发表于 03-20 06:12

    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频CW32L012新品发布!

    DAC,并配备有可灵活连接的双路轨到轨运算放大器,可以在单颗芯片上实现完整的混合信号数字处理。 CW32L012可以在 -40℃至+85℃ 的温度范围内工作,供电电压宽达1.7V~5.5V。支持
    发表于 07-16 16:32

    studio有没有通过更改下载算法,同时下载到内部flash外部flash

    我现在使用的stm32h750,内部flash很小,需要使用外部qspiflash来储存程序。 studio可以像mdk一样设置两个下载算法吗? 这样才能一个程序使用两个
    发表于 09-26 07:04

    **CW32L012****开发评估板的第一个程序**

    DAP Debugger,大家自己手里是什么下载器,就选择对应的下载flash这里一定要有cw32l012,没有就点add添加。 然后是编译下载
    发表于 11-22 00:09

    CW32L012小型机器人控制评估板活动 四足机器人+智能小车 开箱评测

    :套件主控板在出厂时应该是已经下载过程序了的,也可以不用下载直接开玩体验。 1) 如果你之前没有安装CW32L012的DFP器件包,则要先官网下载C
    发表于 11-24 23:44

    首创CW32L083GCC工程模版

    VScode或者其他的编译器来实现开发环境的搭建,就需要自己编写CW32L083_FLASH.ld、以及startup_cw32l083_gcc.s。 【实现的思路】 1、寻找官方支持
    发表于 06-19 22:17

    ubuntu下面用vscdoe实现CW32L031的工程创建、编译、下载与调试

    /template.elf 2、下载: lugl@lugl-virtual-machine:~/CW32L/cw32l083_gcc$ make flash -e Start pyO
    发表于 06-25 21:13

    STM32H750外部Flash下载算法的资料和工程文件免费下载

    本文档的主要内容详细介绍的是STM32H750外部Flash下载算法的资料和工程文件免费下载
    发表于 08-29 08:00 173次下载
    STM32H750<b class='flag-5'>外部</b><b class='flag-5'>Flash</b><b class='flag-5'>下载</b><b class='flag-5'>算法</b>的资料和工程文件免费<b class='flag-5'>下载</b>

    工程师笔记|通过 KEIL 制作 QSPI 接口的外部 Flash 下载算法

    关键词:KEIL,QSPI,下载算法 目录预览 1. 引言 2. MDK 下载算法基础知识 3. 程序擦除操作执行流程 4. 程序烧录操作执行流程 5. 程序校验操作执行流程 6. M
    的头像 发表于 02-12 12:10 5623次阅读

    CW32L083如何实现AUTOTRIM时钟校准?

    CW32L083如何实现AUTOTRIM时钟校准?
    的头像 发表于 11-07 17:17 1213次阅读
    <b class='flag-5'>CW32L</b>083如何<b class='flag-5'>实现</b>AUTOTRIM时钟校准?

    通过KEIL制作QSPI接口的外部Flash下载算法

    电子发烧友网站提供《通过KEIL制作QSPI接口的外部Flash下载算法.pdf》资料免费下载
    发表于 09-19 16:26 7次下载
    通过KEIL制作QSPI接口的<b class='flag-5'>外部</b><b class='flag-5'>Flash</b><b class='flag-5'>下载</b><b class='flag-5'>算法</b>

    CW32L052 FLASH存储器

    CW32L052内部集成了64KB嵌入式FLASH供用户使用,可用来存储应用程序和用户数据。芯片支持对 FLASH 存储器的读、擦除和写操作,支持擦写保护和读保护。芯片内置 FLASH
    的头像 发表于 02-28 17:43 1368次阅读
    <b class='flag-5'>CW32L</b>052 <b class='flag-5'>FLASH</b>存储器

    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频CW32L012新品发布!

    CW32L012基于ARM® Cortex-M0+内核,主频高达96MHz,同时集成了CORDIC硬件单元、扩展算术运算单元(EAU),可以提供部分数学函数、算术运算的硬件加速,特别适用于电机控制、电源、计量、信号处理等应用。
    的头像 发表于 07-16 16:34 1011次阅读
    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频<b class='flag-5'>CW32L012</b>新品发布!

    使用芯源CW32的CW32L012开发评估板做了spi屏幕驱动

    CW32生态社区以极高的性价比入手了这块CW32L012开发评估板,开发板以底板、核心板、1.77寸TFT显示屏构成,所有的IO口都引出了排针,这点好评,使用杜邦线可以非常方便的连接其他模块。引脚
    的头像 发表于 11-21 11:34 293次阅读
    使用芯源<b class='flag-5'>CW</b>32的<b class='flag-5'>CW32L012</b>开发评估板做了spi屏幕驱动

    CW32L012小机器人的电机控制

    线的大功率调速,电机的控制性能直接决定了系统的响应速度、运行精度、能耗效率与稳定性。这里分享CW32L012小机器人的正反转、调速的电机控制 电机的正反转 从配套的开发板资料介绍中可以知道,这是电机的驱动芯片RZ7899 从立创商城下载该芯片的数据
    的头像 发表于 11-21 13:18 1568次阅读
    <b class='flag-5'>CW32L012</b>小机器人的电机控制