找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1992|回复: 3
打印 上一主题 下一主题
收起左侧

STM32-IAP项目代码 使用中

[复制链接]
跳转到指定楼层
楼主
项目中正在使用的 STM32系列单片机 的远程IAP使用方式,从此刷机不用再拆机!

单片机源程序如下:
  1. /*******************************************************************************
  2. ** 功能:         远程烧写程序的启动文件
  3. *******************************************************************************/
  4. #include "stm32boot.h"
  5. #include "EEPROM.h"
  6. /* 类型声明 -----------------------------------------------------------------*/
  7. typedef void (*pFunction)(void);
  8. /* 变量 ----------------------------------------------------------------------*/
  9. pFunction Jump_To_Application ;
  10. uint32_t JumpAddress;
  11. #define ApplicationAddress 0x8003000
  12. void NVIC_Configuration(void);


  13. /*******************************************************************************
  14.   * @函数名称        main
  15.   * @函数说明 主函数
  16.   * @输入参数 无
  17.   * @输出参数 无
  18.   * @返回参数 无
  19. *******************************************************************************/
  20. extern __IO unsigned long time32_incr;
  21. unsigned long portGetTickCnt(void)
  22. {
  23. //        time32_incr = SysTick->VAL;
  24.         return time32_incr;
  25. }

  26. void Sleep(unsigned int time_ms)
  27. {
  28.     unsigned long end = portGetTickCnt() + time_ms;
  29.     while ((signed long)(portGetTickCnt() - end) <= 0)
  30.         ;
  31. }



  32. void CloseIrq(void)
  33. {
  34.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭SYSTICK中断
  35.         DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, DISABLE);       //使能DMA通道4传输完成中断
  36.         DMA_ITConfig(DMA1_Channel7, DMA_IT_TE, DISABLE);
  37.         USART_ITConfig(USART2, USART_IT_IDLE, DISABLE);
  38.         USART_DeInit(USART2);
  39.         DMA_DeInit(DMA1_Channel7);
  40.         DMA_DeInit(DMA1_Channel6);
  41. }


  42. int main(void)
  43. {
  44.         int i=1200;
  45.         u16 FLAG = 0;
  46.   /* Enable PWR and BKP clocks */
  47.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  48.   /* Allow access to BKP Domain */
  49.     PWR_BackupAccessCmd(ENABLE);
  50.     FLASH_Unlock();
  51.         UART2_Configuration();
  52.         SysTick_Init();
  53.         NVIC_Configuration();
  54.         Sleep(20);
  55.         printf("bootv2.0-20181210\r\n");
  56.         while (i--)
  57.         {
  58.                 Communication();
  59.                 Sleep(20);
  60.         }
  61.         eeprom_read_block(&FLAG, PROGRAMS_ADDR, 2);
  62.         
  63.    if (FLAG == 0xE0E0)
  64.    {

  65. //        DevAddr = 1;
  66. //        NVIC_Configuration();
  67. //        FLASH_Unlock() ;
  68. //        //串口初始化
  69. //        UART2_Configuration();0
  70. //        //系统时基启动
  71. //       // SysTick_Init();
  72. //               
  73. //                led_on();

  74.          while (1)
  75.         {
  76.             Communication();
  77.         }
  78.     }
  79.     //否则执行用户程序
  80.     else
  81.     {
  82.         //判断用户是否已经下载程序,因为正常情况下此地址是栈地址。
  83.         //若没有这一句的话,即使没有下载程序也会进入而导致跑飞。
  84.                 FLASH_Lock();
  85.                
  86.         if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
  87.         {
  88.             JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
  89.             Jump_To_Application = (pFunction) JumpAddress;
  90.             //初始化用户程序的堆栈指针
  91.             __set_MSP(*(__IO uint32_t*) ApplicationAddress);
  92.                         printf("jump to app\r\n");
  93.                         CloseIrq();
  94.             Jump_To_Application();
  95.         }
  96.         else
  97.         {
  98.                         u16 data = 0xE0E0;
  99.             eeprom_write_block(&data, PROGRAMS_ADDR, 2);
  100.                         printf("no app wait program\r\n");
  101.             SoftReset();
  102.         }
  103.     }
  104.     while (1)
  105.     {
  106.     }
  107. }
  108. #define Set_NVIC(Channel,Preemption,Sub,Cmd) { NVIC_InitStructure.NVIC_IRQChannel = Channel; \
  109.                                                    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = Preemption; \
  110.                                                    NVIC_InitStructure.NVIC_IRQChannelSubPriority = Sub; \
  111.                                                    NVIC_InitStructure.NVIC_IRQChannelCmd = Cmd; \
  112.                                                    NVIC_Init(&NVIC_InitStructure); }

  113.                                                                                                    
  114.                                                                                                    
  115.                                                                                                    
  116.                                                 
  117. //************************************************************************************************
  118. //**名 称:NVIC_Init
  119. //**说 明:中断优先级初始化
  120. //**形 参:无
  121. //**返 回 值:无
  122. //************************************************************************************************
  123. void NVIC_Configuration (void)
  124. {
  125.     NVIC_InitTypeDef NVIC_InitStructure;
  126.    
  127.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //4个抢占优先级,4个从优先级
  128.     /* Configure the SysTick handler priority */
  129.     NVIC_SetPriority(SysTick_IRQn, 0);//SysTick中断优先级设置 //非实时任务优先级最低 3,0
  130.     Set_NVIC(USART2_IRQn , 2, 0,ENABLE) ;
  131. }
  132. /*******************************文件结束***************************************/
复制代码

所有资料51hei提供下载:
STM32远程升级.7z (1.08 MB, 下载次数: 31)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:445069 发表于 2019-6-11 10:11 | 只看该作者
正在学习STM32 IAP 在线升级!希望能有所借鉴!
回复

使用道具 举报

板凳
ID:366899 发表于 2019-6-11 14:59 来自手机 | 只看该作者
很不错
回复

使用道具 举报

地板
ID:288646 发表于 2019-9-26 16:00 | 只看该作者
不错 不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表