1、stm32iapapp参数配置向量表映射基于MDK的STM32系列IAP和APP程序的配置很多人在做IAP程序的时候,一般都能很容易就做出来,但是在做APP的时候,却经常会跑飞,其中原理,大都由于MDK配置出的问题,或者是APP没有映射向量表。向量表起始地址默认的是0x08000000,在IAP的程序里不用再映射,但APP的起始地址已经不再是0x08000000,所以,必须要映射到实际的起始地址,否则当IAP跳转到APP的时候,程序直接就飞了。如我的APP起始地址是0x08005400,我的映射函数是这么配置的NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x
2、5400); NVIC_VectTab_FLASH的值就是0x08000000。下面让我们来看看IAP和APP的MDK配置,其中片子为STM32F103RE,IAP起始是0x08000000,程序大小是0x5400字节;APP的起始地址是0x08005400,程序大小是0x7AC00,配置如下:1IAP的option for targetstm3210e-evel配置21)这里要注意的是IROM1的配置 2)这里是片子的选择配置单击setting进入下面的界面这里要注意Programming Algorithm的size大小。实际上经过测试,这个size使用片子的最大的容量也没关系,即0x00
3、080000(512K),也不会影响程序的运行。3)以上是大家需要配置的,以下是其它的配置,与IAP功能无关紧要,是我的配置,仅供大家参考。3APP的配置1)注意下面的IROM1的配置,千万不可与IAP有区域重叠,而且size不能超过片子的大小。这里0x7AC00与IAP的0x5400之和,刚好是0x80000,即512K2)片子的配置再次说明一下,以上的RAM for algorithm(RAM为运算法则准备的空间)的size和programming for algorithm(程序为运算准备的空间)的size都是默认的,当然程序为运算准备的空间大小也可以改成0x7AC00,起始地址改为0x
4、08005400,但经过调试效果都一样。其它MDK的设置参照IAP的(3)点(3)以下的说明要特别注意,稍不留神就会出问题。平时我们在建立工程的时候,可能不会去重新映射向量表,原因是一般我们程序的起始地址都是默认的0x08000000,但此刻的APP的起始地址是0x08005400,那么就必须重新映射了。需要注意的是,在系统时钟配置好后,马上就做向量映射,中间最好先不要做其它的配置,比如端口初始化等等,否则程序跑飞也不一定的。下面的这段代码就是我实际的配置过程。Void Main(void)SystemInit();/系统初始化NVIC_SetVectorTable(NVIC_VectTab_
5、FLASH, 0x5400); /向量表映射void SystemInit (void) /*!CR |= (uint32_t)0x00000100; /*!CFGR &= (uint32_t)0x88FFC00C; /*!CR &= (uint32_t)0xEEFEFFFE; /*!CR &= (uint32_t)0xFFFBFFFF; /*!CFGR &= (uint32_t)0xFF02FFFF; /*!CIR = 0x00000000; /* Configure the System clock frequency, AHB/APBx prescalers and Flash sett
6、ings */ SetSysClock(); / SetSysClock65K();#ifdef VECT_TAB_SRAM SCB-VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */#else SCB-VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */#endifstatic void SetSysClock(void) _IO uint32_t StartU
7、pCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -*/ /* Enable HSE */ RCC-CR |= (uint32_t)RCC_CR_HSEON); /* Wait till HSE is ready and if Time out is reached exit */ do HSEStatus = RCC-CR & RCC_CR_HSERDY; StartUpCounter+; while(HSEStatus = 0) & (StartUpCounter != HSE_START
8、UP_TIMEOUT); if (RCC-CR & RCC_CR_HSERDY) != RESET) HSEStatus = (uint32_t)0x01; else HSEStatus = (uint32_t)0x00; if (HSEStatus = (uint32_t)0x01) /* Enable 64-bit access */ FLASH-ACR |= FLASH_ACR_ACC64; /* Enable Prefetch Buffer */ FLASH-ACR |= FLASH_ACR_PRFTEN; /* Flash 1 wait state */ FLASH-ACR |= F
9、LASH_ACR_LATENCY; /* Power enable */ RCC-APB1ENR |= RCC_APB1ENR_PWREN; /* Select the Voltage Range 1 (1.8 V) */ PWR-CR = PWR_CR_VOS_0; /* Wait Until the Voltage Regulator is ready */ while(PWR-CSR & PWR_CSR_VOSF) != RESET) /* HCLK = SYSCLK /1*/ RCC-CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HC
10、LK /1*/ RCC-CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;XX文库 - 让每个人平等地提升自我 /* PCLK1 = HCLK /1*/ RCC-CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; /* PLL configuration */ RCC-CFGR &= (uint32_t)(uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL | RCC_CFGR_PLLDIV); RCC-CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PL
11、LMUL12 | RCC_CFGR_PLLDIV3); /* Enable PLL */ RCC-CR |= RCC_CR_PLLON; /* Wait till PLL is ready */ while(RCC-CR & RCC_CR_PLLRDY) = 0) /* Select PLL as system clock source */ RCC-CFGR &= (uint32_t)(uint32_t)(RCC_CFGR_SW); RCC-CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /* Wait till PLL is used as system clock source */ while (RCC-CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL) else /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */ OYZQ 2013-12-30
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1