说明:此博客用来记录学习过程,防止遗忘。
使用的是STM32F103ZET6,芯片手册里他有Flash有512k,RAM有64k。关于IAP,ICP其实就是数据传输方式不同而已,ICP可以理解成芯片厂商已经固化好了bootloader(升级程序)你下载的.hex文件直接通过它被放进Flash里面。IAP就是自己写了一段bootloade程序先烧录进Flash地址为0x0800 0000(Flash的起始地址对应的有RAM地址(0X2000 0000))然后此段程序负责接收之后工作程序传输方式(USART,SPI,GPRS等方式)。(自己实验过程这个二个选项一定要打钩,不然Flash和RAM的中断向量表会改变)
图1:芯片地址
图2:芯片选型
升级原理介绍:
图三3: IAP升级过程
芯片开始工作从0x0800 0000确认栈顶地址,然后偏移地址+4去中断向量表中取得复位中断函数,最后去执行中断复位函数(此过程是用汇编写的,作者只是个大学生不懂汇编)。然后执行bootloader的main()函数,进入main函数之后触发某种升级条件(升级条件用户自己定义例如按键或者是一个标志位的改变)。假如需要升级IAP将接收通过USART等方式来的数据包,等到数据包传输完成(借用正点原子的例程)。
第一传输问题,传到哪里,怎么改变传输的数据包存放位置,怎么计算位置
这里使用的是串口1传输将数据储存在RAM里面__attribute__ ((at(0X20001000)))at是绝对定位的意思,可以把变量或函数绝对定位到Flash中,或者定位到RAM。但要注意不要超过Flash的范围512k或者是RAM的范围64k。例子中是将USART_RX_BUF[USART_REC_LEN]串口接收到的数据储存到RAM中,0X20001000就是USART_RX_BUF的首地址,这样数据就传到RAM中了。当然自己可以修改它传到Flash里或者是其他外围地址上。计算方法RAM的起始地址是0x2000 0000。注意一个地址+1代表一个字节,0x0000 1000 = 十进制4096/1024=4k。说明存的地址是从RAM首地址偏移4k开始的。
第二怎么从bootloader跳转到用户程序
FLASH_APP1_ADDR的地址为0x08010000,将程序放在Flash的此位置上。这个时候Flash上有二个程序,一个是bootloader也就是你正在运行的程序,还有一个就是执行了此函数后将要运行的程序(用户程序)。jump2app是一个函数指针是一个返回值为void,无参的函数。它声明了jump2app去接收这样的一个函数名(函数地址)(iapfun)*(vu32*)(appxaddr+4),FLASH_APP1_ADDR基础上+4就是中断复位函数地址,将此地址转换成函数的32位的地址,然后把中断复位函数的函数地址给jump2app,
是一段汇编,意思应该是执行新的栈区,然后jump2app()
执行中断复位函数,就跳转完成了。
后续,bootloader的传输现在只了解了一种USART,校验数据包的方式还不知道。
2022.3.24记。(这只是一个卑微大学生的笔记)