- 作者:
- 分类:知识&开发->MCU SOC->K210
- 阅读:2607
- 点赞:11
- 版权:CC BY-SA 4.0
- 创建:2020-09-09
- 更新:2020-09-15
K210详细的的程序下载流程,包括芯片侧和kflash侧
版权声明:本文为 neucrack 的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接(持续更新):https://neucrack.com/p/312
原文链接(持续更新):https://neucrack.com/p/312
术语
- ISP: In-System Programming, 在线编程
kflash 下载流程
带 || 开头的是芯片侧的流程
- || 芯片拷贝
boot rom
(特定的硬件,一次性写入)中的boot
程序到内存末尾1(), 并调用运行这个boot
程序 - ||
boot
程序启动后, 从otp
读取信息,是否需要从top
中读取新的boot
, 因为boot rom
区域是一次性写入的, 如果boot
写出了bug,可以用otp
中写入新的boot
来挽救,相当于芯片出厂有两次写入boot
的机会. 而事实是k210真用上了这个功能 - || 如果需要使用
otp
中的新boot
, 则读取到内存末尾,但是需要在现在正在运行的boot
前面,比如之前的末尾1是倒数16k, 那么这个otp
的boot
就需要写到之前,比如倒数32k到倒数16k位置, 然后跳转执行这个新的boot
||
boot
程序判断boot
引脚是否被拉低, 没被拉低则进入 正常启动模式, 读取整个固件到内存,然后启动, 否则进入ISP
模式上位机打开串口
- 上位机通过串口的
dtr
rts
来设置boot
和reset
引脚, 保持拉低boot
引脚,然后拉低reset
引脚再拉高reset
引脚, 即让芯片重启的时候保持boot
引脚为低电平 - || 芯片
boot
程序检测, 如果boot
引脚被拉低了, 则进入ISP
模式(输入boot
程序的一部分) - 上位机向芯片发送
握手信号
(b'\xc0\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0'
), 然后等待响应信号 - 默认芯片是
115200
波特率,如果需要更高波特率,发送修改波特率命令给芯片,芯片程序(boot
)修改通信波特率 向芯片发送写 ramrum 程序的命令,并将需要
RAMRUM
的程序或者新的ISP
程序发过去, 写到芯片内存的起始地址注意到,这里没有直接发送要写入到flash的程序过去让
boot
里面的ISP
程序去写入到Flash
, 而是重新发送了一份ISP
程序过去,后面会运行这份新的ISP
程序来从串口获取固件并烧录少flash, 这可以说是为了更灵活,可以自定义ISP
程序, 而且ISP
程序的大小只要小于前面的boot
和otp
的新boot
的大小和就好了,boot
里面做这些事可能面临boot
程序过大或者有bug后期更新的问题. 但是代价就是每次下载程序都要花费几秒钟下载新的ISP
程序, 这样用户每次下载的时间会变长, 所以最好的肯定是一次性把boot
程序写完美,没有bug哈哈哈. 其实也可以在boot的ISP程序中加入写如程序到flash的命令,这样是否使用新的ISP
就可选向芯片发送启动 ramrum 命令
如果是想在ram中运行程序,到这一步为止即可,程序已经在ram中运行了,否则往下一步
接下来就是运行发送过去的新
ISP
程序了- 上位机和
ISP
程序握手 - isp程序默认波特率115200, 如果需要更高,这里发送更改命令让isp程序修改串口波特率
- 通过串口发送程序文件到isp程序,isp程序写入到 flash
- 通过串口的
dtr
和rts
控制芯片的reset
和boot
引脚来正常启动,不进入ramrum
模式,而是正常从flash
加载程序启动