MC9S12XEP100 FTM模块 驱动程序

最新更新时间:2021-07-30来源: eefocus关键字:MC9S12XEP100  FTM模块  驱动程序

MC9S12XEP100的Flash(S12XFTM1024K5V2)包含:


1024KB的P-Flash 内存,包含5个物理Flash blocks,用于存储非易失性代码。


32KB的D-Flash内存,由一个物理Flash block组成,可作为Flash内存存储非易失性数据,或用于支持内建的模拟EEPROM。


4KB的缓存RAM,由一个物理RAM block组成,可用作普通的RAM,或者用于支持内建的模拟EEPROM。


MC9S12(X)系列单片机的Flash内存可以在不加外部电压的情况下自我重编程(擦除/写入),这是通过FTM模块提供的一个内存控制器来完成的,内存控制器独立于内核运行,用户通过给内存控制器传递命令及参数以使内存控制器修改Flash内存内容或配置模拟EEPROM资源;控制过程如下图:

FTM内存控制器控制流程

本驱动程序对这个控制过程进行了封装(即FTM_LaunchCommand函数),并进一步对所有可用的命令进行了封装,提供了用户友好的接口,方便各位使用。


下面上代码:

先是FTM.h文件


/*

*********************************************************************************************************

*

*

*                              FLASH TECHNOLOGY MODULE SUPPORT MODULE

*                                      FREESCALE MC9S12XEP100

*                              飞思卡尔单片机 FLASH模块(FTM) 支持包

*

* File    : FTM.h

* By      : Lin Shijun(http://blog.csdn.net/lin_strong)

* Date    : 2020/01/09

* Version : V2.4

* Note    : 1. this module is customized for MC9S12XEP100. If used for other derivation, it may need

*              some modification according to the PARTID.

* History : 2018/03/12  v1.0  prototype of the package.

*           2018/03/31  v1.1  a little modification.

*           2018/04/12  v2.0  encapsulate all of the FLASH COMMON COMMAND into more user-friendly interface.

*           2018/07/02  v2.1  add code in FTM_LaunchCommand to clear flags.

*           2018/07/05  v2.2  exclude FTM_FSTAT_MASK_MGBUSY from FTM_FSTAT_MASK_ANYERR

*           2019/03/19  v2.3  fix a bug that if EEPROM happens to be updating datas. The FTM may treat

*                             MGBUSY flag as error. So I remove FTM_FSTAT_MASK_MGBUSY from the 

*                             FTM_FSTAT_MASK_ANYERR malloc.

*                             some modifications to the configuration malloc.

*           2020/01/09  v2.4  add FTM_EEPROM_WaitFinish interface

*********************************************************************************************************

*/


#ifndef _FTM_H

#define _FTM_H

/*

*********************************************************************************************************

*                                   TYPE DEFINITION 类型定义

*********************************************************************************************************

*/


/*** FSTAT - Flash Status Register; ***/

typedef union {

  unsigned char Byte;

  struct {

    unsigned int MGSTAT0     :1;             /* Memory Controller Command Completion Status Flag 0 */

    unsigned int MGSTAT1     :1;             /* Memory Controller Command Completion Status Flag 1 */

    unsigned int             :1; 

    unsigned int MGBUSY      :1;             /* Memory Controller Busy Flag */

    unsigned int FPVIOL      :1;             /* Flash Protection Violation Flag */

    unsigned int ACCERR      :1;             /* Flash Access Error Flag */

    unsigned int             :1; 

    unsigned int CCIF        :1;             /* Command Complete Interrupt Flag */

  } Bits;

} FTM_FSTAT;


#define FTM_FSTAT_MASK_MGSTAT0             1U

#define FTM_FSTAT_MASK_MGSTAT1             2U

#define FTM_FSTAT_MASK_MGBUSY              8U

#define FTM_FSTAT_MASK_FPVIOL              16U

#define FTM_FSTAT_MASK_ACCERR              32U

#define FTM_FSTAT_MASK_CCIF                128U

#define FTM_FSTAT_MASK_ANYERR      (FTM_FSTAT_MASK_MGSTAT0 | FTM_FSTAT_MASK_MGSTAT1 |

                                     FTM_FSTAT_MASK_FPVIOL | FTM_FSTAT_MASK_ACCERR)


/*** FERSTAT - Flash Error Status Register; ***/

