1 /* Includes ------------------------------------------------------------------*/
  2 #include "main.h"
  3 #include "declare.h"
  4 #include "user_flash.h"
  5 #include "uart.h"
  6 
  7 u16 g_MsCnt;
  8 u32 g_Ms;
  9 u32 tick_us = 64;     // 1 us tick count,根据SysTick时钟源设定
 10 u8 databuf[FMC_PAGE_SIZE]={0};
 11 
 12 
 13 /*SysTick 是24位递减定时器,当递减至0时产生中断,同时加载Reload值重新递减*/
 14 void Sys_HardDelayUs(u32 us)//us< 1000
 15 {
 16     u32 old_tick;
 17     u32 delta_tick;
 18     if(us>900)return;
 19     old_tick = SysTick->VAL;
 20     while(1)
 21     {
 22         if(SysTick->VAL <= old_tick)
 23         {
 24             delta_tick = old_tick - SysTick->VAL;
 25         }
 26         else
 27         {
 28             delta_tick = SysTick->LOAD - (SysTick->VAL-old_tick);
 29         }
 30 
 31         if(delta_tick >=(tick_us*us))break;
 32     }
 33 }
 34 
 35 
 36 /* USER CODE END PFP */
 37 
 38 /* Private user code ---------------------------------------------------------*/
 39 /* USER CODE BEGIN 0 */
 40 
 41 u8 crc_caculate(u8 *pdata,u16 len)
 42 {
 43     u8 crc = 0;
 44     while(len)
 45     {
 46         crc += (*pdata);
 47         pdata++;
 48         len--;
 49     }
 50     return crc;
 51 }
 52 
 53 void print_hex(const char*p,u8 *pdata,u16 len)
 54 {
 55 #if 1
 56 
 57     SYSTEM_DEBUG("%s len=%d:",p,len);
 58     while(len)
 59     {
 60         printf("%02x ",*pdata);
 61         pdata++;
 62         len--;
 63     }
 64     printf("\r\n");
 65 
 66 #endif
 67 }
 68 
 69 CONFIG_t system_config;
 70 
 71 void App_Config_Save(void)
 72 {
 73     system_config.crc = crc_caculate((u8*)&system_config,sizeof(system_config)-1);
 74     User_Flash_Write(USER_FLASH_CONFIG_ADDR,(u8*)&system_config,sizeof(system_config));
 75     //print_hex(__FUNCTION__,(u8*)&system_config,sizeof(system_config));
 76 }
 77 
 78 void App_Config_Read(void)
 79 {
 80     u8 crc=0;
 81     User_Flash_Read(USER_FLASH_CONFIG_ADDR,(u8*)&system_config,sizeof(system_config));
 82     crc = crc_caculate((u8*)&system_config,sizeof(system_config)-1);
 83     if(crc != system_config.crc)
 84     {
 85         SYSTEM_DEBUG("Error! system_config.crc=%x , crc=%x %d\r\n",system_config.crc,crc,sizeof(system_config));
 86         system_config.crc = crc_caculate((u8*)&system_config,sizeof(system_config)-1);
 87         User_Flash_Write(USER_FLASH_CONFIG_ADDR,(u8*)&system_config,sizeof(system_config));
 88     }
 89     //print_hex(__FUNCTION__,(u8*)&system_config,sizeof(system_config));
 90 }
 91 typedef  void (*pFunction)(void);
 92 u32 JumpAddress;
 93 pFunction JumpToApplication;
 94 
 95 void JumpToApp(u32 address)
 96 {
 97     u32 result=0;
 98     u32 address_value=0;
 99     address_value = (*(__IO u32*)(address));
100     result = (((*(__IO u32*)address) & 0x2FFE0000 ));
101     //SYSTEM_DEBUG("*address = %#X,result = %#X\n",address_value,result);
102     //return;
103     if(result==0x20000000)
104     {
105         SYSTEM_DEBUG("start jump to app(0x%0x)....\r\n",address);
106         /* Jump to user application */
107         //debug("jump to application\r\n");
108         JumpAddress = *(__IO u32*) (address + 4);
109 
110         /* Initialize user application's Stack Pointer */
111         __set_MSP(*(__IO u32*) address);
112         JumpToApplication = (pFunction) JumpAddress;
113         JumpToApplication();
114     }
115 }
116 
117 #define CONFIG_CRC32_POLY           0x04C11DB7
118 #define CONFIG_CRC32_INIT_VALUE     0xFFFFFFFF
119 #define CONFIG_CRC32_OUT_XOR        0x00000000
120 #define CONFIG_CRC32_REFLECTION_IN  0
121 #define CONFIG_CRC32_REFLECTION_OUT 0
122 
123 u32 crc32_customized(u32 crc_poly,u32 crc_init_value,u32 out_xor_value,u8 *source,u32 length)
124 {
125     u32 crc_value = crc_init_value;
126 
127     for (int i =0; i < length; i++)
128     {
129         for (int j = 0; j < 8; j++)
130         {
131             u8 get_bit_value = ((source[i] >> (7 - j) & 1) == 1);
132             u8 get_value = ((crc_value >> 31 & 1) == 1);
133 
134             crc_value <<= 1;
135 
136             if (get_value ^ get_bit_value)
137             {
138                 crc_value ^= crc_poly;
139             }
140         }
141     }
142 
143     crc_value &= 0xFFFFFFFF;
144 
145     return (crc_value ^= out_xor_value);
146 }
147 
148 u32 soft_crc32(u8* buf,u32 len)
149 {
150     return crc32_customized(CONFIG_CRC32_POLY,CONFIG_CRC32_INIT_VALUE,CONFIG_CRC32_OUT_XOR,buf,len);
151 }
152 void copyflash(void)
153 {
154     u32 crc32=0;
155     u32 len=0;
156     u8 page_num=0;
157     u8 j=0;
158     App_Config_Read();
159     if(system_config.ota.have_new!=1)
160     {
161         SYSTEM_DEBUG("no new firmware!\r\n ");
162         if(system_config.ota.crc_result != CRC_NoNeed)
163         {
164             system_config.ota.crc_result = CRC_NoNeed;
165             App_Config_Save();
166         }
167         return;
168     }
169 
170     crc32 = soft_crc32((u8*)APP_BACK_ADDR_START,system_config.ota.newFirmware_size);
171 
172     SYSTEM_DEBUG("crc  failed newFirmware_crc=%#X ,crc32=%#X ,size=%d\r\n ",system_config.ota.newFirmware_crc,crc32,system_config.ota.newFirmware_size);
173     system_config.ota.have_new = 0;
174     if(system_config.ota.newFirmware_crc == crc32)
175     {
176         len = system_config.ota.newFirmware_size;
177         while(len>0)
178         {
179             if(len>=FMC_PAGE_SIZE)
180             {
181                 User_Flash_Read(APP_BACK_ADDR_START + FMC_PAGE_SIZE*page_num , databuf , FMC_PAGE_SIZE);
182                 User_Flash_Write(APP_ENTRY_ADDRESS + FMC_PAGE_SIZE*page_num , databuf , FMC_PAGE_SIZE);
183                 page_num++;
184                 len -= FMC_PAGE_SIZE;
185             }
186             else
187             {
188                 User_Flash_Read(APP_BACK_ADDR_START + FMC_PAGE_SIZE*page_num , databuf , len);
189                 j=len%8;
190                 if(j==0)j=8;
191                 memset(databuf+len,0xFF,8-j);
192                 User_Flash_Write(APP_ENTRY_ADDRESS + FMC_PAGE_SIZE*page_num , databuf , len+8-j);
193                 len= 0;
194             }
195         }
196         SYSTEM_DEBUG("update new firmware  scucess \r\n ");
197         system_config.ota.crc_result = CRC_SCUCESS;
198     }
199     else
200     {
201         SYSTEM_DEBUG("crc  failed newFirmware_crc=%#X ,crc32=%#X ,size=%d\r\n ",system_config.ota.newFirmware_crc,crc32,system_config.ota.newFirmware_size);
202         system_config.ota.crc_result = CRC_FAIL;
203     }
204     App_Config_Save();
205     return ;
206 
207 }
208 
209 int main(void)
210 {
211     u8 i=0;
212     u32 WRPR_Value;
213     #ifdef SYSTEM_DEBUG_EN
214     USART1_Init();
215     #endif
216     //RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_CRC, ENABLE);
217     //WRPR_Value = FLASH_GetWriteProtectionOB();
218     SYSTEM_DEBUG("$$ bootloader for <GD32 Chip> Sxx $$\r\n");
219     //SYSTEM_DEBUG("FLASH->WRP=%08X Read_L1=%d,Read_L2=%d,OBT->USER_RDP=%#x\n",WRPR_Value,FLASH_GetReadOutProtectionSTS(),FLASH_GetReadOutProtectionL2STS(),OBT->USER_RDP);
220     //User_Write_Protect(0);
221     copyflash();
222     JumpToApp(APP_ENTRY_ADDRESS);
223 
224     /**************if run to here,it is abnormal!!****************/
225     //SYSTEM_DEBUG("Bootloader jump failure!  \r\n");
226 
227     while(1)
228     {
229     }
230 
231 }
232 
233 
234 
235 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

原文地址:http://www.cnblogs.com/ycpkbql/p/16883734.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性