求教单片机内部Flash擦写问题?

brk1985 2017-05-31 04:31:14
单片机的ROM里有bootloader,如果烧写过,则引导到用户程序。如果想再次烧写,需要擦写烧写标记(这个应该不会有问题,但是内部Flash的程序区里含有的用户程序应该也要擦写,该怎么擦写?程序在运行,直接擦写会引起崩溃吧?)。

之前计划上位机发个命令给单片机,单片机的用户程序在收到命令后调用“擦写内部FLash的所有区域”的函数。但是不敢这么处理,怕写坏设备。

请问大家都是怎么处理的?
...全文
951 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
happygrilclh 2017-06-10
  • 打赏
  • 举报
回复
引用 2 楼 brk1985的回复:
[quote=引用 1 楼 qq_20553613 的回复:] 单片机是直接在Flash上执行程序,不能自己擦除自己的区域,按目前单片机执行情况只能擦除应用区域,如果你擦除BootLoader,应用程序就没法执行了(比如stm32 必须从0x8000000地址开始执行,开始地址必须存放boot,然后跳转到指定的应用),先将执行地址跳转到BootLoader执行,然后用boot程序擦除应用区域。当然boot和应用都有实现某些功能(比如响应特定上位机指令),否则擦除完就是砖头了。
我的是arm contexM0,某厂商改了,bootloader在ROM里(从某厂商买来已经写在这里),用户程序在内部Flash。按照你的想法,是不是bootloader必须有响应擦写的函数或命令?[/quote] boot程序必须支持擦除flash的功能,或者弄两个程序,一个a,一个b,就像2541芯片一样。
happygrilclh 2017-06-10
  • 打赏
  • 举报
回复
同方的thk88芯片?
of123 2017-06-01
  • 打赏
  • 举报
回复
一般来说,Bootloader 应该是支持下载过程擦除相应区域的 Flash 的。 从你叙述的情况,你擦除“烧写”标志应该就可以回到 Bootloader。 如果你担心留在 Flash 中的代码被窃取,且你的单片机支持在 RAM 中运行代码,你可以写一段函数映射到 RAM 中,在那里对 Flash 进行擦除。 一般不支持 RAM 中运行程序的片子,都是支持对非当前代码所在 Flash 页或扇区擦写的。你可以试试在非主程序驻留区放一段擦除代码,需要时跳转调用它。
姓郝的 2017-06-01
  • 打赏
  • 举报
回复
怎么擦写可以查询数据手册。但是关于“程序在运行,直接擦写会引起崩溃吧?”,擦写的程序是在内存(RAM)里运行的,现在是要更换ROM里的程序,这就要求整个擦写过程处理器不能掉电,否则写入的程序不完整导致不运行或者运行异常,这样正常写入之后重新上电或者复位,就会运行新的程序了。
brk1985 2017-05-31
  • 打赏
  • 举报
回复
引用 2 楼 brk1985 的回复:
[quote=引用 1 楼 qq_20553613 的回复:] 单片机是直接在Flash上执行程序,不能自己擦除自己的区域,按目前单片机执行情况只能擦除应用区域,如果你擦除BootLoader,应用程序就没法执行了(比如stm32 必须从0x8000000地址开始执行,开始地址必须存放boot,然后跳转到指定的应用),先将执行地址跳转到BootLoader执行,然后用boot程序擦除应用区域。当然boot和应用都有实现某些功能(比如响应特定上位机指令),否则擦除完就是砖头了。
我的是arm contexM0,某厂商改了,bootloader在ROM里(从某厂商买来已经写在这里),用户程序在内部Flash。按照你的想法,是不是bootloader必须有响应擦写的函数或命令?[/quote] 目前该厂商提供的文档里,bootloader里没有相应的擦写命令。内部Flash的固件库函数倒是有擦写一页、擦写所有的函数。 这个单片机执行顺序:上电后,ROM里的bootloader会判断内部Flash参数区是否有烧写标志,如果有,则找到用户程序入口地址、执行用户程序。否则,等待用户烧写(擦写烧写标志就进入这个逻辑,可是内部Flash程序区仍有旧程序在会影响烧写)。
brk1985 2017-05-31
  • 打赏
  • 举报
回复
引用 1 楼 qq_20553613 的回复:
单片机是直接在Flash上执行程序,不能自己擦除自己的区域,按目前单片机执行情况只能擦除应用区域,如果你擦除BootLoader,应用程序就没法执行了(比如stm32 必须从0x8000000地址开始执行,开始地址必须存放boot,然后跳转到指定的应用),先将执行地址跳转到BootLoader执行,然后用boot程序擦除应用区域。当然boot和应用都有实现某些功能(比如响应特定上位机指令),否则擦除完就是砖头了。
我的是arm contexM0,某厂商改了,bootloader在ROM里(从某厂商买来已经写在这里),用户程序在内部Flash。按照你的想法,是不是bootloader必须有响应擦写的函数或命令?
Acuity. 2017-05-31
  • 打赏
  • 举报
回复
单片机是直接在Flash上执行程序,不能自己擦除自己的区域,按目前单片机执行情况只能擦除应用区域,如果你擦除BootLoader,应用程序就没法执行了(比如stm32 必须从0x8000000地址开始执行,开始地址必须存放boot,然后跳转到指定的应用),先将执行地址跳转到BootLoader执行,然后用boot程序擦除应用区域。当然boot和应用都有实现某些功能(比如响应特定上位机指令),否则擦除完就是砖头了。

27,375

社区成员

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

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