0%

固件烧录

起因

为什么突然开始写这个博客呢,因为上班摸鱼的时候,看到一个国产芯片功能结构图。里面有啥IPU(AI视觉那种的芯片)、GPIO、USB、flash、I2S等众多功能嘛,我还记得我刚学嵌入式的时候,看到这个芯片图都是懵的,现在好了一点。里面突然看到一个OTP,我就想到了OTA,然后去看了一下,不是一个东西啊。这竟然是只能烧录一次的存储空间One Time Programming,烧录之后就会熔丝,就不能再次更改了。星宸科技的芯片功能图如下:

芯片方案链接

存储空间

要明白,只有外行才会叫存储空间为内存,内存其实就是ram,这类东西,就是用来暂时存放变量的。存储空间就是rom,这个是掉电非易丢失。
prom 这个就是只可以烧写一次的rom空间,就是说烧坏了,就没了,这个是好的,防止固件丢失等奇奇怪怪的情况,前提是代码得对,而且对后还得兼容才行。这个是比较考虑水准的。

eprom 这个就是在全新的生产工艺,利用那些射线来清空rom中数据,然后再烧录写。这个是非常耗时耗力的,而且也只能烧写十来次的东西,还得把注意保护不要受光照影响等。

eeprom 这个就是划时代的东西了,这个就可以多次烧写,甚至对每一个位随心所欲的进行操作。这因为是针对每一个位的读写,所以就会导致效率低下。主要是iic来读写,而且因为是对位进行操作,所以它的线路设计的非常复杂,导致了价格高,而且体积大不了。一般都是几十kb,百来kb

因此flash就出来了,flash的特点就是写0可以按位,但是想要重新写的话,就要整页,整块,整扇区的清空才行,你可以认为他们pnp类型中,有部分全部集中在一个集上,就像全部串联起来一刷新就全刷新。再mcu中flash主要是依靠spi进行读写的,注意力spi可不止一种。

烧写办法

这里要介绍一下boot0 和boot1这两个兄弟了
boot0接地,就会默认是烧写到0x08000000中,最常用。
boot0 = 1 boot1 接地,就会是内部ISP引导程序来操作了,就是从0x1FF00000开始了
boot0 = 1 boot1 = 1,此时就是下载到sram中,就是从0x20000000开始了掉电就丢失,适合于测试。

1.ICP(In Circuit Programing)在电路编程
PC上运行的软件(ICP编程工具)通过SWD的接口更新芯片内部APROM、LDROM、数据闪存(DataFlash)和目标用户配置字(Config)

2.IAP(In applicating Programing)在应用编程
IAP就是通过软件实现在线电擦除和编程的方法。IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将程序从一个存储体转向另一个。此时就是用到了内部的引导程序了

3.ISp(In System Programing)在系统编程
目标芯片通过USB/UART/SPI/I²C/RS-485/CAN等周边接口的LDROM引导代码去更新芯片的内部APROM、数据闪存(DataFlash)和用户配置字(Config)。这个需要用户提前先写入bootloader程序,这个不是内部程序,而是自己写的引导程序,用来接收来自接口的数据,自己进行选择升级,或者跳转。

常见的就是 SWD+J-flash烧录,只要4根线还能debug调试,自然会还有jtag(但是多几根线),而且debug还没swd好、串口烧录、配合软件比如flyMCU STC51等IAP下载方法。

烧写重启

如果是keil中的话,是需要勾选自动下载完毕复位的。否则就要我们来手动点击一下复位键才能运行代码,为什么不能下载好就继续运行代码呢?因为上电了,cpu就开始工作了,但是啥都没有的cpu是根据arm设定的架构规则就开始运行就是从0开始跑代码,但是代码有地址映射的,所以是0x08000000为代码地址,也可以实现代码运行行了,这个算是arm的取巧了。所以,代码下载好了,此时运行是老代码,而且也不知道那些空间可以覆盖,cpu跑没边了,硬件配置也对不上,还容易出现错误,溢出等诸多bug。只有重新上电才会重新加载sram。所以直接复位才是最好的选择。

-------------下次的来访是什么时候呢[doge]-------------