【iCore4 双核心板_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 = 0; /* 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_USART6_UART_Init(); /* USER CODE BEGIN 2 */ //³õʼ»¯´®¿Ú²¨ÌØÂÊ 115200 usart6.initialize(115200); usart6.printf("\x0c"); //ÇåÆÁ usart6.printf("\033[1;32;40m"); //ÉèÖÃÖÕ¶Ë×ÖÌåΪÂÌÉ« LED_GREEN_ON; if(ARM_KEY_STATE == KEY_UP){ //°´¼üËÉ¿ª×´Ì¬Ö±½ÓÌøÏòÓ¦ÓóÌÐò goto start; } while(1){ //°´¼ü°´Ï£¬½øÈëÉý¼¶×´Ì¬ if(i++ == 5000000){ //´®¿Ú·¢ËÍ×Ö·ûC usart6.send_byte('C'); i = 0; } if(usart6.receive_buffer[0] == SOH){ break; } } /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ if(usart6.receive_ok_flag == 1){ usart6.receive_ok_flag = 0; LED_GREEN_OFF; xmodem.process(); if(usart6.receive_buffer[0] == EOT){ usart6.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 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/1kVLzFPP 密码:37zh
iCore4链接: