【GD32F427开发板试用】IAR flash loader 下载GD32F427流程简要分析

news2024/11/13 14:31:37

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:andeyqi

很高兴获的社区的GD32F427开发板的评测机会,这几年芯片慌大家都能感受到,项目上经常因为货源紧张不断更换替代料也是很普遍的现象,GD32作为国产的MCU芯片可以很方便的替换到现有的STM32相关的平台,再次感谢社区的评测机会。

1.IAR 工程的下载配置

打开GD32F427的demo 工程(…\GD32427V_START_Demo_Suites\Projects02_GPIOKey_Polling_mode\EWARM),从IAR的debug 选项的dowenload 配置可知,IAR 使用安装路径下的如下文件了下载程序, T O O L K I T D I R TOOLKIT_DIR TOOLKITDIR\config\flashloader\GD\FlashGD32F427xK.board。

2.board文件说明

此*.board 即为我们本贴的主题,*.board 文件是什么文件,从IAR的帮助文档摘出如下说明,.board 文件是flash loader 下载镜像的配置文件被IAR 的C-SPY debug 对象引用。

Ext.Type of fileOutput fromInput to
boardConfiguration file for flash loaderText editorC-SPY

GD32F427 的flash loader 配置文件内容如下:

<?xml version="1.0" encoding="iso-8859-1"?>

<flash_board>

T O O L K I T D I R TOOLKIT_DIR TOOLKITDIR\config\flashloader\GD\FlashGD32F425xK.flash

</flash_board>

3.flash文件说明

从配置选项可以看出,此.board主要的配置信息是告诉flash loader 要根据FlashGD32F425xK.flash文件的配置下载镜像,此.flash 的文件是什么文件呢,从iar 的文件说明可知,.flash 文件也是C-SPY加载的文件,主要定义了flash 的相关属性配置。

Ext.Type of fileOutput fromInput to
flashConfiguration file for flash loaderText editorC-SPY

FlashGD32F425xK.flash 内容如下:

<?xml version="1.0" encoding="iso-8859-1"?>

<flash_device>
T O O L K I T D I R TOOLKIT_DIR TOOLKITDIR\config\flashloader\GD\FlashGD32F425xKRAM256K.out
8
4 0x4000
1 0x10000
7 0x20000
4 0x4000
1 0x10000
7 0x20000
4 0x40000
<flash_base>0x08000000</flash_base>
T O O L K I T D I R TOOLKIT_DIR TOOLKITDIR\config\flashloader\GD\FlashGD32F425xK.mac
1
</flash_device>

如下是上述xml文件的配置说明:

To accommodate a large range of different flash memories, C-SPY uses a few concepts which
detail the characteristics of flash memories.
Page
**A page is the smallest writable unit of the flash memory.**Many flash
memories cannot write less than for example 128 or 256 bytes in a
single write operation. C-SPY will never request the flash loader to write
anything smaller than a page, and uses padding if necessary to fill out a
page. Of course, some flash memories have no such restrictions and can
specify a page size of 1 byte.
Block
**A block is the smallest erasable unit of the flash memory.**For example,
a flash memory with a 256-byte page size could still require that flash
memory should be erased in 4-Kbyte chunks. The block size must
always be a multiple of the page size. A flash memory can consist of
several blocks of different sizes. It can also lack such restrictions, in
which case the block size would be the same as the page size.
Base address
**This is the start address of the flash memory, when it is written.**Some
flash memories are simply memory mapped into a fixed address range
and the base address is then the start of that range. Other flash memories
are mapped into different addresses when being programmed and when
the application is later executing. The base address is then the address
where these memories are mapped when being programmed. Yet other
flash memories are not memory mapped at all, but work more like
external disk-like devices. The base address is then simply the preferred
address to be used for the start of the memory when it is being
programmed.
From the C-SPY perspective, a flash memory starts at a given address and consists of a sequence
of blocks (possibly of different sizes), each of which consists of a number of pages. The
sequence can also contain gaps.

各配置项概要说明如下:

The mandatory elements include:
● exe—the path to the flash loader
● flash_base—the flash memory base address
● page—the flash memory page size
● block—the block layout of the flash memory

从上面的文件解析可以看出GD32F427内部的falsh 的最小变成单位page为8字节,flash 的 start 地址为0x08000000,内部的扇区0-3为16kb,扇区4为64kb,扇区5为128kb 其余的就不一一描述了,上述的配置和GD32手册内的layout 是一致的。

4.mac文件说明

上述的.flash 文件除了描述了flash的配置信息,在最后还配置了FlashGD32F425xK.mac 文件,此文件作用是什么呢,从iar 的帮助文档可知此文件为C-SPY下载的配置文件。

Ext.Type of fileOutput fromInput to
macC-SPY macro definitionText editorC-SPY

FlashGD32F425xK.mac 文件内容如下:

execUserFlashInit()
{
  __message "--------------------------execUserFlashInit start--------------------\n";
  if (0x0000AA00 != (0x0000FF00 & __readMemory32(0x40023C14,"Memory")))
  {
    __message "--------------------------Stop FWDGT if it's running so we can ask a question--------------------\n";
    //Stop FWDGT if it's running so we can ask a question
    __writeMemory32(__readMemory32(0xE0042008, "Memory") | 0x1000, 0xE0042008, "Memory");
    
    if (!__messageBoxYesCancel("Do you want to perform mass erase to unlock the device?", "Unlocking device"))
    {
      __abortLaunch("Unlock cancelled. Debug session cannot continue.");
    }

    __writeMemory32(0x45670123, 0x40023C04, "Memory"); // FMC_KEY = FMC_KEY1;
    __writeMemory32(0xCDEF89AB, 0x40023C04, "Memory"); // FMC_KEY = FMC_KEY1;
    __writeMemory32(0x00000000, 0x40023C00, "Memory"); // Flash 0 wait state
    __writeMemory32(0x08192A3B, 0x40023C08, "Memory"); // FMC_OBKEY = FMC_KEY1;
    __writeMemory32(0x4C5D6E7F, 0x40023C08, "Memory"); // FMC_OBKEY = FMC_KEY1;
      
    __message "Setting FLASH readout protection level 0 (disabled)";
  
    __var temp_obctl0;
    
    temp_obctl0 = 0xFFFF00FF & __readMemory32(0x40023C14,"Memory");
    temp_obctl0 |= 0xAA00;
 
    __writeMemory32(temp_obctl0 , 0x40023C14, "Memory"); // Set SPC bits of FMC_OBCTL0 register  to 0xAA
    __writeMemory32(0x2 | temp_obctl0 , 0x40023C14, "Memory"); // Set OB_START
    
    while(0x10000 & __readMemory32(0x40023C0C,"Memory"))
    {
    
      __delay(100);
    
    }  // Wait while FLASH busy
    
    __hwReset(0); // Reset to make changes take effect
  
  }

  //__message("-I- execUserFlashInit!");
  __writeMemory32(0x00000000, 0xE0042004, "Memory");
  __writeMemory32(0x00000000, 0x40013808, "Memory"); 
  __writeMemory32(0x00000000, 0x4001380C, "Memory");
  __writeMemory32(0x00000000, 0x40013814, "Memory");
  __writeMemory32(0x00000000, 0x40013810, "Memory"); 
  __writeMemory32(0x20000000, 0x50000010, "Memory");
  __writeMemory32(0x00000001, 0x50000000, "Memory");
  __writeMemory32(0x00000000, 0xE0042008, "Memory");
  __writeMemory32(0x00000000, 0xE004200C, "Memory");
  __writeMemory32(0x00000000, 0x40023830, "Memory"); // RCU_AHB1EN = 0
  __writeMemory32(0x00000000, 0x40023810, "Memory"); // RCU_AHB1RST = 0
  __writeMemory32(0x00000000, 0x40023814, "Memory"); // RCU_AHB2RST = 0
  __writeMemory32(0x00000000, 0x40023818, "Memory"); // RCU_AHB3RST = 0
  __writeMemory32(0x00000000, 0x40023834, "Memory"); // RCU_AHB2EN = 0
  __writeMemory32(0x00000000, 0x40023838, "Memory"); // RCU_AHB3EN = 0
  __writeMemory32(0x00000000, 0x40023808, "Memory"); // RCU_CFG0 = 0
  __writeMemory32(0x000000F1, 0x40023854, "Memory"); // RCU_AHB2SPEN = 0
  __writeMemory32(0x00000001, 0x40023858, "Memory"); // RCU_AHB3SPEN = 0
  __writeMemory32(0x7E6791FF, 0x40023850, "Memory"); // RCU_AHB1SPEN = 0
  __writeMemory32(0x00010083, 0x40023800, "Memory"); // RCU_CTL   = 0x83
  __writeMemory32(0x00000000, 0x4002380C, "Memory"); // RCU_INT  = 0;
  __writeMemory32(0x24003010, 0x40023804, "Memory"); // RCU_PLL  = 0;
  // unlock flash
  __writeMemory32(0x45670123, 0x40023C04, "Memory"); // FMC_KEY = FMC_KEY1;
  __writeMemory32(0xCDEF89AB, 0x40023C04, "Memory"); // FMC_KEY = FMC_KEY1;
  __writeMemory32(0x00000000, 0x40023C00, "Memory"); // Flash 0 wait state
  __writeMemory32(0x00000000, 0x40023C10, "Memory"); // FMC_CTL = 0;
  __writeMemory32(0x000000F0, 0x40023C0C, "Memory"); // FMC_STAT = PGSERR | PGMERR | WPERR;
    
  __message "--------------------------execUserFlashInit end--------------------\n";
}

5.下载验证

macros 文件是可以被C-SPY 调用的执行文件,为了验证个人的猜想在execUserFlashInit 入口和出口追加了log 输出,来确认猜测是否正确。
有了上述的配置信息及flash 的初始化处理,flash loader程序就可以吧编译的二进制下载到板子上执行了。准备下环境验证下上述猜测是否正确。

Mon Nov 14, 2022 23:48:55: IAR Embedded Workbench 8.20.1 (C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll)
Mon Nov 14, 2022 23:48:55: Loaded macro file: C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\debugger\GD*GD32F4xx.dmac*
Mon Nov 14, 2022 23:48:55: Loaded macro file: C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\flashloader\GD\FlashGD32F425xK.mac
Mon Nov 14, 2022 23:48:56: Loading the CMSIS-DAP driver
Mon Nov 14, 2022 23:48:56: Probe: CMSIS-DAP probe SW module ver 1.12
Mon Nov 14, 2022 23:48:56: CMSIS-DAP enumerator: No access to device S/N.
Mon Nov 14, 2022 23:48:56: Probe: CMSIS-DAP S/N ‘’ mapped to a number 00001.
Mon Nov 14, 2022 23:48:56: Emulation layer version 4.26
Mon Nov 14, 2022 23:48:56: Notification to init-after-power-up hookup.
Mon Nov 14, 2022 23:48:56: Notification to core-connect hookup.
Mon Nov 14, 2022 23:48:56: Probe: ConnectSpec=‘CMSIS-DAP::7-14CA2BD-0-0000’.
Mon Nov 14, 2022 23:48:56: Connecting to TAP#0 DAP AHB-AP-CM port 0 (IDR=0x24770011).
Mon Nov 14, 2022 23:48:56: Recognized CPUID=0x410fc241 Cortex-M4 r0p1 arch ARMv7-M
Mon Nov 14, 2022 23:48:56: Debug resources: 6 instruction comparators, 4 data watchpoints.
Mon Nov 14, 2022 23:48:56: CPU status OK
Mon Nov 14, 2022 23:48:56: MultiCore: Asynchronous core execution FORCED.
Mon Nov 14, 2022 23:48:56: MultiCore: Synchronous core execution DISABLED.
Mon Nov 14, 2022 23:48:56: LowLevelReset(script, delay 200)
Mon Nov 14, 2022 23:48:56: Calling reset script: C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\debugger\GD\GD32.ProbeScript@ConnectUnderReset
Mon Nov 14, 2022 23:48:57: Notification to init-after-hw-reset hookup.
Mon Nov 14, 2022 23:48:57: Probe: ConnectSpec=‘CMSIS-DAP::7-14CA2BD-0-0000’.
Mon Nov 14, 2022 23:48:57: Connecting to TAP#0 DAP AHB-AP-CM port 0 (IDR=0x24770011).
Mon Nov 14, 2022 23:48:57: Recognized CPUID=0x410fc241 Cortex-M4 r0p1 arch ARMv7-M
Mon Nov 14, 2022 23:48:57: Debug resources: 6 instruction comparators, 4 data watchpoints.
Mon Nov 14, 2022 23:48:58: --------------------------execUserFlashInit start--------------------
Mon Nov 14, 2022 23:48:58: --------------------------execUserFlashInit end--------------------
Mon Nov 14, 2022 23:48:58: Loaded debugee: C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\flashloader\GD\FlashGD32F425xKRAM256K.out
Mon Nov 14, 2022 23:48:58: Target reset
Mon Nov 14, 2022 23:48:59: Unloaded macro file: C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\flashloader\GD\FlashGD32F425xK.mac
Mon Nov 14, 2022 23:48:59: Downloaded C:\Users\Administrator\Desktop\GD32F427-VSTART\GD32F4xx_Demo_Suites_V2.6.1\GD32427V_START_Demo_Suites\Projects\02_GPIO_Key_Polling_mode\EWARM\
Debug\Exe\Project.out to flash memory.
Mon Nov 14, 2022 23:48:59: Loaded debugee: C:\Users\Administrator\Desktop\GD32F427-VSTART\GD32F4xx_Demo_Suites_V2.6.1\GD32427V_START_Demo_Suites\Projects\02_GPIO_Key_Polling_mode\EWARM\
Debug\Exe\Project.out
Mon Nov 14, 2022 23:48:59: LowLevelReset(software, delay 200)
Mon Nov 14, 2022 23:48:59: LowLevelReset(script, delay 200)
Mon Nov 14, 2022 23:48:59: Calling reset script: C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\config\debugger\GD\GD32.ProbeScript@ConnectUnderReset
Mon Nov 14, 2022 23:48:59: 1996 bytes downloaded into FLASH (2.30 Kbytes/sec)
Mon Nov 14, 2022 23:48:59: Download completed.
Mon Nov 14, 2022 23:48:59: LowLevelReset(software, delay 200)
Mon Nov 14, 2022 23:49:00: Target reset
Mon Nov 14, 2022 23:49:00: INFO: Configuring trace using ‘SWO,ETB’ setting …
Mon Nov 14, 2022 23:49:00: Probe: ConnectSpec=‘CMSIS-DAP::7-14CA2BD-0-0000’.
Mon Nov 14, 2022 23:49:00: Trace: Using detected ETMv3CM at address 0xe0041000
Mon Nov 14, 2022 23:49:00: Trace2: Trace source init error=‘Only ETMv3 (with ETMIDR register is suppored)’
Mon Nov 14, 2022 23:49:00: Probe: ConnectSpec=‘CMSIS-DAP::7-14CA2BD-0-0000’.
Mon Nov 14, 2022 23:49:00: INFO: SWO trace mode is not supported by the probe (use I-jet/I-jet-Trace probe) - trace is disabled.
Mon Nov 14, 2022 23:49:00: MultiCore: Synchronous core execution DISABLED.

根据 debug log 可以看出我们添加的log 已经打印,而且下载时也是解析FlashGD32F425xK.mac文件,并通过FlashGD32F425xKRAM256K.out程序将程序下载到falsh 中运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java面向对象 继承 多态

目录 继承性(inheritance) 为什么要有继承&#xff1f; 作用&#xff1a; 继承举例 方法的重写 重写举例 四种访问权限修饰符 关键字—super 关键字super举例 调用父类的构造器 调用父类构造器举例 子类对象的实例化过程 多态性 概念 使用 多态性应用举例 虚…

探花交友_第6章_圈子互动(新版)

探花交友_第6章_圈子互动&#xff08;新版&#xff09; 文章目录探花交友_第6章_圈子互动&#xff08;新版&#xff09;课程说明1. 动态查询1.1 查询好友动态1.1.1 接口文档1.1.2 代码步骤1.1.3 代码实现tanhua-app-server**MovementController****MovementService**tanhua-dub…

centos7磁盘挂载及目录扩容

centos7磁盘挂载及目录扩容1. Linux文件系统介绍1.1 ext21.2 ext41.3 xfs2. 查看磁盘现状2.1 查看硬盘情况2.2 查看磁盘挂载情况3. 磁盘挂载3.1 mount挂载3.2 通过UUID来进行挂载4. 目录扩容5. 参考资料项目申请的服务器资源&#xff0c;初始化阶段&#xff0c;运维人员未及时考…

