完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
IAP在线升级可以是芯片更新程序脱离烧录器等专用工具,可以使用串口、网络等通用通信方式来达到升级的目的,方便下载程序升级更新。
STM32F0系列是M0内核,与STM32F1和F4系列有即M0系列没有其他像M3/M4/M0+系列所具有的中断向量表重定位,其中断向量表不能定位向量重定位重映射。所以STM32f0 IAP的过程会与其他系列的STM32芯片的IAP不同。但是stm32有两种启动方式,一种是从flash启动,默认地址为0x0800000,一种是从RAM启动,默认地址为0x20000000,所以可以让IAP从Flash启动,而APP从RAM启动,通过接口SYSCFG_MemoryRemapConfig配置。因为我们是把APP代码直接拷贝到0x0800000+offset的地址获取的,其中断表在Flash里面,所以在APP启动的时候,需要把中断向量表拷贝到RAM的起始地址中去。 STM32F030的参考手册中找到以下说明: Physicalremap 一旦选择了引导模式,应用软件就可以修改代码区中可访问的存储器。这种修改是通过对 SYSCFG 配置寄存器 1 (SYSCFG_CFGR1) 中的 MEM_MODE 位进行编程来实现的。不像皮质?M3和M4,M0 CPU不支持向量表重定位。对于位于与 0x0800 0000 不同地址的应用程序代码,必须添加一些额外的代码才能为应用程序中断提供服务。一种解决方案是通过软件将向量表重定位到内部 SRAM: ? 将向量表从 Flash(映射到应用程序加载地址的基地址)复制到 SRAM 的基地址 0x20000000。 ? 使用 SYSCFG 配置寄存器 1 在地址 0x0000 0000 处重新映射 SRAM。 ? 那么一旦发生中断,Cortex?-M0 处理器就会从SRAM 中重定位的向量表中取出中断处理程序起始地址,然后跳转执行位于Flash 中的中断处理程序。 此操作应在应用程序的初始化阶段完成。 有关更多详细信息,请参阅 AN4065 和来自www.st.com 的附加 IAP 代码 。 Bootlader源码如下 void HardwareInit(void) { /* close all interrupt*/ __disable_irq(); RCC_DeInit();//为了从IAP程序中跳出运行APP程序的时候正常开始,初始化时要RCC为复位状态,恢复NVIC SystemInit(); extern uint32_t SystemCoreClock; SysTick_Config(SystemCoreClock/600); Usart1Init(115200); ShowVersion(); __enable_irq(); } #define BOOTLADER_SIZE ((uint32_t)1024 * 12) #define BOOT_START_ADDRESS ((uint32_t)0x08000000) #define BOOT_FLASH_END_ADDRESS ((uint32_t)BOOT_START_ADDRESS+BOOTLADER_SIZE-1) #define BOOT_FLASH_SIZE (BOOT_FLASH_END_ADDRESS-BOOT_START_ADDRESS+1) #define APP_START_ADDRESS ((uint32_t)(BOOT_FLASH_END_ADDRESS+1)) typedef void (*pFunction)(void); __IO pFunction JumpToAplication; void JumpToApp(void) { // printf(“Run Application %x n”,(*(__IO uint32_t*)APP_START_ADDRESS)); if(((*(__IO uint32_t*)APP_START_ADDRESS) & 0x2ffe0000)==0x20000000) { printf(“Go to application and runnign”); __disable_irq(); JumpToAplication=(pFunction)(*(__IO uint32_t*)(APP_START_ADDRESS+4)); __set_MSP(*(__IO uint32_t*)APP_START_ADDRESS); JumpToAplication(); } } 应用程序设计: #define APPLICATION_ADDRESS (uint32_t)0x8003000 #if (defined ( __CC_ARM )) __IO uint32_t VectorTable[48] __attribute__((at(0x20000000))); #elif (defined (__ICCARM__)) #pragma location = 0x20000000 __no_init __IO uint32_t VectorTable[48]; #elif defined ( __GNUC__ ) __IO uint32_t VectorTable[48] __attribute__((section(“.RAMVectorTable”))); #elif defined ( __TASKING__ ) __IO uint32_t VectorTable[48] __at(0x20000000); #endif void IAPAPP_Init() { for(uint8_t i = 0; i 《 48; i++) { VectorTable[i] = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i《《2)); } /* Enable the SYSCFG peripheral clock*/ RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Remap SRAM at 0x00000000 */ SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM); } int main(void) { //SCB-》VTOR =((uint32_t)0x08003000); IAPAPP_Init(); HardwareInit(); printf(“Hello, welcome to applicationn”); uint16_t TimeCount=0; while(1) { if((TickCount》100)&&(TimeCount《1000)) { TickCount=0; printf(“wait %d secondn”,TimeCount); TimeCount++; } } return 1; } Application的keil设置: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1752 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1611 浏览 1 评论
1052 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1666 浏览 2 评论
1924浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
711浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
560浏览 3评论
583浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
544浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 12:32 , Processed in 0.931087 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号