#include "main.h" #include "common.h" uc8 APBAHBPrescTable[16] = { 0u, 0u, 0u, 0u, 1u, 2u, 3u, 4u, 1u, 2u, 3u, 4u, 6u, 7u, 8u, 9u }; // idb uc8 ADCPrescTable[4] = { 2u, 4u, 6u, 8u }; // idb int EraseCounter = -1; vu32 NbrOfPage = 128; volatile FLASH_Status FLASHStatus = FLASH_COMPLETE; volatile TestStatus MemoryProgramStatus = PASSED; ErrorStatus HSEStartUpStatus = SUCCESS; extern FLASH_INFO Flash_Info; extern uchar SvsStack[]; void RCC_Configuration() { FlagStatus bitstatus = RESET; // r0 RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON);//0x10000u); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if ( HSEStartUpStatus == SUCCESS ) { RCC_HCLKConfig(RCC_SYSCLK_Div1); //0 RCC_PCLK2Config(RCC_HCLK_Div1); //0 RCC_PCLK1Config(RCC_HCLK_Div2 ); //0x400u FLASH_SetLatency(FLASH_Latency_2);//2u); FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//0x10u); RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//(0x10000u, 0x1C0000u); RCC_PLLCmd(ENABLE); do { bitstatus = RCC_GetFlagStatus(RCC_FLAG_PLLRDY);//0x39u); } while ( !bitstatus ); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//2u); while ( RCC_GetSYSCLKSource() !=RCC_IT_HSERDY) // 8 ) ; } } void NVIC_Configuration(void) { NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);//0x8000000u, 0); } void Flash_Init(void) { FLASHStatus = FLASH_COMPLETE; MemoryProgramStatus = PASSED; RCC_Configuration(); NVIC_Configuration(); FLASH_Unlock(); NbrOfPage = 128; FLASH_ClearFlag(0x35u); } void Program(void) { u32 TargetAddr; // r4 u16 *Buf; // r5 u32 i; // r6 TargetAddr = Flash_Info.TargetAddr; Buf = (u16 *)Flash_Info.Buf; for ( i = 0; Flash_Info.Length > i; i += 2 ) { FLASHStatus = FLASH_ProgramHalfWord(TargetAddr, *Buf); TargetAddr += 2; ++Buf; } Flash_Info.Result = 1; Flash_Info.Result = Verification(Flash_Info.TargetAddr, Flash_Info.Length, (ulong)Flash_Info.Buf); } void EraseAll(void) { for ( EraseCounter = 0; EraseCounter < NbrOfPage && FLASHStatus == FLASH_COMPLETE; ++EraseCounter ) FLASHStatus = FLASH_ErasePage((EraseCounter << 10) + BASE_ADDRESS); Flash_Info.Result = 1; } void EraseSector(void) { vu32 i; // r4 int v1; // r0 Flash_Info.Result = 0; for ( i = 0; NbrOfPage - 1 > i && ((i + 1) << 10) + BASE_ADDRESS <= Flash_Info.TargetAddr; ++i ) ; while ( NbrOfPage - 1 > i && FLASHStatus == FLASH_COMPLETE && Flash_Info.TargetAddr + Flash_Info.Length > (i << 10) + BASE_ADDRESS ) { v1 = FLASH_ErasePage((i << 10) + BASE_ADDRESS); FLASHStatus = (FLASH_Status)v1; if ( !v1 ) return; ++i; } Flash_Info.Result = 1; Flash_Info.Result = BlankCheck(Flash_Info.TargetAddr, Flash_Info.Length); } void ReadChipID(void) { Flash_Info.Result = 1; } extern int BlankCheck(ulong targetAddr,ulong targetSize); extern int Verification(ulong targetAddr, ulong limit, ulong srcAddr); extern int OneSectorErase(ulong targetAddr); //----- (2000020E) -------------------------------------------------------- int BlankCheck(ulong targetAddr, ulong targetSize) { unsigned int i; // r3 int v4; // r0 for ( i = 0; i < targetSize; i += 4 ) { v4 = *(ulong *)targetAddr; targetAddr += 4; if ( v4 != -1 ) return 0; } return 1; } //----- (2000022E) -------------------------------------------------------- int Verification(ulong targetAddr,ulong limit, ulong srcAddr) { unsigned int i; // r6 int v6; // r0 int v7; // r7 for ( i = 0; i < limit; i += 4 ) { v6 = *(ulong *)targetAddr; targetAddr += 4; v7 = *(ulong *)srcAddr; srcAddr += 4; if ( v6 != v7 ) return 0; } return 1; }