本帖最后由 yljon 于 2021-11-29 23:05 编辑  
 
一、FM33LG0X简介: 
该系列MCU拥有多样的封装形式、丰富的模拟外设、充足的嵌入式存储资源,CAN接口、DAC等产品特点,可广泛应用于:物联网通讯、传感模块、智能家电、电池管理、电动工具、智能表计、健康医疗、工业应用等领域。 
该开发板存储方面集成了256KB的嵌入式FLASH与32KB的RAM,非常适合bootload+app。 
 
 
 
二、Bootload简介: 
bootload程序最必要的功能是负责对MCU固件的更新,也就是MCU自己给自己下载程序。 
在实际的MCU项目中,如果加入了bootload功能,就可以为单片机日后升级程序留出一个接口,方便为MCU程序更新。 
当然,需要创建两个项目工程,一个是bootload工程,一个是app工程。 
MCU 存储区结构如下图所示: 
 
 
 
 
具有bootload功能的MCU,在上电运行时,若检测到应用程序升级,则会擦除应用区程序代码,然后更新应用,跳转至应用代码区,运行更新后的应用程序; 
若未检测到应用程序升级,则会直接跳转至应用代码区,执行原应用程序。 
 
 
 
 
三、先下载bootload程序: 
FM33LG0X开发板的演示程序中有bootload程序,可以直接编译下载使用: 
 
 
- int main(void)
 
 - {
 
 -         unsigned int volatile i;
 
 -         uint32_t JumpAddress;
 
 -     
 
 -     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 
 -     /* SHOULD BE KEPT!!! */
 
 -     MF_Clock_Init();
 
 -     
 
 -     /* Configure the system clock */
 
 -     /* SHOULD BE KEPT!!! */
 
 -     MF_SystemClock_Config();
 
 -     
 
 -     /* Initialize all configured peripherals */
 
 -     /* SHOULD BE KEPT!!! */
 
 -     MF_Config_Init();
 
  
-         IWDT_Init();//看门狗    
 
 -     UserInit();
 
 -         RemoteBootloadInter=0;        
 
 -         BootLoading = 0;
 
 -         JumpCount = 0;
 
 -         
 
 -         Init_CRC_CRC16CCITT();
 
 - #ifdef BOOTLOAD_REMOTE_BACKUP_MODE //远程备份模式        
 
 -         if(BOOTLOAD_file()==0)// 查看是否有需要bootload的文件
 
 -         {
 
 -                 IWDT_Clr();
 
 -                 /* 跳转到应用程序位置 */
 
 -                 JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS_OFFSET + 4);
 
 -                 __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS_OFFSET);
 
 -                 (*( void (*)( ) )JumpAddress) ();        
 
 -         }
 
 - #endif
 
  
- #ifdef BOOTLOAD_REMOTE_NOBACKUP_MODE  //远程不备份模式                
 
 -         if((*(unsigned long *)BOOTLOAD_CONFIG_START_ADDRESS) == 0x12345678)
 
 -         {
 
 -                 RemoteBootloadInter=0x55;//进入远程不备份模式
 
 -         }
 
 - #endif        
 
 -         
 
 -         Uartx_Init( UART0 );
 
 -         Uartx_Init( UART1 );
 
 -     Uartx_Init( UART4 );
 
 -         
 
 -         Init_lptim();
 
 -         
 
 -         __enable_irq();        //打开全局中断使能
 
 -         
 
 -     while(1)
 
 -     {     
 
 -                 IWDT_Clr();             //清系统看门狗        
 
 -                 
 
 -         if(Uart[CHHW].Flag&B0000_0100)
 
 -                 {
 
 -                         Uart_Proc(CHHW);        
 
 -                         IWDT_Clr();
 
 -                 }
 
 -         
 
 -                 if(Uart[CH485].Flag&B0000_0100)
 
 -                 {
 
 -                         Uart_Proc(CH485);        
 
 -                         IWDT_Clr();
 
 -                 }
 
  
-                 if(Uart[CHZB].Flag&B0000_0100)
 
 -                 {
 
 -                         Uart_Proc(CHZB);        
 
 -                         IWDT_Clr();
 
 -                 }
 
 -         
 
 -                 if( (BootLoading == 0) && (JumpCount >= WAITTIME) && (RemoteBootloadInter == 0) )//是否满足跳转用户程序条件
 
 -                 {
 
 -                         DeinitSystem();//关闭外设
 
 -                         
 
 -                         /* 跳转到应用程序位置 */
 
 -                         JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS_OFFSET + 4);
 
 -                         __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS_OFFSET);
 
 -                         (*( void (*)( ) )JumpAddress) ();
 
 -                 }
 
 -     }
 
 - }
 
 
  
 
 
这块开发板的下载口有SWIO、SWCLK等,虽然类似ST SWD下载口,但是使用了多款ST LINK都无法下载,最后找到一块多功能下载器才搞定: 
 
 
 
 
 
四、下载APP: 
FM33LG0X开发板有配套的bootload上位机,我们使用一个USB转串口工具即可升级APP: 
 
 
 
 
至此FM33LG0X的bootload已经成功升级APP! 
最后,感谢二姨家举办的抽奖活动!!! 
 
 
 
  |