typedef union {

  unsigned char Byte;

  struct {

    unsigned int SFDIF       :1;              /* Single Bit Fault Detect Interrupt Flag */

    unsigned int DFDIF       :1;              /* Double Bit Fault Detect Interrupt Flag */

    unsigned int ERSVIF0     :1;              /* EEE Error Type 0 Interrupt Flag */

    unsigned int ERSVIF1     :1;              /* EEE Error Type 1 Interrupt Flag */

    unsigned int EPVIOLIF    :1;              /* EEE Protection Violation Interrupt Flag */

    unsigned int             :1; 

    unsigned int PGMERIF     :1;              /* EEE Program Error Interrupt Flag */

    unsigned int ERSERIF     :1;              /* EEE Erase Error Interrupt Flag */

  } Bits;

} FTM_FERSTAT;


#define FTM_FERSTAT_MASK_SFDIF             1U

#define FTM_FERSTAT_MASK_DFDIF             2U

#define FTM_FERSTAT_MASK_ERSVIF0           4U

#define FTM_FERSTAT_MASK_ERSVIF1           8U

#define FTM_FERSTAT_MASK_EPVIOLIF          16U

#define FTM_FERSTAT_MASK_PGMERIF           64U

#define FTM_FERSTAT_MASK_ERSERIF           128U

#define FTM_FERSTAT_MASK_ERSVIF            12U

#define FTM_FERSTAT_MASK_ANYERR  (FTM_FERSTAT_MASK_SFDIF | FTM_FERSTAT_MASK_DFDIF | FTM_FERSTAT_MASK_ERSVIF0 |

                         FTM_FERSTAT_MASK_ERSVIF1 | FTM_FERSTAT_MASK_EPVIOLIF | FTM_FERSTAT_MASK_PGMERIF |

                         FTM_FERSTAT_MASK_ERSERIF)


typedef union{    //Used to copy and store Flash error status registers.

  unsigned short Word;

  struct{

    FTM_FSTAT fstat;

    FTM_FERSTAT ferstat;

  } Regs;

} FTM_STATUS;


#define FTM_STATUS_WORD(status)             ((status).Word)

#define FTM_STATUS_FSTAT_BYTE(status)       ((status).Regs.fstat.Byte)

#define FTM_STATUS_FERSTAT_BYTE(status)     ((status).Regs.ferstat.Byte)


typedef struct {

  // values if prior to partitioning.

  // dfPart = 0xffff, erPart = 0xffff, ECOUNT = 0xffff, deadCnt = 0x00, rdyCnt = 0x00

  unsigned short dfPart;  // the number of D-flash Sector for genernal use. 0 - 128.

  unsigned short erPart;  // the number of EEE RAM sections for the FTM (Flash module) to use as EEE. 0 - 16.

  unsigned short ersCnt;  // sector erase count. 

  unsigned char deadCnt;  // dead sector count.

  unsigned char  rdyCnt;  // ready sector count.

} FTM_EEE_STATUS,*pFTM_EEE_STATUS;


typedef struct {

  unsigned short word0;

  unsigned short word1;

  unsigned short word2;

  unsigned short word3;

} INT64U,FTM_KEYGEN;

/*

*********************************************************************************************************

*                               FLASH COMMON COMMAND    FLASH通用命令

*********************************************************************************************************

*/

/**** P-Flash and D-Flash Commands ****/


#define ERASE_VERIFY_ALL_BLOCKS  0x01 

// Verify that all program and data Flash blocks are erased.

// CCOBIX end = 0

// CCOB Params - NONE

// MGSTAT set if fault


#define ERASE_VERIFY_BLOCK       0x02

// Verify that a Flash block is erased.

// CCOBIX end = 0

// CCOB Params - gpage

// MGSTAT set if fault


#define ERASE_ALL_BLOCKS         0x08

// Erase all program and data Flash blocks.

// An erase of all Flash blocks is only possible when the FPLDIS, FPHDIS, and FPOPEN

// bits in the FPROT register and the EPDIS and EPOPEN bits in the EPROM register are

// set prior to launching the command.

// CCOBIX end = 0

// CCOB Params - NONE

// MGSTAT set if fault, FPVIOL / ACCERR set where appropriate


#define UNSECURE_FLASH           0x0B 

// Supports a method of releasing MCU security by erasing all program and data Flash

// blocks and verifying that all program and data Flash blocks are erased.

// CCOBIX end = 0

// CCOB Params - NONE

// MGSTAT set if fault


#define SET_USER_MARGIN_LEVEL    0x0D 

// Specifies a user margin read level for all program Flash blocks.

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
关键字:MC9S12XEP100  FTM模块  驱动程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic543353.html

