QuakeGod
2024-07-27 842bb64195f958b050867c50db66fc0aa413dafb
提交 | 用户 | age
8b51c7 1
Q 2 /**
3   ******************************************************************************
4   * @file           : main.c
5   * @brief          : Main program body
6   ******************************************************************************
7   ** This notice applies to any and all portions of this file
8   * that are not between comment pairs USER CODE BEGIN and
9   * USER CODE END. Other portions of this file, whether 
10   * inserted by the user or by software development tools
11   * are owned by their respective copyright owners.
12   *
13   * COPYRIGHT(c) 2018 STMicroelectronics
14   *
15   * Redistribution and use in source and binary forms, with or without modification,
16   * are permitted provided that the following conditions are met:
17   *   1. Redistributions of source code must retain the above copyright notice,
18   *      this list of conditions and the following disclaimer.
19   *   2. Redistributions in binary form must reproduce the above copyright notice,
20   *      this list of conditions and the following disclaimer in the documentation
21   *      and/or other materials provided with the distribution.
22   *   3. Neither the name of STMicroelectronics nor the names of its contributors
23   *      may be used to endorse or promote products derived from this software
24   *      without specific prior written permission.
25   *
26   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
30   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
34   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36   *
37   ******************************************************************************
38   */
39 /* Includes ------------------------------------------------------------------*/
40 #include "main.h"
41 #include "stm32f0xx_hal.h"
42
43 /* USER CODE BEGIN Includes */
44 #include "Globaldef.h"
45 #include "debug.h"
46 #include "Functions.h"
47 #include "string.h"
48 #include "BSP.h"
842bb6 49 #include "stm32f0xx_ll_flash.h"
8b51c7 50
Q 51 /* USER CODE END Includes */
52
53 /* Private variables ---------------------------------------------------------*/
54
55 /* USER CODE BEGIN PV */
56 /* Private variables ---------------------------------------------------------*/
57
58 unsigned char SlowFlicker=0;
59 unsigned char FastFlicker=0;
60
61
62 uint32_t us1,us2,us3,us4,us5,us6;
63
64 /* USER CODE END PV */
65
66 /* Private function prototypes -----------------------------------------------*/
67
68
69 /* USER CODE BEGIN PFP */
70 /* Private function prototypes -----------------------------------------------*/
71
72 /* USER CODE END PFP */
73
74 /* USER CODE BEGIN 0 */
5dd1b7 75 /* Table of CRC values for high-order byte */
Q 76 const uint8_t crctablehi[] = {
77     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
78     0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
79     0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
80     0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
81     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
82     0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
83     0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
84     0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
85     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
86     0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
87     0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
88     0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
89     0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
90     0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
91     0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
92     0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
93     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
94     0x40
95 };
96 /* Table of CRC values for low-order byte */
97 const uint8_t crctablelo[] = {
98     0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
99     0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
100     0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
101     0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
102     0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
103     0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
104     0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
105     0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
106     0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
107     0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
108     0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
109     0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
110     0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
111     0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
112     0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
113     0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
114     0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
115     0x40
116 };
117  
118 uint16_t crc16table(const uint8_t *ptr, uint16_t len)
119 {
120     uint8_t crchi = 0xff;
121     uint8_t crclo = 0xff; 
122     uint16_t index;
123     while (len--) 
124     {
125         index = crclo ^ *ptr++; 
126         crclo = crchi ^ crctablehi[index];
127         crchi = crctablelo[index];
128     }
129     return (crchi << 8 | crclo);
130 }
8b51c7 131
Q 132 void HAL_SYSTICK_Callback(void)
133 {
134 static int Count=0;
135     Count++;
136     if (Count>=10000) 
137     {
138         Count=0; 
139     }
140
141     return;
142 }
143
144 #define  ApplicationAddress  0x08001000  //应用程序首地址定义
842bb6 145 #define  NEW_APP_INFOBLOCK_ADDR 0x08020000                // 存储的新应用程序信息块的地址
Q 146 #define  NEW_APP_ADDR 0x08021000                // 存储的新应用程序的地址
5dd1b7 147 //#define  FLASH_PAGESIZE (0x00000400)                        //Page Size = 1K
8b51c7 148
Q 149
150 typedef struct tagNewAppInfoBlock
151 {
152     unsigned short Sign;
153     unsigned short Version;
154     unsigned int Length;
155     unsigned int nCRC;
156     
157 }stNewAppInfoBlock,*pNewAppInfoBlock;
158
159
160 typedef void (*pFunction)(void);     //定义跳转函数指针类型
161
162 /*跳转到应用程序处理函数*/
163 static void JumpToApplication(void)
164 {
5dd1b7 165   uint32_t AppStackAddr;           //应用程序栈地址
Q 166   uint32_t AppResetVector;         //应用程序中断向量表的地址
8b51c7 167  
Q 168   pFunction JumpToApp;          //定义跳转函数指针
169  
170   __set_PRIMASK(1);    //关闭全局中断
171  
5dd1b7 172   AppStackAddr = *(__IO uint32_t*)ApplicationAddress;              //0x08001000;
Q 173   AppResetVector = *(__IO uint32_t*)(ApplicationAddress + 4);      //0x08001004;
8b51c7 174  
5dd1b7 175   if((AppStackAddr&0x2FFC0000)==0x20000000)        //检查栈顶地址是否合法.
8b51c7 176   {
Q 177         __disable_irq();
178         memcpy((void *)0x20000000,(void *)ApplicationAddress,0xc0);
179         
5dd1b7 180         __set_MSP(AppStackAddr);                       //初始化应用程序栈指针
8b51c7 181         LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_SYSCFG);
Q 182         LL_SYSCFG_SetRemapMemory(LL_SYSCFG_REMAP_SRAM);
183 //        SYSCFG
5dd1b7 184     JumpToApp = (pFunction)AppResetVector;           
8b51c7 185     JumpToApp();
Q 186   }
187 }
188
189 int EraseFlashMem(void * pAddrFlash, unsigned int Pages)
190 {
842bb6 191     ErrorStatus res;
Q 192     res = LL_Flash_Unlock();
193 //    uint32_t ErrNo;    
194     res = LL_Flash_PageErase(pAddrFlash,Pages);
195     LL_FLASH_Lock(FLASH);
8b51c7 196     return res;
Q 197 }
198
199 int EraseAndWriteToFlashMem(void * pBuf, void * pAddrFlash, unsigned int nByteSize)
200 {
201     
842bb6 202     ErrorStatus res;
Q 203     res = LL_Flash_Unlock();
204 //    __disable_irq();
205     int NbPages = (nByteSize-1) / FLASH_PAGE_SIZE + 1;
206 //    FLASH_EraseInitTypeDef erase1;
207 //    erase1.NbPages=(nByteSize-1) / FLASH_PAGE_SIZE + 1;;
208 //    erase1.PageAddress=(unsigned int)pAddrFlash;
209 //    erase1.TypeErase=FLASH_TYPEERASE_PAGES;
210     res = LL_Flash_PageErase(pAddrFlash,NbPages);
5dd1b7 211     for (int i=0;i<(nByteSize+1)/2;i++)
8b51c7 212     {
842bb6 213         unsigned short value = ((uint8_t *)pBuf)[i*2] + (((uint8_t *)pBuf)[i*2 +1] << 8);
Q 214         res = LL_FLASH_Program(ProgaraType_DATA16, (uint32_t)pAddrFlash + i*2, value);
215         if (res == ERROR) break;        
8b51c7 216     }
Q 217
842bb6 218 //    __enable_irq();
Q 219     LL_FLASH_Lock(FLASH);
8b51c7 220     
Q 221     return res;
222 }
223
224 /* USER CODE END 0 */
225
226 /**
227   * @brief  The application entry point.
228   *
229   * @retval None
230   */
231 int main(void)
232 {
233   /* USER CODE BEGIN 1 */
234
235 //    InitUartstat(&Uart1Stat,Uart1RxBuf,sizeof(Uart1RxBuf),Uart1TxBuf,sizeof(Uart1TxBuf));
236 //    InitUartstat(&Uart2Stat,Uart2RxBuf,sizeof(Uart2RxBuf),Uart2TxBuf,sizeof(Uart2TxBuf));
237   /* USER CODE END 1 */
238
239   /* MCU Configuration----------------------------------------------------------*/
240
241   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
242 //  HAL_Init();
243
244   /* USER CODE BEGIN Init */
245     
246   /* USER CODE END Init */
247
248   /* Configure the system clock */
249
250   /* USER CODE BEGIN SysInit */
251  // HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/TickFreq);    //重新定义SysTick的频率
252  LL_Init1msTick(8000000);
253     MX_GPIO_Init();
254     
255   /* USER CODE END SysInit */
256
257     
258   /* USER CODE BEGIN 2 */
259
260     //LL_USART_EnableIT_TXE(USART1);
261   /* USER CODE END 2 */
262
263   /* Infinite loop */
264   /* USER CODE BEGIN WHILE */
265
266     SetRunLed(1);                //Turn On Run Led
267     SetErrLed(0);                //Turn Off Err Led
268 // check for app update
269 ///*
842bb6 270     int FlashSize = *(unsigned short *)FLASHSIZE_BASE;
Q 271     int NewAppAddress ;
272     int NewAppInfoBlockAddress ;
273     if (FlashSize == 64) {
274         NewAppInfoBlockAddress = 0x08008000;    
275         NewAppAddress = 0x08009000U;
276     }else if (FlashSize == 256) {
277         NewAppInfoBlockAddress = 0x08020000;        
278         NewAppAddress = 0x08021000U;
279     }
280
8b51c7 281     pNewAppInfoBlock ptheNewAppInfoBlock = (pNewAppInfoBlock) NewAppInfoBlockAddress;
Q 282     if (ptheNewAppInfoBlock->Sign == 0x55AA)
283     {
284         //check length and CRC;
285         int length = ptheNewAppInfoBlock->Length;
842bb6 286         int nCRC;    // = crc16table((uint8_t *)NewAppAddress,length);
Q 287                 nCRC = crc16bitbybit((uint8_t *)NewAppAddress,length);
5dd1b7 288         if (nCRC == ptheNewAppInfoBlock->nCRC) 
8b51c7 289         {
Q 290             // copy program
5dd1b7 291             EraseAndWriteToFlashMem((void *)NewAppAddress,(void*)ApplicationAddress,length);
8b51c7 292             
Q 293             // verify copyed program
294             //int nCRC2 = CalCRC((void *)NewAppAddress,length);
295             
296             
297             //erease infoBlock
298             EraseFlashMem((void *)NewAppInfoBlockAddress,1);
299         }
300     }
301 // */     
302 int nCount=0;
303   while (1)
304   {
305
306         SlowFlicker=0;
307         FastFlicker=1;        
308         us1=GetuS();
309         LL_mDelay(100);
310         
311 //        ToggleRunLed();
312         ToggleErrLed();
313         ToggleErr2Led();
314         
315 //     LL_IWDG_ReloadCounter(IWDG);
316         nCount++;
317         if (nCount>2) {JumpToApplication(); LL_mDelay(1000);}
318         
319   }    //while (1) ;
320   /* USER CODE END WHILE */
321
322   /* USER CODE BEGIN 3 */
323
324   /* USER CODE END 3 */
325 }
326 /* USER CODE BEGIN 4 */
327
328 /* USER CODE END 4 */
329
330 /**
331   * @brief  This function is executed in case of error occurrence.
332   * @param  file: The file name as string.
333   * @param  line: The line in file as a number.
334   * @retval None
335   */
336 void _Error_Handler(char *file, int line)
337 {
338   /* USER CODE BEGIN Error_Handler_Debug */
339   /* User can add his own implementation to report the HAL error return state */
340   while(1)
341   {
342   }
343   /* USER CODE END Error_Handler_Debug */
344 }
345
346 #ifdef  USE_FULL_ASSERT
347 /**
348   * @brief  Reports the name of the source file and the source line number
349   *         where the assert_param error has occurred.
350   * @param  file: pointer to the source file name
351   * @param  line: assert_param error line source number
352   * @retval None
353   */
354 void assert_failed(uint8_t* file, uint32_t line)
355
356   /* USER CODE BEGIN 6 */
357   /* User can add his own implementation to report the file name and line number,
358      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
359   /* USER CODE END 6 */
360 }
361 #endif /* USE_FULL_ASSERT */
362
363 /**
364   * @}
365   */
366
367 /**
368   * @}
369   */
370
371 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/