完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
程序收尾总想着以后更新的方便性,采用在应用编程(In Application Programming),通过Bootload引导单片机自己往程序存储器里写数据或修改程序。下面简介STM32F030的IAP方法。不同于STM32F1系列,F0没有中断向量偏移寄存器。所以在APP程序的开头要添加以下代码。为什么这样做??
可以看到函数用了for循环将矢量表拷贝到0 x20000000 SRAM的基地址,即将矢量表由Flash映射到了SRAM。所以在MDK里面设置Flash偏移地址的时候,同时要设置SRAM偏移地址。如下截图 //APP程序开头加入IAP_Set(void)函数 //Falsh address #define APPLICATION_ADDRESS ((uint32_t)0x08001400) //SRAM Address 0x020000C0 void IAP_Set(void) { uint32_t i = 0; /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/ /* Copy the vector table from the Flash (mapped at the base of the application load address 0x08003000) to the base address of the SRAM at 0x20000000. */ for(i = 0; i 《 48; i++) { *((uint32_t*)(0x20000000 + (i 《《 2)))=*(__IO uint32_t*)(APPLICATION_ADDRESS + (i《《2)); } /* Enable the SYSCFG peripheral clock*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Remap SRAM at 0x00000000 */ SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM); } 有Target对话框可以看出APP程序有Flash地址0x8001400开始执行。Sram数据则有0x20000c0出开始存储。 说完APP代码要处理事项,下面说一下IAP代码编写 /* Keep the user application running */ /* Test if user code is programmed starting from address “APPLICATION_ADDRESS” */ if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000) == 0x20000000) { 《span style=“white-space:pre”》 《/span》/* Jump to user application */ 《span style=“white-space:pre”》 《/span》JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); 《span style=“white-space:pre”》 《/span》Jump_To_Application = (pFunction)JumpAddress; 《span style=“white-space:pre”》 《/span》/* Initialize user application‘s Stack Pointer */ 《span style=“white-space:pre”》 《/span》__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); 《span style=“white-space:pre”》 《/span》/* Jump to application */ 《span style=“white-space:pre”》 《/span》Jump_To_Application(); } 程序更新完以后执行以上跳转函数即可执行更新的APP代码。关于如何通过IAP将代码将APP代码(bin文件)传到单片机Flash,可以通过串口分包传输。因为F0Flash是1K为一页所以这里我用的是1K缓存,即接收串口1K的数据量就执行一次Flash写操作,传输到最后不满1K,填写0XFF按照1K数据写。写Flash代码如下 //存满1K的数据 写入Flash if (g_nFlashDataLen == FLASH_PAGE_SIZE) { #if (DEBUGIAP ==1) USART1_SendBytesProc(g_nFlashBuf,FLASH_PAGE_SIZE); g_nSysCommTimerCtrl=0; while(g_nSysCommTimerCtrl 《 200);//5ms #else //擦除待写的Flash FLASH_If_Erase(g_nFlashAddr); loop1: //写入Flash nFlashData = (u32)g_nFlashBuf; if (FLASH_If_Write(&g_nFlashAddr, (u32*)nFlashData, (u16)g_nFlashDataLen / 4) != 0) { if (nCount++ 《 5) goto loop1; } //地址增加 g_nFlashAddr += FLASH_PAGE_SIZE; #endif //清除g_nFlashDataLen计数 g_nFlashDataLen = 0; } 关于IAP如何接收串口的数据,我用的是正点原子的XCOM V2.0串口调试助手通过协议传输每次传输128字节数据,执行的IAP串口数据接收。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1456 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1448 浏览 1 评论
851 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
611 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1471 浏览 2 评论
1809浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
553浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
471浏览 3评论
459浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
441浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-20 04:55 , Processed in 0.666310 second(s), Total 73, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号