STM32 IAPAPP参数配置向量表映射.docx
《STM32 IAPAPP参数配置向量表映射.docx》由会员分享,可在线阅读,更多相关《STM32 IAPAPP参数配置向量表映射.docx(15页珍藏版)》请在冰豆网上搜索。
STM32IAPAPP参数配置向量表映射
基于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的optionfortarget’stm3210e-evel’配置
1)这里要注意的是IROM1的配置
2)这里是片子的选择配置
单击setting进入下面的界面
这里要注意ProgrammingAlgorithm的size大小。
实际上经过测试,这个size使用片子的最大的容量也没关系,即0x00080000(512K),也不会影响程序的运行。
3)以上是大家需要配置的,以下是其它的配置,与IAP功能无关紧要,是我的配置,仅供大家参考。
2.APP的配置
1)注意下面的IROM1的配置,千万不可与IAP有区域重叠,而且size不能超过片子的大小。
这里0x7AC00与IAP的0x5400之和,刚好是0x80000,即512K
2)片子的配置
再次说明一下,以上的RAMforalgorithm(RAM为运算法则准备的空间)的size和programmingforalgorithm(程序为运算准备的空间)的size都是默认的,当然程序为运算准备的空间大小也可以改成0x7AC00,起始地址改为0x08005400,但经过调试效果都一样。
其它MDK的设置参照IAP的(3)点
(3)以下的说明要特别注意,稍不留神就会出问题。
平时我们在建立工程的时候,可能不会去重新映射向量表,原因是一般我们程序的起始地址都是默认的0x08000000,但此刻的APP的起始地址是0x08005400,那么就必须重新映射了。
需要注意的是,在系统时钟配置好后,马上就做向量映射,中间最好先不要做其它的配置,比如端口初始化等等,否则程序跑飞也不一定的。
下面的这段代码就是我实际的配置过程。
VoidMain(void)
{
SystemInit();//系统初始化
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x5400);//向量表映射
……
}
voidSystemInit(void)
{
/*!
RCC->CR|=(uint32_t)0x00000100;
/*!
0],HPRE[3:
0],PPRE1[2:
0],PPRE2[2:
0],MCOSEL[2:
0]andMCOPRE[2:
0]bits*/
RCC->CFGR&=(uint32_t)0x88FFC00C;
/*!
RCC->CR&=(uint32_t)0xEEFEFFFE;
/*!
RCC->CR&=(uint32_t)0xFFFBFFFF;
/*!
0]andPLLDIV[1:
0]bits*/
RCC->CFGR&=(uint32_t)0xFF02FFFF;
/*!
RCC->CIR=0x00000000;
/*ConfiguretheSystemclockfrequency,AHB/APBxprescalersandFlashsettings*/
SetSysClock();
//SetSysClock65K();
#ifdefVECT_TAB_SRAM
SCB->VTOR=SRAM_BASE|VECT_TAB_OFFSET;/*VectorTableRelocationinInternalSRAM.*/
#else
SCB->VTOR=FLASH_BASE|VECT_TAB_OFFSET;/*VectorTableRelocationinInternalFLASH.*/
#endif
}
staticvoidSetSysClock(void)
{
__IOuint32_tStartUpCounter=0,HSEStatus=0;
/*SYSCLK,HCLK,PCLK2andPCLK1configuration---------------------------*/
/*EnableHSE*/
RCC->CR|=((uint32_t)RCC_CR_HSEON);
/*WaittillHSEisreadyandifTimeoutisreachedexit*/
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)
{
/*Enable64-bitaccess*/
FLASH->ACR|=FLASH_ACR_ACC64;
/*EnablePrefetchBuffer*/
FLASH->ACR|=FLASH_ACR_PRFTEN;
/*Flash1waitstate*/
FLASH->ACR|=FLASH_ACR_LATENCY;
/*Powerenable*/
RCC->APB1ENR|=RCC_APB1ENR_PWREN;
/*SelecttheVoltageRange1(1.8V)*/
PWR->CR=PWR_CR_VOS_0;
/*WaitUntiltheVoltageRegulatorisready*/
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;
/*PLLconfiguration*/
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);
/*EnablePLL*/
RCC->CR|=RCC_CR_PLLON;
/*WaittillPLLisready*/
while((RCC->CR&RCC_CR_PLLRDY)==0)
{
}
/*SelectPLLassystemclocksource*/
RCC->CFGR&=(uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR|=(uint32_t)RCC_CFGR_SW_PLL;
/*WaittillPLLisusedassystemclocksource*/
while((RCC->CFGR&(uint32_t)RCC_CFGR_SWS)!
=(uint32_t)RCC_CFGR_SWS_PLL)
{
}
}
else
{
/*IfHSEfailstostart-up,theapplicationwillhavewrongclock
configuration.Usercanaddheresomecodetodealwiththiserror*/
}
}
OYZQ2013-12-30