freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解(一)之时钟设置

Flash擦写的内容,个人做HC9S12系列单片机时觉得应该是各模块内容中最难而且是最麻烦的一步了。只有能够对Flash进行擦写以后,所做的Bootloader才有真正手段将串口或者其他通讯手段接收到的数据或者程序写入Flash中进行程序或者数据的更新。当初做Flash的擦写也遇到了很多问题,网上搜罗下来也没有合适的帖子能够详细的将整个过程或者学习的思路以及最后实现的程序详细的加以解析,而本博文就是基于这个出发点来写的。技术本身应当是共享的才能真正让社会进步,不是么?

  关于单片机Flash的基本内容,我在此前Bootloader相关的博文中也已经提及。Flash本身是非易失性存储,可以通过编程的方式擦写其中的内容,掉电后其内容不会丢失,一般是单片机的程序存储位置。单片机运行时先将Flash中下一条运行的程序读出,然后执行其内容,再读出下一条指令,再执行循环往复。但是我们希望,能够使我们开发的单片机应用程序能够有自动更新程序的功能。比方说我现在开发的一款共享单车智能车锁,在共享单车在大马路上只能通过网络交互的时候,我希望能够更新该车锁中单片机的程序以提供新的功能。这种时候,我们就需要擦写Flash来完成这一目的。

  Flash擦写操作最应该看的就是单片机的或者Flash的手册,认真的看,通篇阅读后再尝试用C语言去加以实现其功能。我们的讲解也是在这个过程中逐渐展开的,当然,还是针对HC9S12G128系列的单片机内置Flash而言。本次篇博文仅考虑了比较简单的Flash擦除与Flash写入操作,当然,在理解了Flash操作的基础上,Flash的其他操作如写保护,解保护其实是一样的道理。好了,下面我们就开始吧。

G128系列单片机的Flash存储大小有128KB, 其全局地址范围为: 0x2_0000 - 0x3_FFFF。这篇文章中已经假设各位读者已经对分页地址,非分页地址,逻辑地址,全局地址已经有所理解,如果尚不明确其意义的,我在freescale飞思卡尔 HCS12 系列单片机bootloader详解(二)这篇博文中做了解释,理解了这些概念间的相互关系再来看本博文会比较有帮助。了解Flash擦写前,根据我们手册中的内容,Flash的控制体系是这样的:

  在S12系列单片机中,编程人员对Flash的操作并不是实际意义上对每个Flash存储区直接进行操作的,而是通过这个Flash Interface进行的。通过对这个Flash Interface的寄存器进行配置,再由它对Flash进行直接的操作。这里,我们称Flash Interface为Flash操作控制器或者Flash控制器。那么如何控制Flash控制器呢?手册中已经给出了Flash操作控制相关的所有寄存器,如下图所示,这些寄存器就是我们单片机的寄存器,它们的操作与普通的寄存器没有什么两样,在单片机寄存器定义头文件中均可以找到。还有一点就是通过总线时钟按照对应单片机Flash控制器的要求设置时钟分频器,给你使用的Flash控制器设置合适的时钟频率使其能够正常工作。

HCS12G128单片机部分Flash控制器相关的操作寄存器(不同型号单片机会有所不同)

  首要的任务当然是设置Flash控制器的时钟了,它以总线时钟为时钟源,通过设置FCLKDIV(Flash时钟分频寄存器)来对其进行设置。G128的FCLKDIV寄存器定义在手册中的内容如下:

  在这页手册中可以看到,有三个寄存器需要处理FDIVLD,FDIVLCK,FDIV。先说FDIV寄存器,这个寄存器有六位,通过分频将总线时钟频率分频至1MHz以下从而使Flash控制器可以正常工作。FDIV的值与总线时钟频率有关,根据总线频率的大小确定FDIV的值,其取值在手册中也给出了下表:

  对于这个表,用法也非常简单,假如当前我的总线频率为15MHz,查表中15MHz在14.6与15.6之间,那么FDIV的值就是0x0E了。当确定好Flash控制器的频率后需要将其写保护以防误操作修改了分频寄存器,那么对FDIVLCK写1就好了,当FDIVLCK写入1后,除非重启,否则FDIV的值不能被修改,重启后FDIVLCK的值将重新归零。

  由此总结我们Flash控制器的时钟设置步骤如下:

  1. 根据总线频率设置分频FDIV

  2. 对分频进行保护,将FDIVLCK置为1

  这里需要注意,当需要写入FCLKDIV这个寄存器(也就是完成上面两个操作时),一定要确保此时Flash控制器不在执行指令,那么Flash控制器如何执行指令的呢?怎么查看它是在执行指令的呢?

  请看下节,Flash控制器的指令寄存器

注: 本系列文章均为原创,如有转载引用请标明来源

原文地址:https://www.cnblogs.com/15821216114sw/p/9509680.html

时间: 2024-10-19 23:36:29

freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解(一)之时钟设置的相关文章

freescale飞思卡尔 HCS12 系列单片机bootloader详解(三)

