# DFP_mode
**Repository Path**: wtf666666/DFP_mode
## Basic Information
- **Project Name**: DFP_mode
- **Description**: My understanding of creating DFP
- **Primary Language**: C
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-09-22
- **Last Updated**: 2024-10-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# DFP_tamplate
- 本人学习过程中的总结,有问题欢迎大家指出
## 目录
- [DFP 的创建](#dfp-的创建)
- [.PDSC 文件](#1pdsc-文件)
- [介绍](#11介绍)
- [参考文档](#12参考文档)
- [命名格式](#13命名格式)
- [文件格式](#14文件格式)
- [结构示例](#141结构示例)
- [关键部分示例](#142关键部分示例)
- [DFP文件结构](#2-dfp文件结构)
- [示例](#21示例)
- [Device](#22device)
- [startup_device.s](#221startup_devices)
- [system_device.c](#222system_devicec)
- [system_device.h](#223system_deviceh)
- [device.h](#224deviceh)
- [Driver](#225driver)
- [Flash](#23flash)
- [操作流程](#231操作流程)
- [修改FlashDev.c](#232修改flashdevc)
- [修改FlashPrg.c](#233修改flashprgc)
- [生成FLM](#234生成flm)
- [SVD](#24svd)
- [介绍](#241介绍)
- [文件格式](#242文件格式)
- [各元素解析](#243各元素解析)
- [文件生成](#244文件生成)
- [生成PACK](#3生成pack)
## DFP 的创建
### 1).PDSC文件
#### 1.1)介绍
- CMSIS Pack 描述文件(Pack Description File)是 CMSIS-Pack 系统中的核心文件,用于描述和定义一个设备家族包(DFP, Device Family Pack)或其他软件包的内容和结构。
- 它通过 XML 格式来表达,包含关于设备、组件、库、驱动程序、示例代码等的信息,并为开发工具(如 Keil MDK、IAR 等)提供用于集成和管理这些资源的元数据。
#### 1.2)参考文档
- [CMSIS-Pack Components Documentation](https://www.keil.com/pack/doc/CMSIS_Dev/Pack/html/cp_SWComponents.html)
- [CMSIS-Pack DFP Creation Guide](https://www.keil.com/pack/doc/CMSIS_Dev/Pack/html/createPack_DFP.html#:~:text=A%20Software%20Pack%20that%20contains%20a%20%3Cdevices%3E%20element,device%20or%20a%20device%20family%20in%20more%20detail.)
#### 1.3)命名格式
- `Vendor.Name.pdsc`
- `Vendor` 为供应商名,在 `PACK.xsd` 中有登记,开发过程中使用“Generic:5”代替。
- `Name` 为家族名,如芯片 MVCM3 包含 MVCM3100 和 MVCM3200,则 `Name` 为 MVCM3。
#### 1.4)文件格式
##### 1.4.1)结构示例
```xml
```
##### 1.4.2)关键部分示例:
- 在下面的部分中,将为来自设备供应商MyVendor的虚拟设备族MVCM3创建DFP。
- 设备族由四个成员组成,分为两个子族。
- mvcm3系列的规格如下:

- 设备信息(devices)
```xml
The MVCM3 device family contains an ARM Cortex-M3 processor, running up to 100 MHz with a versatile set of on-chip peripherals.
```
- 条件(conditions)
```xml
MyVendor MVCM3 Series devices and CMSIS-Core (Cortex-M)
Startup assembler file for ARMCC
Startup assembler file for GCC
Startup assembler file for IAR
```
- 组件(components)
```xml
System Startup for MyVendor MVCM3 Series
```
---
### 2) DFP文件结构
#### 2.1)示例:

#### 2.2)Device:
- 介绍:放置启动文件(startup_device.s)、系统文件(system_device.c system_device.h)、寄存器文件(device.h)以及驱动函数等文件。
- 可能拥有多组,同一系列各型号芯片的文件不一定通用
- 示例:




##### 2.2.1)startup_device.s:
- 设备上电或复位后执行的第一段代码。它负责在硬件复位后初始化堆栈、设置中断向量表、初始化全局和静态变量,并最终跳转到主程序的 main() 函数。
##### 2.2.2)system_device.c:
- 设备初始化的核心文件,负责对系统时钟、外设时钟、内存布局等进行配置。包含了 SystemInit() 函数,该函数在设备启动时被 startup_device.s 调用,进行硬件初始化。
##### 2.2.3)system_device.h:
- 为 system_device.c 中的系统初始化函数提供声明,同时包含一些与系统初始化相关的常量、宏和外部变量声明(如 SystemCoreClock)。
##### 2.2.4)device.h:
- 定义设备的外设寄存器映射、位域、内存地址等内容,使开发者可以通过结构体和宏访问设备外设。
- 可以通过CMSIS提供的SVDConv工具依据你的SVD文件直接生成
- SVDConv的使用:
- 调用示例:SVDConv MVCM3.svd --generate=header --fields=struct
- SVDConv: 表示调用 SVDConv 工具。这个工具通常是在安装 CMSIS 之后可用。确保在命令行中可以访问它(即它的路径已被添加到环境变量中)。
- MVCM3.svd: 这是输入的 SVD 文件,包含了设备寄存器的描述信息。此文件需要位于当前工作目录中或者使用完整的文件路径。
- --generate=header: 指定生成 C 头文件。默认情况下,它会将 SVD 文件中的寄存器描述转换为 C 结构体表示的头文件。
- --fields=struct: 这个选项表示在生成头文件时,将寄存器字段表示为结构体。这意味着每个寄存器字段都会被分解为更小的结构体单元。
##### 2.2.5)Driver:
- 该文件夹下存放芯片的外设驱动,并在PDSC文件中声明,如下:
```xml
example
```
#### 2.3)Flash:
- 参考文档:
- [Pack with Device Support](https://www.keil.com/pack/doc/CMSIS_Dev/Pack/html/createPack_DFP.html#:~:text=A%20Software%20Pack%20that%20contains%20a%20%3Cdevices%3E%20element,device%20or%20a%20device%20family%20in%20more%20detail.)
- [Flash Programming](https://www.keil.com/pack/doc/CMSIS_Dev/Pack/html/flashAlgorithm.html)
- [利用MDK的FLM文件制作通用flash驱动](https://cloud.tencent.com/developer/article/2230443)
- [从零编写STM32H7的MDK SPI FLASH下载算法](https://mp.weixin.qq.com/s/IpEG3jN-Nx4Dm1ETxNBkgg)
- 示例:

##### 2.3.1)操作流程:
- 1)将以下文件复制到你的 Vendor.Name/Flash下
- 一般位于Keil_v5\ARM\Flash\_Template路径下(v540版本)
- 其中的FlashOS.h位于上级目录(v540版本)

- 2)修改其中的三个工程文件,将“NewDevice”替换为你的设备名
- 3)修改其中的FlashDev.c和FlashPrg.c文件
- 4)通过Keil生成FLM文件
##### 2.3.2)修改FlashDev.c:
- 1)介绍:
- 定义一个FlashDevice结构体用于描述 Flash 设备的详细特性描述,包括设备的大小、扇区布局、页大小等信息。
- 为工具提供必要的元数据,以便在进行 Flash 操作(如擦除、编程、读取)时,能够正确处理设备的存储布局。
- 2)示例:
```c
struct FlashDevice const FlashDevice = {
FLASH_DRV_VERS, // 驱动版本
"Example Flash", // 设备名称
ONCHIP, // 设备类型(片上 Flash)
0x08000000, // 起始地址
0x00100000, // 总大小 (1MB)
256, // 页大小
0, // 保留
0xFF, // 擦除后的默认值
5000, // 编程超时(毫秒)
10000, // 擦除超时(毫秒)
// 扇区布局
0x08000000, 0x1000, // 每个扇区 4KB
0x08010000, 0x20000, // 每个扇区 128KB
SECTOR_END
};
```
##### 2.3.3)修改FlashPrg.c:
- 1)介绍:
- Keil 环境下的 Flash 编程算法的实现文件,它通过与 Flash 控制器的直接交互来完成擦除、写入、校验等操作。
- 2)示例:
```c
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
// 初始化 Flash 编程设置,如地址和时钟频率
// 配置寄存器,准备擦除或编程操作
return 0;
}
int UnInit (unsigned long fnc) {
// 反初始化,释放 Flash 资源
return 0;
}
int EraseSector (unsigned long adr) {
// 擦除指定地址的扇区
return 0;
}
int EraseChip (void) {
//擦除整个 Flash 存储器
return 0;
}
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {
// 将数据写入指定的 Flash 页面
return 0;
}
```
##### 2.3.4)生成FLM:
- 1)打开Flash文件夹的工程

- 2)将输出文件命名为设备名

- 3)编译
- 4)在PDSC文件中添加FLM文件的路径,如下:
```xml
```
- 5)重新生成pack并导入,在对应的工程中可以看到

#### 2.4)SVD:

##### 2.4.1)介绍:
- 定义:SVD(System View Description) 文件是 CMSIS(Common Microcontroller Software Interface Standard) 中的定义的一个 XML 格式的纯文本文件,其包含了芯片内核、芯片所具有的外设以及内核和外设的寄存器的完整描述
- 作用:
- 生成头文件(device.h):使用相关工具命令(SVDConv.exe device.svd -o Output -b Output/device.log --generate=header)就可以根据编写的 SVD 文件直接生成芯片的顶级头文件(device.svd --> device.h)
- 方便调试 :调试模式下,不用去memory窗口输入地址查看寄存器信息。
- 参考文档:
- [TIH64 之一 编写 TIH64Vx690 的 SVD 文件及使用 SVD 辅助调试_svd 和 sfr文件的区别](https://blog.csdn.net/zcshoucsdn/article/details/127144450)
- [System View Description](https://www.keil.com/pack/doc/CMSIS_Dev/SVD/html/index.html)
##### 2.4.2)文件格式:
- 参考文档:
- [SVD Description (*.svd) Format](https://www.keil.com/pack/doc/CMSIS_Dev/SVD/html/svd_Format_pg.html)
- [/device element](https://www.keil.com/pack/doc/CMSIS_Dev/SVD/html/elem_device.html)
- [/device/cpu element](https://www.keil.com/pack/doc/CMSIS_Dev/SVD/html/elem_cpu.html)
- [/device/peripherals element](https://www.keil.com/pack/doc/CMSIS_Dev/SVD/html/elem_peripherals.html)
- [/device/peripherals/peripheral/registers element](https://www.keil.com/pack/doc/CMSIS_Dev/SVD/html/elem_registers.html)
- [Special Elements](https://www.keil.com/pack/doc/CMSIS_Dev/SVD/html/elem_special.html)
- 示例:
- [SVD File Example](https://www.keil.com/pack/doc/CMSIS_Dev/SVD/html/svd_Example_pg.html)
- 设备元素结构:
- 
- 外设元素结构
- 
##### 2.4.3)各元素解析:
- 内容过多,可以参考官方文档
- [/device/cpu element](https://www.keil.com/pack/doc/CMSIS_Dev/SVD/html/elem_cpu.html)
- 以下是部分内容截图:


##### 2.4.3)文件生成:
- 可参考下列文档(但是目前还没找到这个工具包)
- [使用sdk-npi-enablement-tool生成SVD文件和芯片头文件](https://blog.csdn.net/suyong_yq/article/details/128731971)
---
### 3)生成PACK
- 脚本介绍:
- 检查PDSC文件的可用性、复制PDSC文件到文件目录、在文件目录运行PackChk.exe、在工作目录创建一个包文件。它会被称为 Vendor.Name.Version.pack
- 具体步骤:
- 1)进入DFP文件夹下
- 2)完善DPSC文件的内容
- 3)修改gen_pack.sh内的部分内容(具体脚本中有解释)
- 4)运行脚本(使用git bash打开DFP文件夹并在运行脚本)