在线时间0 小时
UID152422
ST金币0
蝴蝶豆0
注册时间2008-8-20
新手上路
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
为实现通过STM32的USB进行IAP程序下载(由于对CH374比较熟悉,而STM32的USB库比较繁杂,当前未采用STM32自带的USB功能,而是采用STM32 + CH374实现),我将FLASH分为两部分:
0x08000000 --- 0x08002FFF作为IAP程序空间;
0x08003000 --- 0x08010000作为用户应用程序空间;
现在我已经实现了可以将用户程序下载到指定的0x08003000开始的位置,并且比较FLASH中的数据也与编译产生的BIN文件数据一样。
主程序大体如下:
int main(void)
{
u8 count;
u8 temp8;
RCC_Configuration( ); /* 时钟初始化 */
USART_Configuration( ); /* 串口初始化 */
#ifdef MY_DEBUG_PRINTF
printf("start\n");
#endif
Mode_Select_Pin_Init( ); /* 初始化模式选择引脚 */
/* 如果PA.0为高电平,则进入用户程序模式;否则进入IAP下载模式 */
if( Mode_Select_Pin_Read( ) != 0x00 )
{
printf("Use mode\n");
/* 判断用户程序的起始地址是否为0X8003000 */
if( ( ( *( vu32* )0x8003000 ) & 0x2FFF0000 ) == 0x20000000 )
{
/* 将用户代码的复位地址赋值给JumpAddress */
JumpAddress = *( vu32* )( ApplicationAddress + 4 );
Jump_To_Application = ( pFunction )JumpAddress;
/* 初始化用户程序的堆栈指针 */
__MSR_MSP( *( vu32* )ApplicationAddress ); /* 把用户代码的堆栈地址写入堆栈指针 */
Jump_To_Application( ); /* 把用户代码的复位地址付给PC指针 */
}
}
else
{
printf("IAP mode\n");
/* 进入下载模式,进行程序下载处理 */
............
}
}
现在问题是上电运行后,程序也能进入用户应用程序部分,但运行的不正常,感觉好象直接就没运行。用户应用程序很简单,只是简单的打印输出。如果直接用串口下载工具,下载到0x08000000起始地址能正常打印输出,但通过USB IAP下载到0x08003000就运行不正常, 感觉应该是我编译的应用程序设置不对,也参考网上说的进行设置过,但还是不对。不知道具体需要怎么设置,我用的MDK(KEIL 3.53),希望自己的大虾能指导下,万分感激。 |
|