• 【iCore1S 双核心板_ARM】例程二十:UART_IAP_ARM实验——更新升级STM32


    实验现象及操作说明:

    1、本例程共有两个代码包,APP和IAP,IAP程序功能实现将APP程序升级至STM32中。

    2、直接上电或烧写程序将执行升级的APP应用程序。

    BIN升级文件产生方法:

    1、编译APP工程,产生.hex文件。

    2、将.hex文件拖至HEX2BIN.EXE即可产生.bin文件。

    核心代码:

    int main(void)
    {
    
      /* USER CODE BEGIN 1 */
        int i;
      /* USER CODE END 1 */
    
      /* MCU Configuration----------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_CRC_Init();
      MX_USART1_UART_Init();
    
      /* USER CODE BEGIN 2 */
        usart1.initialize(115200);
        usart1.printf("x0c");                                                      //ÇåÆÁ
        usart1.printf("33[1;32;40m");                   //ÉèÖÃÖÕ¶Ë×ÖÌåΪÂÌÉ«    
        
      for(i=0;i<100000;i++);
        
        //°´¼üËÉ¿ª£¬ÌøÖÁstart
        if(ARM_KEY_STATE == KEY_UP){
            goto start;    
        }
        
        while(1){
            if(i ++ == 5000000){
                
                //´®¿Ú·¢ËÍ×Ö·ûC
                usart1.send_byte('C');
                i = 0;
            }
            
            if(usart1.receive_buffer[0] == SOH){
                
                break;
            }
        }
        
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
            if(usart1.receive_ok_flag == 1){
                usart1.receive_ok_flag = 0;
                xmodem.process();
                                
                if(usart1.receive_buffer[0] == EOT){
                    usart1.send_byte(ACK);    
                    
                    //¶Á±£»¤
                    for(i = 0; i < 100000; i ++);    
                    HAL_FLASH_Lock();
                    
                    //·¢ËÍÎļþ³É¹¦£¬Â̵ÆÁÁ
                    LED_BLUE_OFF;
                    LED_RED_OFF;
                    LED_GREEN_ON;
                    
                    while(1);
                }
            }
    
      /* USER CODE END WHILE */
    
      /* USER CODE BEGIN 3 */
    
     }
        start:
            
        //²âÊÔÓû§´úÂëÊÇ·ñ´ÓAPPLICATION_ADDRESS±»±à³Ì
            if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000){ 
                
                //ÌøתÖÁÓû§³ÌÐò
                JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
                Jump_To_Application = (pFunction) JumpAddress;
                
                //³õʼ»¯Óû§³ÌÐòµÄ¶ÑÕ»Ö¸Õë
                __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
                
                //ÌøתÖÁÓ¦ÓóÌÐò
                Jump_To_Application();
            }else{                
                led_trade();
    
            }
    
      /* USER CODE END 3 */
    
    }

    实验方法及指导书:

    链接:http://pan.baidu.com/s/1jIaM6lo 密码:7oiv

  • 相关阅读:
    android之app widget(二)
    使用作业异步调用存储过程的示例
    简单两步走 中兴V880获取权限方法
    3D化网页工具:Tilt
    在各种处理中应用排序规则的示例
    GreenSock推出了新一代动画引擎平台GSAP v12
    Derived_Tables_And_Correlated_Subqueries
    六大浏览器帐号管理功能大PK
    Entity Framework 5 Sample Provider简介
    中兴U880刷recovery与刷机详细教程
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/7764749.html
Copyright © 2020-2023  润新知