在完成内存映射的内容后,接下来我们将进入一个简单Bootloader的实际设计中来.在第一节内容中,我们已经简单介绍了bootlaoder的作用,它实际上就是在单片机重启过程中的一个步骤:如果有bootloader的启动信号,则进入bootloader模式开始新程序的接收与flash的擦写,若没有bootloader的启动信号,则直接进入用户程序执行用户程序内容. bootloader的启动信号一般有如下两种: 1)外部引脚接地或者拉高电平:每次启动时先监测某一已经设定的引脚是否已经被操作到了b

freescale飞思卡尔 HCS12 系列单片机bootloader详解(二)

在上一篇文章中我们做了对HC9S12系列单片机存储空间的划分,但是相比于整个bootloader的工作而言,这只是非常基础的一步,有很多基础的概念在上一篇的操作中我们并没有涉及到.比如较复杂单片机中单片机的存储空间到底是什么样的,具体怎么用C语言对它进行寻址.因为我们单片机的存储空间一般由如下的构成,RAM,ROM以及EEPROM等等.比如在我在本篇中举例介绍的9S12G128单片机,它的RAM空间有8KB,EEPROM有4KB,FLASH有128KB.如何将这几个存储空间合理的组织起来想必单片

NXP 飞思卡尔 S12Z 系列单片机 SCI 设置(解决SCI已经设置完成,但却无法通信的问题)

近日在使用了飞思卡尔S12Z设置SCI后总是不出数据,明明按照前代单片机S12Z的方法设置好了,为什么又不能用了呢? 下面是我简单对SCI1的设置,仅仅这样设置是出不来数据的: 1 SCI1BD = GLOBAL_BUS_CLOCK / SCI1_BAUD_RATE; 2 SCI1CR2 = SCI1CR2_RE_MASK + SCI1CR2_TE_MASK + SCI1CR2_RIE_MASK; 在上面的设置中我仅仅设置了SCI1的设置,假设了S12Z与S12一样,不存在同一口多个功能复用的情

飞思卡尔MC9S12系列单片机地址影射以及分页问题

对于用MCU的人来说,不一定要明白HCS12(x) memory map的机制和联系.因为如果没有系统地学习操作系统和编译原理之类的课程,确实有些难度.并且,对于DG128 XS128这样的MCU,默认的emory分配方式已经够用了.从这个意义上讲,搞清楚memory map似乎不必要. 但是,你有没有RAM不够用的情况?有没有想定义变量到FLASH ROM的情况?有没有因为欲提高寻址效率而定义变量到非分页区的情况?有没有写EEPROM但没写成功的情况? 飞思的memory非常灵活,通过地址映射

NOR Flash擦写和原理分析

NOR Flash擦写和原理分析 1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行).这点和NAND FLASH不一样.因此,在嵌入式系统中,NOR FLASH很适合作为启动程序的存储介质.NOR FLASH的读取和RAM很类似(只要能够提供数据的地址,数据总线就能够正确的给出数据),

深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)[转]

上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, 本篇继续讲剩下的配置节点之一:typeAliases. typeAliases节点主要用来设置别名,其实这是挺好用的一个功能, 通过配置别名,我们不用再指定完整的包名,并且还能取别名. 例如: 我们在使用 com.demo.entity. UserEntity 的时候,我们可以直接配置一个别名user, 这样

FLASH动作脚本详解

FLASH动作脚本详解 一.FLASH脚本基础入门讲解 二.按钮AS的编写 三.影片剪辑的AS编写 四.动态文本框 五.影片剪辑的拖拽 六.流程控制与循环语句 七.绘图及颜色的AS的编写 八.声音 AS 的编写与控制 九.时间日期的 AS编写 十.点语法以及路径 十一.深入了解时间控制 十二.无条件转移 十三.变量 十四.运算符(一) 十五.变量(二) 十六.影片剪辑的属性 十七.再讲循环语句 十八.影片剪辑处理函数 十九.复制影片剪辑 二十.深入 startDrag()与 stopDrag()

&quot;MindManager&quot;学习iOS系列之&quot;CAAnimation-核心动画&quot;详解,让你的应用“动”起来。

"MindManager"学习iOS系列之"CAAnimation-核心动画"详解,思维导图内展示了CAAnimation-核心动画的大多数基本功能和知识,每个part都有代码讲解,展示出CAAnimation-核心动画的清晰轮廓,编者提供了"JPG"."SWF"."PDF"."Word"."Mmap"格式的源文件供给使用.注意:JPG格式仅为图片总览,SWF格式使用

构建安全的Xml Web Service系列之wse之错误代码详解

原文:构建安全的Xml Web Service系列之wse之错误代码详解 WSE3.0现在还没有中文版的可以下载,使用英文版的过程中,难免会遇到各种各样的错误,而面对一堆毫无头绪的错误异常,常常会感到迷茫和无助,我起初就觉得这个框架使用起来真的很难用,有时候一些莫名其妙的错误会困扰我半天或者几天的时间,而一些英文的解释理解起来似是而非,很难一针见血的获得哪里出了问题,我将用几篇文章将wse所涉及到的错误代码和错误消息翻译成中文,并且根据个人的一点经验,提出引发错误的原因,并总结出解决建议,不是很