上一篇:MC9S12XEP100的ATD模块(ADC12B16CV1)
下一篇:MC9S12XS128多功能开发板学习笔记

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MC9S12XEP100 SCI(UART)驱动程序
首先先发个自己封装的MC9S12XEP100的SCI模块(也就是UART模块)的驱动。这些代码参考了 Li Yuan http://blog.csdn.net/liyuanbhu/article/details/7764851 的代码,整个代码风格是按照uCOS-II操作系统源码的风格来写的,在此表示感谢。目前还不是特别完整完善,但基本使用是没有问题了。首先是.h文件,除了硬件驱动程序,还有在基于uCOS-II操作系统的SCI驱动程序,这章先讲硬件驱动部分
发表于 2021-08-04
MC9S12XEP100 SCI(UART)<font color='red'>驱动程序</font>
MC9S12XEP100的ATD模块(ADC12B16CV1)
了ATD会怎么响应断点,如表12所示。存储节点和比较器参照电容上的泄露可能会降低被冻结的转换的精度,取决于冻结的时间。.表 10. 理想的ATD结果示例输入信号 VRL=0V VRH=5.12V8位(分辨率=20mV)10位(分辨率=5mV)12位(转换曲线有1.25mV的偏移)(分辨率=1.25mV)5.120V25510234095……………0.02214170.02014160.01814140.01613120.01413110.0121290.0101280.0080260.0060140.0040130.0030020.0020010.000000.表 11. 转换序列长度编码规则S8CS4CS2CS1C每个序列的转换
发表于 2021-07-30
<font color='red'>MC9S12XEP100</font>的ATD模块(ADC<font color='red'>12</font>B16CV1)
MC9S12XEP100 SPI模块 驱动程序
之前发了MC9S12XEP100数据手册上的SPI模块的翻译http://blog.csdn.net/lin_strong/article/details/79122482。于是乎,现在对其的封装也来了。目前先完成了硬件驱动部分的封装。软件部分还没完全想好怎么弄。这次的封装我尝试使用两个头文件的方式来区分protect与public。全部内部使用的函数(不带参数检查)都放在了SPI_Internal.h中,而对用户的接口(可选参数检查)都放在了SPI.h中使用时请只#include “SPI.h” 然后使用里头提供的接口。下面
发表于 2021-07-30
MC9S12XEP100 SCI(UART)驱动程序2 - 基于uCOS-II
首先先发一个自己封装的MC9S12XEP100的SCI模块(也就是UART模块)的驱动。这些代码参考了 Li Yuan http://blog.csdn.net/liyuanbhu/article/details/7764851 的代码,整个代码风格是按照uCOS-II操作系统源码的风格来写的,在此表示感谢。目前还不是特别完整完善,但基本使用是没有问题了。在上一章中已经发了硬件驱动部分,这里发下基于uCOS-II嵌入式操作系统的驱动部分以及顺便说下怎么用。首先要记得到上一章中把两个文件存了,顺便还要把.h文件中的SCI_UCOS_MODULE_ENABLE 后面改为 TRUE 以开启RTOS(嵌入式操作系统)驱动部分。目前这个版本
发表于 2021-07-26
4X4矩阵键盘扫描 基于MC9S12XEP100
_GLOBALS#include "MatKB.h"#include <MC9S12XEP100.h>/***********************************************************************************************                                   LOCAL VARIABLE 
发表于 2021-07-26
4X4矩阵键盘扫描 基于<font color='red'>MC9S12XEP100</font>
MC9S12XEP100 ATD模块 驱动程序
这几天在研究ATD模块,把芯片手册的ATD模块通读了好几遍,这里是本人对手册的翻译:http://blog.csdn.net/lin_strong/article/details/78286661。本以为完全理解了这个模块,结果一上手才发现还是有很多坑。目前已发现的坑已经写在.c文件里头了。也可能是因为封装模块时测试是用的芯片仿真才导致的那些坑,后面有空的话进行进一步的测试。自己对ATD模块进行了一个简单的封装。发现网上流传的大部分示例都是使用同步的方式(轮询转换完成标志位)来获得结果,不符合我追求效率的强迫症性格,所以这个模块中,我是使用了异步事件通知的方式实现的。同时由于硬件提供的多通道方法不够灵活,通道间必须连续;于是自己还加
发表于 2021-07-26
MC9S12XEP100 ATD模块 <font color='red'>驱动程序</font>
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved