bsp_iap.c文件内容- /**
- ******************************************************************************
- * 文件名程: bsp_iap.c
- * 作 者: 硬石嵌入式开发团队
- * 版 本: V1.0
- * 编写日期: 2015-10-04
- * 功 能: IAP底层驱动实现
- ******************************************************************************
- * 说明:
- * 本例程配套硬石stm32开发板YS-F1Pro使用。
- *
- * 淘宝:
- * 论坛:http://www.ing10bbs.com
- * 版权归硬石嵌入式开发团队所有,请勿商用。
- ******************************************************************************
- */
- /* 包含头文件 ----------------------------------------------------------------*/
- #include "IAP/bsp_iap.h"
- #include "stmflash/stm_flash.h"
- /* 私有类型定义 --------------------------------------------------------------*/
- /* 私有宏定义 ----------------------------------------------------------------*/
- /* 私有变量 ------------------------------------------------------------------*/
- #if defined ( __CC_ARM ) // 使用Keil编译环境
- struct STRUCT_IAP_RECIEVE strAppBin __attribute__((at(0x20001000)))={{0},0};
- #elif defined ( __ICCARM__ ) // 使用IAR编译环境
- struct STRUCT_IAP_RECIEVE strAppBin;//={{0},0};
- #endif
- static uint16_t ulBuf_Flash_App[1024];
- /* 扩展变量 ------------------------------------------------------------------*/
- /* 私有函数原形 --------------------------------------------------------------*/
- /* 函数体 --------------------------------------------------------------------*/
- void IAP_Write_App_Bin ( uint32_t ulStartAddr, uint8_t * pBin_DataBuf, uint32_t ulBufLength )
- {
- uint16_t us, usCtr=0, usTemp;
- uint32_t ulAdd_Write = ulStartAddr; //当前写入的地址
- uint8_t * pData = pBin_DataBuf;
-
- for ( us = 0; us < ulBufLength; us += 2 )
- {
- usTemp = ( uint16_t ) pData[1]<<8;
- usTemp += ( uint16_t ) pData[0];
- pData += 2; //偏移2个字节
- ulBuf_Flash_App [ usCtr ++ ] = usTemp;
- if ( usCtr == 1024 )
- {
- usCtr = 0;
- STMFLASH_Write ( ulAdd_Write, ulBuf_Flash_App, 1024 );
- ulAdd_Write += 2048; //偏移2048 16=2*8.所以要乘以2.
- }
- }
- if ( usCtr )
- STMFLASH_Write ( ulAdd_Write, ulBuf_Flash_App, usCtr );//将最后的一些内容字节写进去.
- }
- #if defined ( __CC_ARM ) // 使用Keil编译环境
- __asm void MSR_MSP ( uint32_t ulAddr )
- {
- MSR MSP, r0 //set Main Stack value
- BX r14
- }
- #elif defined ( __ICCARM__ ) // 使用IAR编译环境
- void MSR_MSP ( uint32_t ulAddr )
- {
- asm("MSR MSP, r0"); //set Main Stack value
- asm("BX r14");
- }
- #endif
- //跳转到应用程序段
- //ulAddr_App:用户代码起始地址.
- void IAP_ExecuteApp ( uint32_t ulAddr_App )
- {
- pIapFun_TypeDef pJump2App;
-
- if ( ( ( * ( __IO uint32_t * ) ulAddr_App ) & 0x2FFE0000 ) == 0x20000000 ) //检查栈顶地址是否合法.
- {
- pJump2App = ( pIapFun_TypeDef ) * ( __IO uint32_t * ) ( ulAddr_App + 4 ); //用户代码区第二个字为程序开始地址(复位地址)
- MSR_MSP( * ( __IO uint32_t * ) ulAddr_App ); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
- pJump2App (); //跳转到APP.
- }
- }
- /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/





收藏
|