| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "stmflash.h"
- #include "iap.h"
- #include "led.h"
- //////////////////////////////////////////////////////////////////////////////////
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //ALIENTEK MiniSTM32开发板
- //IAP 代码
- //正点原子@ALIENTEK
- //技术论坛:www.openedv.com
- //修改日期:2014/1/8
- //版本:V1.0
- //版权所有,盗版必究。
- //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
- //All rights reserved
- //////////////////////////////////////////////////////////////////////////////////
- iapfun jump2app;
- u16 iapbuf[1024];
- //appxaddr:应用程序的起始地址
- //appbuf:应用程序CODE.
- //appsize:应用程序大小(字节).
- void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
- {
- u16 t;
- u16 i=0;
- u16 temp;
- u32 fwaddr=appxaddr;//当前写入的地址
- u8 *dfu=appbuf;
- for(t=0;t<appsize;t+=2)
- {
- temp=(u16)dfu[1]<<8;
- temp+=(u16)dfu[0];
- dfu+=2;//偏移2个字节
- iapbuf[i++]=temp;
- if(i==1024)
- {
- i=0;
- STMFLASH_Write(fwaddr,iapbuf,1024);
- fwaddr+=2048;//偏移2048 16=2*8.所以要乘以2.
- }
- }
- if(i)STMFLASH_Write(fwaddr,iapbuf,i);//将最后的一些内容字节写进去.
- }
- //跳转到应用程序段
- //appxaddr:用户代码起始地址.
- void iap_load_app(u32 appxaddr)
- {
- if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
- {
-
- TIM_ARRPreloadConfig(TIM4, DISABLE); //使能重载值TIM4_PRESCALER_VALUE
-
- USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //使能USART1接收中断
- USART_Cmd(USART1, DISABLE); //使能USART1
-
- USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); //使能USART2接收中断
- USART_Cmd(USART2, DISABLE); //使能USART2
-
- USART_ITConfig(UART4, USART_IT_RXNE, DISABLE); //使能USART4接收中断
- USART_Cmd(UART4, DISABLE); //使能USART4
-
- USART_ITConfig(UART5, USART_IT_RXNE, DISABLE); //使能USART5接收中断
- USART_Cmd(UART5, DISABLE); //使能USART5
-
- INTX_DISABLE();
-
- jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
- MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
- jump2app(); //跳转到APP.
- while(1);
- }
- else
- {
- printf("栈顶地址不合法\r\n");
- }
- return;
- }
- //运行app1
- uint32_t run_app1(void)
- {
- // IRQn_Type irq;
- uint32_t appxaddr=FLASH_APP1_ADDR;
-
- printf("jump to 0x%08X.\r\n",appxaddr);
-
- if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
- {
- // USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //使能USART1接收中断
- // USART_Cmd(USART1, DISABLE); //使能USART1
- //
- // USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); //使能USART2接收中断
- // USART_Cmd(USART2, DISABLE); //使能USART2
- //
- // USART_ITConfig(UART4, USART_IT_RXNE, DISABLE); //使能USART4接收中断
- // USART_Cmd(UART4, DISABLE); //使能USART4
- //
- // USART_ITConfig(UART5, USART_IT_RXNE, DISABLE); //使能USART5接收中断
- // USART_Cmd(UART5, DISABLE); //使能USART5
-
-
- // for (irq = SysTick_IRQn; irq <= DMA2_Channel4_5_IRQn; irq++)
- // {
- // NVIC_DisableIRQ(irq);
- // NVIC_ClearPendingIRQ(irq);
- // }
- // __disable_irq();
-
- INTX_DISABLE();
- //TIM3_Int_Deinit();
- jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
- MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
- jump2app(); //跳转到APP.
- while(1);
- }
- else
- {
- printf("栈顶地址不合法\r\n");
- }
- return 0;
- }
- //获取信息
- uint32_t get_info(void)
- {
- return 0;
- }
- //复位
- uint32_t reboot(void)
- {
- NVIC_SystemReset();// 复位
- return 0;
- }
|