基于MDK的STM32系列IAP和APP程序的配置
很多人在做IAP程序的时候,一般都能很容易就做出来,但是在做APP的时候,却经常会跑飞,其中原理,大都由于MDK配置出的问题,或者是APP没有映射向量表。向量表起始地址默认的是0x08000000,在IAP的程序里不用再映射,但APP的起始地址已经不再是0x08000000,所以,必须要映射到实际的起始地址,否则当IAP跳转到APP的时候,程序直接就飞了。如我的APP起始地址是0x08005400,我的映射函数是这么配置的NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x5400); NVIC_VectTab_FLASH的值就是0x08000000。下面让我们来看看IAP和APP的MDK配置,其中片子为STM32F103RE,IAP起始是0x08000000,程序大小是0x5400字节;APP的起始地址是0x08005400,程序大小是0x7AC00,配置如下: 1. IAP的option for target’stm3210e-evel’配置 2.
1)这里要注意的是IROM1的配置
2)这里是片子的选择配置
1
少年易学老难成,一寸光阴不可轻 -
单击setting进入下面的界面
这里要注意Programming Algorithm的size大小。实际上经过测试,这个size使用片子的最2
少年易学老难成,一寸光阴不可轻 -
大的容量也没关系,即0x00080000(512K),也不会影响程序的运行。
3)以上是大家需要配置的,以下是其它的配置,与IAP功能无关紧要,是我的配置,仅供大家参考。
3
少年易学老难成,一寸光阴不可轻 -
4
少年易学老难成,一寸光阴不可轻 -
5
少年易学老难成,一寸光阴不可轻 -
6
少年易学老难成,一寸光阴不可轻 -
7
少年易学老难成,一寸光阴不可轻 -
3. APP的配置
1)注意下面的IROM1的配置,千万不可与IAP有区域重叠,而且size不能超过片子的大小。这里0x7AC00与IAP的0x5400之和,刚好是0x80000,即512K
8
少年易学老难成,一寸光阴不可轻 -
2)片子的配置
9
少年易学老难成,一寸光阴不可轻 -
再次说明一下,以上的RAM for algorithm(RAM为运算法则准备的空间)的size和programming for algorithm(程序为运算准备的空间)的size都是默认的,当然程序为运算准备的空间大小也可以改成0x7AC00,起始地址改为0x08005400,但经过调试效果都一样。 其它MDK的设置参照IAP的(3)点
(3)以下的说明要特别注意,稍不留神就会出问题。平时我们在建立工程的时候,可能不会去重新映射向量表,原因是一般我们程序的起始地址都是默认的0x08000000,但此刻的APP的起始地址是0x08005400,那么就必须重新映射了。需要注意的是,在系统时钟配置好后,马上就做向量映射,中间最好先不要做其它的配置,比如端口初始化等等,否则程序跑飞也不一定的。下面的这段代码就是我实际的配置过程。 Void Main(void) {
SystemInit();//系统初始化
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x5400); //向量表映射 …… }
void SystemInit (void) {
/*!< Set MSION bit */
RCC->CR |= (uint32_t)0x00000100;
/*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */
RCC->CFGR &= (uint32_t)0x88FFC00C;
/*!< Reset HSION, HSEON, CSSON and PLLON bits */ RCC->CR &= (uint32_t)0xEEFEFFFE;
/*!< Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */ RCC->CFGR &= (uint32_t)0xFF02FFFF;
/*!< Disable all interrupts */ RCC->CIR = 0x00000000;
/* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */ 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 10
少年易学老难成,一寸光阴不可轻 -
FLASH. */ #endif }
static void SetSysClock(void) {
__IO uint32_t StartUpCounter = 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_STARTUP_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 |= FLASH_ACR_LATENCY;
/* Power enable */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
/* Select the Voltage Range 1 (1.8 V) */ PWR->CR = PWR_CR_VOS_0; 11
少年易学老难成,一寸光阴不可轻 -
/* 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 = HCLK /1*/
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* 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_PLLMUL12 | 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 */ } 12
少年易学老难成,一寸光阴不可轻 -
}
OYZQ 2013-12-30
13
因篇幅问题不能全部显示,请点此查看更多更全内容