你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 4686|回复: 10

【HAL库每天一例】第062例: IAP-串口IAP

[复制链接]

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
发表于 2016-7-6 08:50:10 | 显示全部楼层 |阅读模式
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:https://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-062. IAP-串口IAP

/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: IAP-Bootloader
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:硬石电子社区
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介   
  固件更新或升级在我们日常生活是非常常见的,比如Windows系统更新、手机系统更新、软件在线
更新、APP在线更新,本例程实现STM32的IAP(在线升级)功能,更新文件是由“LED-FLASH”或
“LED-RAM”例程生成的“YS-F1Pro.bin”文件,通过串口调试助手把该文件内容发送给运行本例程
的开发板,然后实现运行“YS-F1Pro.bin”文件代码功能。

【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  JP3        PB0           LED1               已接入
  JP4        PG6           LED2               已接入
  JP5        PG7           LED3               已接入
  
【3】操作及现象
  运行本例程之前,先打开“LED-FLASH”或“LED-RAM”例程编译生成“YS-F1Pro.bin”文件(路径:
..\LED-FLASH\Project\MDKARM(uV5)\YS-F1Pro.bin)。
  使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口(需要安装驱动),
在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序之后,在串口调试助手窗口可
接收到信息,如果我们不需要更新程序直接按下KEY2按键即可运行原本程序。如果需要更新程序,在没有
按下KEY2之前,在串口调试助手发送“YS-F1Pro.bin”文件给开发板(通过串口调试助手文件发送功能发
送即可)。然后按下KEY1按键实现在线升级,最后按下KEY2即可运行新程序。

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/


bsp_iap.h文件内容
  1. #ifndef __BSP_IAP_H__
  2. #define        __BSP_IAP_H__

  3. /* 包含头文件 ----------------------------------------------------------------*/
  4. #include "stm32f1xx_hal.h"

  5. /* 类型定义 ------------------------------------------------------------------*/
  6. /************************** IAP 数据类型定义********************************/
  7. typedef  void ( * pIapFun_TypeDef ) ( void ); //定义一个函数类型的参数.

  8. /* 宏定义 --------------------------------------------------------------------*/
  9. /************************** IAP 宏参数定义********************************/
  10. //是否更新 APP 到 FLASH,否则更新到 RAM
  11. #define User_Flash                                       

  12. #ifdef User_Flash
  13.   #define APP_START_ADDR       0x8010000          //应用程序起始地址(存放在FLASH)
  14. #else
  15.   #define APP_START_ADDR       0x20001000          //应用程序起始地址(存放在RAM)
  16. #endif

  17. /************************** IAP 外部变量********************************/
  18. #define APP_FLASH_LEN                             56320u       //定义 APP 固件最大容量,55kB=55*1024=56320

  19. /* 扩展变量 ------------------------------------------------------------------*/
  20. extern struct  STRUCT_IAP_RECIEVE      //串口数据帧的处理结构体
  21. {
  22.         uint8_t   ucDataBuf[APP_FLASH_LEN];
  23.         uint16_t  usLength;
  24. } strAppBin;

  25. /* 函数声明 ------------------------------------------------------------------*/
  26. void IAP_Write_App_Bin( uint32_t appxaddr, uint8_t * appbuf, uint32_t applen);        //在指定地址开始,写入bin
  27. void IAP_ExecuteApp( uint32_t appxaddr );                                                      //执行flash里面的app程序

  28. #endif /* __BSP_IAP_H__ */

  29. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码


bsp_iap.c文件内容
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: bsp_iap.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: IAP底层驱动实现
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   *
  12.   * 淘宝:
  13.   * 论坛:http://www.ing10bbs.com
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
  15.   ******************************************************************************
  16.   */
  17. /* 包含头文件 ----------------------------------------------------------------*/
  18. #include "IAP/bsp_iap.h"
  19. #include "stmflash/stm_flash.h"
  20. /* 私有类型定义 --------------------------------------------------------------*/
  21. /* 私有宏定义 ----------------------------------------------------------------*/
  22. /* 私有变量 ------------------------------------------------------------------*/
  23. #if defined ( __CC_ARM )  // 使用Keil编译环境

  24. struct STRUCT_IAP_RECIEVE strAppBin  __attribute__((at(0x20001000)))={{0},0};

  25. #elif defined ( __ICCARM__ ) // 使用IAR编译环境

  26. struct STRUCT_IAP_RECIEVE strAppBin;//={{0},0};

  27. #endif


  28. static uint16_t ulBuf_Flash_App[1024];

  29. /* 扩展变量 ------------------------------------------------------------------*/
  30. /* 私有函数原形 --------------------------------------------------------------*/
  31. /* 函数体 --------------------------------------------------------------------*/
  32. void IAP_Write_App_Bin ( uint32_t ulStartAddr, uint8_t * pBin_DataBuf, uint32_t ulBufLength )
  33. {
  34.         uint16_t us, usCtr=0, usTemp;
  35.         uint32_t ulAdd_Write = ulStartAddr;                                //当前写入的地址
  36.         uint8_t * pData = pBin_DataBuf;
  37.         
  38.         for ( us = 0; us < ulBufLength; us += 2 )
  39.         {                                                   
  40.                 usTemp =  ( uint16_t ) pData[1]<<8;
  41.                 usTemp += ( uint16_t ) pData[0];         
  42.                 pData += 2;                                                      //偏移2个字节
  43.                 ulBuf_Flash_App [ usCtr ++ ] = usTemp;            
  44.                 if ( usCtr == 1024 )
  45.                 {
  46.                         usCtr = 0;
  47.                         STMFLASH_Write ( ulAdd_Write, ulBuf_Flash_App, 1024 );        
  48.                         ulAdd_Write += 2048;                                           //偏移2048  16=2*8.所以要乘以2.
  49.                 }
  50.         }
  51.         if ( usCtr )
  52.     STMFLASH_Write ( ulAdd_Write, ulBuf_Flash_App, usCtr );//将最后的一些内容字节写进去.  
  53. }


  54. #if defined ( __CC_ARM )  // 使用Keil编译环境

  55. __asm void MSR_MSP ( uint32_t ulAddr )
  56. {
  57.     MSR MSP, r0                                            //set Main Stack value
  58.     BX r14
  59. }

  60. #elif defined ( __ICCARM__ ) // 使用IAR编译环境

  61. void MSR_MSP ( uint32_t ulAddr )
  62. {
  63.     asm("MSR MSP, r0");                                            //set Main Stack value
  64.     asm("BX r14");
  65. }


  66. #endif

  67. //跳转到应用程序段
  68. //ulAddr_App:用户代码起始地址.
  69. void IAP_ExecuteApp ( uint32_t ulAddr_App )
  70. {
  71.         pIapFun_TypeDef pJump2App;
  72.         
  73.         if ( ( ( * ( __IO uint32_t * ) ulAddr_App ) & 0x2FFE0000 ) == 0x20000000 )          //检查栈顶地址是否合法.
  74.         {
  75.                 pJump2App = ( pIapFun_TypeDef ) * ( __IO uint32_t * ) ( ulAddr_App + 4 );        //用户代码区第二个字为程序开始地址(复位地址)               
  76.                 MSR_MSP( * ( __IO uint32_t * ) ulAddr_App );                                                                    //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  77.                 pJump2App ();                                                                                                            //跳转到APP.
  78.         }
  79. }               

  80. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码

