flash.c
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:14k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : flash.c
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 07/28/2003
  5. * Description        : This file provides all the Flash software functions
  6. ********************************************************************************
  7. * History:
  8. *  01/01/2004 : V1.2
  9. *  14/07/2004 : V1.3
  10. *******************************************************************************/
  11. #include "flash.h"
  12. /*******************************************************************************
  13. * Function Name  : FLASH_Init
  14. * Description    : Initialise the Flash
  15. * Input          : None
  16. * Return         : None
  17. *******************************************************************************/
  18. void FLASH_Init(void)
  19. {
  20. // Reset Flash Control Registers
  21.   FLASHR->CR0 = 0x00000000;
  22.   FLASHR->CR1 = 0x00000000;
  23. // Reset Flash Data Registers
  24.   FLASHR->DR0 = 0xFFFFFFFF;
  25.   FLASHR->DR1 = 0xFFFFFFFF;
  26. // Reset Flash Error Register
  27.   FLASHR->ER  = 0x00000000;
  28. }
  29. /*******************************************************************************
  30. * Function Name  : FLASH_WordWrite
  31. * Description    : Writes a Word to the Flash
  32. * Input 1        : Address of the Destination
  33. * Input 2        : Word To program
  34. * Return         : None
  35. *******************************************************************************/
  36. void FLASH_WordWrite(u32 XtargetAdd, u32 Xdata)
  37. {
  38.   WaitForLastTask(FLASH_BANK0);
  39.   WaitForLastTask(FLASH_BANK1);
  40.   // set the Word Programming bit 'WPG' in the CR0 Reg
  41.   FLASHR->CR0 |= FLASH_WPG_Mask;
  42.   // Load the destination address in AR
  43.   FLASHR->AR   = XtargetAdd;
  44.   // Load DATA to be programmed in DR0
  45.   FLASHR->DR0  = Xdata;
  46.   // Set the Write Mode Start bit 'WMS' in the CR0 Reg to Start Write Operation
  47.   FLASHR->CR0 |= FLASH_WMS_Mask;
  48. }
  49. /*******************************************************************************
  50. * Function Name  : FLASH_DWordWrite
  51. * Description    : Writes Double Word to the Flash
  52. * Input 1        : Address of the Destination
  53. * Input 2        : Word 1 To program
  54. * Input 3        : Word 2 To program
  55. * Return         : None
  56. *******************************************************************************/
  57. void FLASH_DWordWrite(u32 XtargetAdd, u32 Xdata0, u32 Xdata1)
  58. {
  59.   WaitForLastTask(FLASH_BANK0);
  60.   WaitForLastTask(FLASH_BANK1);
  61.   // set the Double Word Programming bit 'DWPG' in the CR0 Reg
  62.   FLASHR->CR0 |= FLASH_DWPG_Mask;
  63.   // Load the destination address in AR
  64.   FLASHR->AR   = XtargetAdd;
  65.   // Load DATA0 in DR0 Reg
  66.   FLASHR->DR0  = Xdata0;
  67.   // Load DATA1 in DR1 Reg
  68.   FLASHR->DR1  = Xdata1;
  69.   // Set the Write Mode Start bit 'WMS' in the CR0 Reg to Start Write Operation
  70.   FLASHR->CR0 |= FLASH_WMS_Mask;
  71. }
  72. /*******************************************************************************
  73. * Function Name  : FLASH_WriteBlock
  74. * Description    : Writes Data To the Flash
  75. * Input 1        : Address of the Data source
  76. * Input 2        : Address of the Destination
  77. * Input 3        : Nbr of words to be stored
  78. * Return         : None
  79. *******************************************************************************/
  80. void FLASH_BlockWrite(u32 XsourceAdd, u32 XtargetAdd, u32 XdataLength)
  81. {
  82.   u32 TmpAddrS, TmpAddrD;
  83.   u32 NbrW, NbrDW;
  84.   u32 TmpData0, TmpData1;
  85.   // Get The Source Address
  86.   TmpAddrS = XsourceAdd;
  87.   // Get The Destination Address
  88.   TmpAddrD = XtargetAdd;
  89.   // Get Number of Double Words
  90.   NbrDW    = XdataLength >> 1;
  91.   // Get Number of single Words
  92.   NbrW     = XdataLength & 0x00000001;
  93.   // Programming Double Words
  94.   while (NbrDW > 0)
  95.   {
  96.     // Get The First 32 bits
  97.     TmpData0 = *(u32 *)TmpAddrS;
  98.     // Increment The Source Address
  99.     TmpAddrS += 4;
  100.     // Get The Second 32 bits
  101.     TmpData1 = *(u32 *)TmpAddrS;
  102.     // Increment The Source Address
  103.     TmpAddrS += 4;
  104.     // Use The FLASH_DWordWrite function to program the 64 bits
  105.     FLASH_DWordWrite(TmpAddrD, TmpData0, TmpData1);
  106.     // Decrease number of Double word
  107.     NbrDW--;
  108.     // Increment The destination Address
  109.     TmpAddrD += 8;
  110.     // Waits for the data to be programmed
  111.     FLASH_Delay();
  112.   }
  113.   if (NbrW > 0)
  114.   {
  115.     // Get The First 32 bits
  116.     TmpData1 = *(u32 *)TmpAddrS;
  117.     // Use The FLASH_WordWrite function to program the 32 bits
  118.     FLASH_WordWrite(TmpAddrD, TmpData1);
  119.     // Waits for the data to be programmed
  120.     FLASH_Delay();
  121.   }
  122. }
  123. /*******************************************************************************
  124. * Function Name  : FLASH_EraseSector
  125. * Description    : Erases a Flash sector
  126. * Input 1        : Sectors to be Erased
  127. * Return         : None
  128. *******************************************************************************/
  129. void FLASH_SectorErase(u32 Xsectors)
  130. {
  131.   WaitForLastTask(FLASH_BANK0);
  132.   WaitForLastTask(FLASH_BANK1);
  133.   // Set the Sector Erase flag 'SER' in the FCRO reg
  134.   FLASHR->CR0 |= FLASH_SER_Mask;
  135.   // Select the Sectors to be erased in the CR1 register
  136.   FLASHR->CR1 |= Xsectors;
  137.   // Set the Write Mode Start bit 'WMS' in the CR0 Reg to Start Erase Operation
  138.   FLASHR->CR0 |= FLASH_WMS_Mask;
  139. }
  140. /*******************************************************************************
  141. * Function Name  : FLASH_EraseModule
  142. * Description    : Erases a flash module
  143. * Input          : None
  144. * Return         : None
  145. *******************************************************************************/
  146. void FLASH_ModuleErase(void)
  147. {
  148.   WaitForLastTask(FLASH_BANK0);
  149.   FLASH_BankErase(FLASH_BANK0);
  150.   WaitForLastTask(FLASH_BANK1);
  151.   FLASH_BankErase(FLASH_BANK1);
  152.   // waits for the end of the write operation on both banks
  153.   WaitForLastTask(FLASH_BANK0);
  154.   WaitForLastTask(FLASH_BANK1);
  155. }
  156. /*******************************************************************************
  157. * Function Name  : FLASH_Delay
  158. * Description    : Add the delay required for the Flash Write & Erase operation
  159. * Input 1        : None
  160. * Return         : None
  161. *******************************************************************************/
  162. void FLASH_Delay(void)
  163. {
  164.   u8 Xdelay;
  165.   for(Xdelay = 0; Xdelay < 0xFE; Xdelay ++);
  166. }
  167. /*******************************************************************************
  168. * Function Name  : FLASH_Suspend
  169. * Description    : Suspends the current program or erase operation
  170. * Input 1        : None
  171. * Return         : None
  172. *******************************************************************************/
  173. void FLASH_Suspend(void)
  174. {
  175.   // Set The suspend Bit 'SUSP' in the CR0 register
  176.   FLASHR->CR0 |= FLASH_SUSP_Mask;
  177. }
  178. /*******************************************************************************
  179. * Function Name  : FLASH_Resume
  180. * Description    : Resume a Suspended program or erase operation
  181. * Input 1        : None
  182. * Return         : None
  183. *******************************************************************************/
  184. void FLASH_Resume(void)
  185. {
  186.   // Reset The suspend Bit 'SUSP' in the FRC0 register
  187.   FLASHR->CR0 &= ~FLASH_SUSP_Mask;
  188.   // Set write mode bit
  189.   FLASHR->CR0  |= FLASH_WMS_Mask;
  190. }
  191. /*******************************************************************************
  192. * Function Name  : FLASH_ReadWord
  193. * Description    : Read a single word of the flash
  194. * Input 1        : Source Address
  195. * Return         : Word
  196. *******************************************************************************/
  197. u32 FLASH_WordRead(u32 SourceAdd)
  198. {
  199.   WaitForLastTask(FLASH_BANK0);
  200.   WaitForLastTask(FLASH_BANK1);
  201.   // Waits for the flash to be unlocked
  202.   while((FLASH_FlagStatus(FLASH_LOCK))== SET);
  203.   // Reads the data from the specified Address
  204.   return *(u32 *)(SourceAdd + 0x40000000);
  205. }
  206. /*******************************************************************************
  207. * Function Name  : FLASH_ReadBlock -> Block Read
  208. * Description    : Block Read from the flash
  209. * Input 1        : Destination Address where the Data will be Stored
  210. * Input 2        : Data Source Address
  211. * Input 3        : Nbr of word to be Read
  212. * Return         : Word
  213. *******************************************************************************/
  214. void FLASH_BlockRead(u32 DestAdd, u32 SourceAdd, u32 NbrData)
  215. {
  216.   u32 TmpaddrD,TmpaddrS,TmpNbrData;
  217.   // Number of data to be Read from the Flash
  218.   TmpNbrData = NbrData;
  219.   // Source Address
  220.   TmpaddrS = SourceAdd;
  221.   // Destination Address
  222.   TmpaddrD = DestAdd;
  223.   WaitForLastTask(FLASH_BANK0);
  224.   WaitForLastTask(FLASH_BANK1);
  225.   while(TmpNbrData > 0)
  226.   {
  227.     *(u32 *)TmpaddrD = FLASH_WordRead(TmpaddrS);
  228.     // Increase the Source Address
  229.     TmpaddrS += 4;
  230.     // Increase the Destination Address
  231.     TmpaddrD += 4;
  232.     // Decrease the Number of data to be read
  233.     TmpNbrData --;
  234.   }
  235. }
  236. /*******************************************************************************
  237. * Function Name  : FLASH_WritePrConfig
  238. * Description    : Configures The Write Protection Bits
  239. * Input 1        : Flash Bank
  240. * Input 2        : Enable Or disable Protection
  241. * Return         : None
  242. *******************************************************************************/
  243. void FLASH_WritePrConfig(u32 Xsectors, FunctionalState NewState)
  244. {
  245.   u32 TmpProtection;
  246.   TmpProtection = FLASHPR->NVWPAR;
  247.   WaitForLastTask(FLASH_BANK0);
  248.   WaitForLastTask(FLASH_BANK1);
  249.   if (NewState == DISABLE) TmpProtection |= Xsectors;
  250.   else TmpProtection &= ~Xsectors;
  251.   // Set the Set protection Bit
  252.   FLASHR->CR0 |= FLASH_SPR_Mask;
  253.   // Set the Register Address
  254.   FLASHR->AR  = 0x4010DFB0;
  255.   // Data To be Programmed to the Protection Register
  256.   FLASHR->DR0  = TmpProtection;
  257.   // Set the WMS bit to Start the Sequence
  258.   FLASHR->CR0 |= FLASH_WMS_Mask;
  259. }
  260. /*******************************************************************************
  261. * Function Name  : FLASH_DebugPrConfig
  262. * Description    : Configures The Debug Protection Bits
  263. * Input 1        : ENABLE or DISABLE
  264. * Return         : Word
  265. *******************************************************************************/
  266. void FLASH_DebugPrConfig(FunctionalState NewState)
  267. {
  268.   u16 TmpPEN, TmpPDS, TmpProtection;
  269.   TmpPEN = (FLASHPR->NVAPR1 & 0xFFFF0000) >> 16;
  270.   TmpPDS = (FLASHPR->NVAPR1 & 0x0000FFFF);
  271.   if (NewState == ENABLE)
  272.   {
  273.     //  If the First Protection Reset the DBGP bit
  274.     if ((FLASHPR->NVAPR0 & 0x2)==0x02) FLASHPR->NVAPR0 &= ~FLASH_DBGP_Mask;
  275.     else FLASHPR->NVAPR1 = ResetBit(FLASHPR->NVAPR1, ProtectionLevel(TmpPEN) + 16);
  276.     //  FLASHPR->NVAPR1 =  TmpPDS |((TmpPEN & ~(1<<ProtectionLevel(TmpPEN)))<< 16);
  277.   }
  278.   else
  279.   {
  280.     //  Test wether the Protection is already Enabled
  281.     if ((FLASHPR->NVAPR0 & 0x2) == 0x0) FLASHPR->NVAPR1 = ResetBit(FLASHPR->NVAPR1, ProtectionLevel(TmpPDS));
  282.     //  FLASHPR->NVAPR1 =(TmpPEN << 16)|(TmpPDS &~(1 << ProtectionLevel(TmpPDS)));
  283.   }
  284.   // Set the Set protection Bit
  285.   FLASHR->CR0 |= FLASH_SPR_Mask;
  286.   // Set the Register Address
  287.   FLASHR->AR  = 0x4010DFB0;
  288.   // Data To be Programmed to the Protection Register
  289.   FLASHR->DR0 = TmpProtection;
  290.   // Set the WMS bit to Start the Sequence
  291.   FLASHR->CR0 |= FLASH_WMS_Mask;
  292. }
  293. /*******************************************************************************
  294. * Function Name  : FLASH_FlagStatus
  295. * Description    : Returns the NewState of Flash flags
  296. * Input 1        : Flash Flag
  297. * Return         : flagstate
  298. *******************************************************************************/
  299. FlagStatus FLASH_FlagStatus(flashflags Xflag)
  300. {
  301.   FlagStatus TmpResult;
  302.   u8 TmpReg, TmpPos;
  303.   // get the Register Index
  304.   TmpReg = (Xflag & FLASH_Reg_Mask) >> 5;
  305.   // get the Flag Index
  306.   TmpPos = (Xflag & FLASH_Flag_Mask);
  307.   switch(TmpReg)
  308.   {
  309.     case 0 : // CR0
  310.     {
  311.       // Returns the status of the CR0[TmpPos] flag
  312.       TmpResult = (FLASHR->CR0 & (1<<TmpPos))==0 ? RESET : SET;
  313.       break;
  314.     }
  315.     case 1 : // CR1
  316.     {
  317.       // Returns the status of the CR1[TmpPos] flag
  318.       TmpResult = (FLASHR->CR1 & (1<<TmpPos))==0 ? RESET : SET;
  319.       break;
  320.     }
  321.     case 5 : // ER
  322.     {
  323.       // Returns the status of the ER[TmpPos] flag
  324.       TmpResult = (FLASHR->ER  & (1<<TmpPos))==0 ? RESET : SET;
  325.       break;
  326.     }
  327.   }
  328.   return(TmpResult);
  329. }
  330. /*******************************************************************************
  331. * Function Name  : FLASH_FlagClear
  332. * Description    : Clears a flash flag
  333. * Input 1        : Flash Flag
  334. * Return         : None
  335. *******************************************************************************/
  336. void FLASH_FlagClear(flashflags Xflag)
  337. {
  338.   u8 TmpReg, TmpPos;
  339.   TmpReg = (Xflag & FLASH_Reg_Mask) >> 5;
  340.   TmpPos = (Xflag & FLASH_Flag_Mask);
  341.   switch(TmpReg)
  342.   {
  343.     case 0 : // CR0
  344.     {
  345.       // Clears the status of the CR0[TmpPos] flag
  346.       FLASHR->CR0 &= ~(1<<TmpPos);
  347.       break;
  348.     }
  349.     case 1 : // CR1
  350.     {
  351.       // Clears the status of the CR1[TmpPos] flag
  352.       FLASHR->CR1 &= ~(1<<TmpPos);
  353.       break;
  354.     }
  355.     case 5 : // ER
  356.     {
  357.       // Clears the status of the ER[TmpPos] flag
  358.       FLASHR->ER &= ~(1<<TmpPos);
  359.       break;
  360.     }
  361.   }
  362. }
  363. /*******************************************************************************
  364. * Function Name  : ProtectionLevel
  365. * Description    : Returns the Index of the Last bit used to Enable / Disable the
  366. *                  Permanent protection.
  367. * Input 1        : None
  368. * Return         : None
  369. *******************************************************************************/
  370. u16 ProtectionLevel(u16 ProtectionRegs)
  371. {
  372.   u16 TmpBitIndex = 0;
  373.   while ((ProtectionRegs & 0x1) == 0 && TmpBitIndex < 16)
  374.   {
  375.     ProtectionRegs>>=1;
  376.     TmpBitIndex++;
  377.   }
  378.   return TmpBitIndex;
  379. }
  380. /*******************************************************************************
  381. * Function Name  : Wait For Last Task
  382. * Description    : Waits for the end of last task on a Flash Bank
  383. * Input 1        : Bank number.
  384. * Return         : The value passed in parameter with the bit (Bitindex) reset
  385. *******************************************************************************/
  386. void WaitForLastTask(flashbanks Xbank)
  387. {
  388.   if (Xbank == FLASH_BANK0) while (FLASH_FlagStatus(FLASH_BSY0) == SET);
  389.   else while (FLASH_FlagStatus(FLASH_BSY1) == SET);
  390. }
  391. /*******************(C)COPYRIGHT 2003 STMicroelectronics *****END OF FILE****/