zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    Kafka 生产者 自定义分区策略
    同步互斥
    poj 1562 Oil Deposits(dfs)
    poj 2386 Lake Counting(dfs)
    poj 1915 KnightMoves(bfs)
    poj 1664 放苹果(dfs)
    poj 1543 Perfect Cubes (暴搜)
    poj 1166 The Clocks (暴搜)
    poj 3126 Prime Path(bfs)
    处理机调度
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/7764749.html
Copyright © 2011-2022 走看看