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

查看: 4768|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版