ES 8.x 新特性:match_phrase 跨值查询中 position_increment_gap 参数用法

文章目录1、概述2、match_phrase 短语搜索3、跨值访问3.1 问题演示3.2 原因3.3 解决方案3.4 position_increment_gap 参数1、概述 在 ES 中进行短语搜索的时候&#xff0c;为了防止跨值访问&#xff0c;ES 会在每个值之间设置间隙&#xff0c;而这个间隙的默认大小为 100。而这…

【密码学篇】商用密码产品的密钥体系结构小结

【密码学篇】商用密码产品的密钥体系结构小结 商用密码产品的密钥体系结构笔记小结—【蘇小沐】 文章目录【密码学篇】商用密码产品的密钥体系结构小结1.商用密码产品密钥体系结构&#xff08;一&#xff09;服务器密码机密钥体系结构1.服务器密码机密钥体系结构2.服务器密码机…

MySQL 数据库 定义参数【连接查询】

目录 内连接查询&#xff08;inner join&#xff09; 左连接查询 left join 右连接 right join 全连接、合并查询 union 内连接查询&#xff08;inner join&#xff09; 关键字&#xff1a;inner join on 语句&#xff1a;select * from 表名 inner join 表名 on 条件…

Excel

单元格格式 &#xff0c;跨列居中&#xff0c; 自动换行 尽量不要使用合并单元格&#xff0c;因为会使得一些单元格无法访问&#xff0c;影响排序&#xff0c;筛选等功能 第四季度销售数据部门类别十月十一月十二月肉类牛肉90000110000120000烘焙品甜点2500080000120000农产品…

基于JAVA的网络通讯系统设计与实现(论文+系统)

&#xff08;2009届&#xff09; 本科生毕业设计&#xff08;论文&#xff09; 基于Java的网络通信系统设计与实现 学 院、系&#xff1a;计算机与通信学院专 业&#xff1a;通信工程学 生 姓 名&#xff1a;班 级&#xff1a;学号指导教师姓名&#xff1a;职称最终评定成绩…

jest在已有项目中的安装与使用

简单的jest使用配置&#xff1a; npm init -y npm i jest24.8.0 -Dnpx jest --init 生成初始化配置 一个index文件&#xff0c;里面可以写入一些方法&#xff0c;作为测试这个jest.config.js是自动生成的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; index.…

第二十五章《图书管理系统》第1节:图书管理系统简介

图书管理系统具有图书信息管理、读者信息管理和借阅信息管理三大功能模块,本小节将从软件功能、数据库系统设计和项目结构几个方面介绍该软件系统的设计方案。 25.1.1系统功能简介 图书管理系统第一大功能模块是图书信息管理,这个模块的软件界面如图25-1所示。 图25-1图书信…