串口调试助手截图_1.jpg
串口调试助手截图_2.jpg
串口调试助手截图_3.jpg
串口调试助手截图_4.jpg


回复

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-7-6 09:45:17 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
2016-7-28
发表于 2016-7-6 16:28:59 | 显示全部楼层
想知道有没有hal库的iap
回复 支持 反对

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2016-7-6 18:16:50 | 显示全部楼层
这个就是用hal库写的啊
回复 支持 反对

使用道具 举报

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
2016-7-28
发表于 2016-7-7 10:55:43 | 显示全部楼层
额 说错了- - 是sd卡。。
回复 支持 反对

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2016-7-7 13:12:26 | 显示全部楼层
【HAL库每天一例】第044例: SDIO-基于SD卡FatFS文件系统
https://www.stmcu.org.cn/module/ ... &fromuid=331315
(出处: 意法半导体STM32/STM8技术社区)
回复 支持 反对

使用道具 举报

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
2016-7-28
发表于 2016-7-7 14:03:48 | 显示全部楼层
那么如果是要用iap升级sd卡该怎么做呢?
回复 支持 反对

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2016-7-7 14:55:15 | 显示全部楼层
你有没有看过我们这个IAP例程内容的,你要去分析它的实现原理啊,明白了原理就知道该怎么做了
回复 支持 反对

使用道具 举报

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
2016-7-28
发表于 2016-7-18 09:57:51 | 显示全部楼层
我想请问下 iap要怎么验证sd卡内的程序和升级后的程序是否相同?或者说怎么验证iap程序升级的文件是否正确?
回复 支持 反对

使用道具 举报

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
2016-7-28
发表于 2016-7-18 14:34:11 | 显示全部楼层
额 上面的问题解决了
可是还有一个新的问题想请教
升级完程序之后怎么自动跳转?有自动跳转函数了的

int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f2xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
        system_stm32f2xx.c file
     */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//0 bits for pre-emption priority   4 bits for subpriority
                                                   //2 bits for pre-emption priority   2 bits for subpriority
#ifdef  DEBUG_LED_FLASH
    SysTick_Config(120000000/100);//ÅäÖÃ10msµÄʱÖÓÖжÏ
#endif

    LED_init();
    LED10_ON();
    REDLED_ON();
    FLASH_If_Init();
    POWER_VCC3V_Open();
    Alarm_key_init();//if the key is press ,update
        LCD_GPIO_Init();
        delay_nms(10);
        LCD_SPI1_Init();
        delay_nms(10);
               
    while (1)
    {
#ifdef  DEBUG_LED_FLASH
        for(;;)
        {
            if(time_flag.flag500ms == 1 )
            {
                time_flag.flag500ms = 0;
                if(led_flash)
                {
                    LED10_ON();
                    REDLED_ON();
                    led_flash = 0;
                }
                else
                {
                    LED10_OFF();
                    REDLED_OFF();
                    led_flash = 1;
                }
            }
        }
#endif
        if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_12) == 1)
        {
            JumpToMainApp();
        }
        else
        {
            REDLED_OFF();
            SysTick_Config(120000000/100);
            SGW_Update();
            JumpToMainApp();
        }
    }
}

//Run To Main
static void JumpToMainApp(void)
{
    pFunction Jump_To_Application;
    uint32_t JumpAddress;
    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
        /* Jump to user application */
        JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
        Jump_To_Application = (pFunction) JumpAddress;
        /* Initialize user application's Stack Pointer */
        __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
        Jump_To_Application();
    }
}
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版