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

Code_DZhangTeng 2018-02-12 09:18:48
近日在编写CAN—BootLoader过程中,发现一个PFlash的问题,在接收到CAN发送过来的一条S19记录后,校验没问题,按照S19中的逻辑地址和数据对相应的PFlash进行擦出和写入,擦出应该是没问题的,但在写入时发生问题,问题是写了三十个字节左右后,没有任何响应(硬件上的提示灯灭了,CAN通信无响应),请求各位大神指点迷津
...全文
1962 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

27,375

社区成员

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

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