基于飞思卡尔单片机的CAN_BootLoader中对P—Flash的擦出写入的问题

Code_DZhangTeng 2018-02-12 09:18:48
近日在编写CAN—BootLoader过程中,发现一个PFlash的问题,在接收到CAN发送过来的一条S19记录后,校验没问题,按照S19中的逻辑地址和数据对相应的PFlash进行擦出和写入,擦出应该是没问题的,但在写入时发生问题,问题是写了三十个字节左右后,没有任何响应(硬件上的提示灯灭了,CAN通信无响应),请求各位大神指点迷津
...全文
1954 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
内心的一亩田 2020-04-16
  • 打赏
  • 举报
回复
需要先下载 Flash driver
fly 100% 2019-04-09
  • 打赏
  • 举报
回复
代码再擦写块上了吧
Code_DZhangTeng 2018-04-25
  • 打赏
  • 举报
回复
咨询有关专家,可能是盗版开发环境的问题,大神们觉得 可能性多大?
of123 2018-02-26
  • 打赏
  • 举报
回复
不存在固定“数组”。 擦写代码实际上是针对你的 Flash IP 及其接口所写的运行代码的编译结果(多条汇编指令)。有些芯片的编译器,是允许原始的 C 代码函数指定指针的。那样的话,事先看一下目标码的长度,然后把指针处的代码拷贝到一个数组中即可。再将一个函数指针指向这个数组。 至于中断问题,要看你的 IP 写入操作是否由多条汇编指令实现。如果是,且 IP 不允许这些指令序列被打断,就要在写入时禁止中断。
Code_DZhangTeng 2018-02-25
  • 打赏
  • 举报
回复
程序升级过程中的掉电问题也是bootloader功能必须要面对和解决的问题。为了解决这个问题,我们按照如下的方法来设计程序运行的流程:
1)在Flash空间的最后一个block设定一个标志,这个在编写程序的时候就设定好;如下:

2)程序在跳转到应用程序之前先判断该标志是否正常,如果不正常就停在boot区域,等待升级的命令。
3)在擦除Flash的时候,先擦除最后一块Flash,再擦除其它的Flash。
4)写数据的时候先写其它block的数据,最后再写最后一个block的数据。也就是按照hex文件中数据的顺序向flash写数据就可以。

按照这样的软件流程,如果在程序更新成功之前发生了掉电的情况,则重新上电后CPU会停在boot区域,等待下一次重新更新程序。
Code_DZhangTeng 2018-02-13
  • 打赏
  • 举报
回复
由于在Flash擦写时会在Flash区产生高压,造成擦写不稳定,把在高压时执行 的程序转换成机器码存放在RAM区,在执行擦写操作时,执行RAM区0的机器码, 擦写操作稳定,该机器码存放在下面数组中,其中'0x3D'是'RTS'的机器码 const uchar P[18] = {0x18,0x0B,0x80,0x01,0x05,0xF6,0x01,0x05,0x87, 0x87,0xC4,0x40,0x8C,0x00,0x00,0x27,0xF4,0x0A}; //FSTAT=0x80; //while(!(FSTAT&0x80)); /*存放RAM区执行的的机器码 */
of123 2018-02-13
  • 打赏
  • 举报
回复
至于擦写 Flash 时要关闭中断,是因为 Flash 接口模块在擦写(特别是写入)时需要多条指令来完成,且不得打断。关闭中断就是为了避免这些“原子”指令被打断。
of123 2018-02-13
  • 打赏
  • 举报
回复
不是这个原因。在 Flash 中对自身操作,会发生 CPU 取指的读取与 Flash 擦写的写入之间的总线冲突。因此,要将擦写代码放入 RAM 运行,使其各在不同的总线地址段。 也有一些芯片的 Flash 总线设计更加具有兼容性。这样的芯片中,只要不擦写那些擦写代码所在的 Flash 页,是支持用 Flash 中的代码执行 Flash 擦写操作的。 这是芯片所集成的 Flash IP 的架构有关。
Code_DZhangTeng 2018-02-13
  • 打赏
  • 举报
回复
引用 4 楼 of123 的回复:
不是这个原因。在 Flash 中对自身操作,会发生 CPU 取指的读取与 Flash 擦写的写入之间的总线冲突。因此,要将擦写代码放入 RAM 运行,使其各在不同的总线地址段。 也有一些芯片的 Flash 总线设计更加具有兼容性。这样的芯片中,只要不擦写那些擦写代码所在的 Flash 页,是支持用 Flash 中的代码执行 Flash 擦写操作的。 这是芯片所集成的 Flash IP 的架构有关。
1楼 和 3 楼都是与这个相关的,有没有具体的解决措施的?具体的错误表现形式 很类似于 “掉电”,与其相关的指示灯不亮了,请问大神,这个是怎么解决的呢? 尤其是3楼这个,很多地方提供的数组都不一样,试了几个不行的,不知道这个数组是否一成不变?还是各个MCU不相同?如果不相同,这个数组怎么得到? 目前打算试试1楼的方案,请求大神指点????
Code_DZhangTeng 2018-02-12
  • 打赏
  • 举报
回复
有的人说,在进行PFlash操作时将所有中断关闭,就可以正常读写了 哪位大神给解答一下,对不对 ?
Code_DZhangTeng 2018-02-12
  • 打赏
  • 举报
回复
查到的资料,有的解释是,Flash不能对本身就行操作,也就是说在Flash中的代码不能对Flash进行操作,必须转移到RAM中才可以。怎么解决这个问题呢,我自己用的是#pragma关键字,再配合上codewarrior的.prm文件,就可以啦,全速运行下没有问题。  #pragma  CODE_SEG FLASH_RAM//在.prm文件中将FLASH_RAM定义在RAM区中 // 对flash进行操作的代码 #pragma CODE_SEG DEFAULF
软件介绍: 平时我们最常用到的下载程序的方法是通过USB数据线或其他数据线进行程序的烧写,这个方式是通过外界提供给单片机高电压来对flash除和写入完成的。而Bootloader不需要外界提供高电压仅靠正常工作电压便可完成对flash除和写入,从而达到更新程序的目的。Bootloader的最大优点是:在不需要外部编程器的情况下,对嵌入式产品的应用代码进行更新升级。它使得通过局域网或者Intemet远程更新程序成为可能。例如,如果有5000个基于MCU的电能表应用程序需要更新,电能表制造商的技术人员就可以避免从事对每一个电能表重新编程的巨大工作量,通过使用Bootloader的功能,由控制心通过电能表抄表系统网络,远程对5 000个电表重新编程。可见,Bootloader功能对于嵌入式系统的广泛应用具有十分重要的意义。关于Flash除和写入,真的是让我最费力的一部分,网上的相关资料很少,好不容易找到了一点相关代码,却发现程序不能正常的运行,而且更令人无解的是程序本身怎么检查都检查不错误。好啦,一点一点的说说我的辛酸史。首先,如果你在寻找飞思卡尔flash写入操作,很遗憾的告诉你,如果你用的不是MC9S12XS系列,那么很有可能,你所需要的flash写入操作和我接下来将要说明的写入操作基本上不沾边(除了原理上),因为飞思卡尔不同系列的单片机flash写入操作的定义差别很大,不注意型号的话反而会被误导。

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