使用丁丁串口调试助手将app的,bin文件写到stm32f103rct6的sram中 缓存的起始地址为0x20001000
打开bin文件如下图
可一看到 app的栈顶地址为20000a90
app的reser_handler地址为08010145
打开app的map程序可以看到,复位地址和栈顶地址和bin文件相同
理论上来说,在执行如下代码时候,是可以进行复制的,因为根据上面的地址描述 if语句的判断应该为真的,但是实际结果确实“打印非FLASH应用程序!” 感觉很没有道理呀。
[mw_shl_code=c,true] if(Flag == 0XAB) { [/mw_shl_code]
[mw_shl_code=c,true] if(applenth)
{
printf("开始更新固件...\r\n");
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//??????·???0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//?ü??FLASH?ú??
delay_ms(100);
UART_Send(buffer3, countof(buffer3)-1);
Flag = 0;
//break;
}[/mw_shl_code]
[mw_shl_code=c,true] }[/mw_shl_code]
贴出串口的接收程序段,问题会不会出现在这里呢,flag标志位存放在0x2000010c中 并不会给
[mw_shl_code=c,true]USART_RX_BUF[USART_REC_LEN] 数组造成破坏。请各位大神给看下 [/mw_shl_code]
[mw_shl_code=c,true]#if EN_USART1_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));//接收缓冲,最大USART_REC_LEN个字节,起始地址为0X20001000.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记
u16 USART_RX_CNT=0; //接收的字节数
u16 Flag;
void USART1_IRQHandler(void)
{
u8 res;
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到数据
{
res=USART_ReceiveData(USART1);
if(USART_RX_CNT<USART_REC_LEN)
{
USART_RX_BUF[USART_RX_CNT]=res;
USART_RX_CNT++;
Flag = res;
}
}[/mw_shl_code]
|