2011-2019年全国30省绿色经济发展指数和子指数数据

2011-2019年全国30省绿色经济发展指数和子指数数据 1、时间&#xff1a;2011-2019年 2、来源&#xff1a;绿色发展指数BG——区域比较 3、范围&#xff1a;包括全国30个省份不包括西藏 4、指标包括&#xff1a;总指标—绿色化指数、经济增长绿化度指数、资源环境承载潜力指…

1.4 Apache Hadoop完全分布式集群搭建-hadoop-最全最完整的保姆级的java大数据学习资料

文章目录1.4 Apache Hadoop 完全分布式集群搭建1.4.1 虚拟机环境准备1.4.2 集群规划1.4.3 安装Hadoop1.4.3.1 集群配置1.4.3.1.1 HDFS集群配置1.4.3.1.2 MapReduce集群配置1.4.3.1.3 Yarn集群配置1.4.3.2 分发配置1.4.4 启动集群1.4.4.1 单节点启动1.4.4.2 集群群起1.4.4.3 Had…

3D目标检测总结

3D目标检测最主要的应用领域是自动驾驶&#xff0c;主流用的传感器是camera和lidar&#xff0c; 一般车上也会配备很多radar&#xff0c; 但是在检测中一般很少用到radar。 除了特斯拉坚决不用lidar&#xff0c; 只基于纯视觉做自动驾驶感知&#xff0c; 大多数的自动驾驶感知…

Java---网络编程

特点&#xff1a;数据被限制在64kb以内&#xff0c;超出这个范围就不能发送了。 数据报(Datagram)&#xff1a;网络传输的基本单位 。 TCP 传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议&#xff0c;即传输数据之前&#xff0c;在发送端和接收…

联邦学习论文分析1----联邦学习_功率分配_频带分配_传输速率_能耗

目录一、文章概述二、系统模型环境三、上行链路功率分配(UPA)算法1.系统目标2.约束条件3.公式推导(1)传输时间(2)系统能耗4.算法求解5.伪代码四、频带分配(BA)算法1.系统目标2.约束条件3.算法求解五、性能表征本文是对论文《Multi-Server Federated Edge Learning for Low Powe…

[附源码]JAVA毕业设计南京传媒学院门户网(系统+LW)

[附源码]JAVA毕业设计南京传媒学院门户网&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

【计算机网络】数据链路层:虚拟局域网

以太网包含的计算机太多时&#xff0c;带来问题&#xff1a; &#xff08;1&#xff09;广播风暴 一个以太网是一个广播域&#xff08;广播域中任何一台设备发出的广播通信都能被该部分网络中的其他所有设备所接收&#xff09; 在交换机的交换表的建立过程中要使用许多广播域…

如何使用css美化网页?

转自&#xff1a;微点阅读 https://www.weidianyuedu.com 相信大家通过上一篇文章的学习已经成功的创建了自己的第一个网页。虽然只有一句话&#xff0c;但这个仍然是一个网页。但是我相信你&#xff0c;一定觉得这个页面不好看&#xff0c;想自己美化一下&#xff0c;今天就可…

深度学习---确保每次训练结果一致的方法

每次训练结果不一致的原因&#xff1a; 神经网络特意用随机性来保证&#xff0c;能通过有效学习得到问题的近似函数。采用随机性的原因是&#xff1a;用它的机器学习算法&#xff0c;要比不用它的效果更好。 在神经网络中&#xff0c;最常见的随机性包含以下几个地方&#xf…

[黑马程序员C++笔记]P174-P184模板-类模板

视频地址&#xff1a;黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili 目录 P174模板-类模板基本语法 P175模板-类模板和函数模板区别 P176模板-类模板中成员函数创建时机 P177模板-类模板对象做函数参数 P178模板-类模板与继承 P179模板-类模板…