flash.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /* 包含头文件-----------------------------------------------------------------*/
  2. #include "flash.h"
  3. #include <string.h>
  4. /* 私有宏定义-----------------------------------------------------------------*/
  5. #define FLASH_PAGE_SIZE (1024u) /* FLASH页大小 */
  6. #define FLASH_PROGRAM_SIZE (4u) /* FLASH单次写入大小 */
  7. /* 使能全局中断 */
  8. #define ENABLE_GIE() do { \
  9. __asm volatile ("cpsie i"); \
  10. }while(0)
  11. /* 关闭全局中断 */
  12. #define DISABLE_GIE() do { \
  13. __asm volatile ("cpsid i"); \
  14. }while(0)
  15. /* 私有类型定义---------------------------------------------------------------*/
  16. /* 私有变量-------------------------------------------------------------------*/
  17. /* 全局变量-------------------------------------------------------------------*/
  18. /* 私有函数原型---------------------------------------------------------------*/
  19. /**
  20. * @brief 擦除flash
  21. * @param startAddr : 起始地址
  22. * @param bytes : 擦除总字节数量
  23. * @retval 0:擦除成功 1:擦除失败
  24. */
  25. uint8_t flash_erase(uint32_t startAddr, uint32_t bytes)
  26. {
  27. uint8_t pageNum = (bytes % FLASH_PAGE_SIZE == 0) ? (bytes / FLASH_PAGE_SIZE) : (bytes / FLASH_PAGE_SIZE + 1);
  28. DISABLE_GIE();
  29. FLASH_Unlock();
  30. while(pageNum--)
  31. {
  32. if(FLASH_COMPLETE != FLASH_ErasePage(startAddr))
  33. {
  34. FLASH_Lock();
  35. ENABLE_GIE();
  36. return 1;
  37. }
  38. startAddr += FLASH_PAGE_SIZE;
  39. }
  40. FLASH_Lock();
  41. ENABLE_GIE();
  42. return 0;
  43. }
  44. /**
  45. * @brief 读flash
  46. * @param startAddr : 起始地址
  47. * @param pBuf : 数据存储区
  48. * @param len : 读取数量byte
  49. * @retval 0:读取成功
  50. */
  51. uint8_t flash_read(uint32_t startAddr, void *pBuf, uint32_t len)
  52. {
  53. DISABLE_GIE();
  54. memcpy(pBuf, (void *)startAddr, len);
  55. ENABLE_GIE();
  56. return 0;
  57. }
  58. /**
  59. * @brief 写flash
  60. * @param startAddr : 起始地址
  61. * @param pBuf : 数据缓冲区
  62. * @param len : 写入数量byte
  63. * @retval 0:写入成功 1:写入失败
  64. */
  65. uint8_t flash_write(uint32_t startAddr, void *pBuf, uint32_t len)
  66. {
  67. uint32_t *dataTmp;
  68. dataTmp = (uint32_t *)pBuf; /* 类型转换为4字节类型 */
  69. /* 将写入数量除以单次写入大小计算写入次数并且不满4字节的写入也计入1次写入 */
  70. len = (len % FLASH_PROGRAM_SIZE == 0) ? (len / FLASH_PROGRAM_SIZE) : (len / FLASH_PROGRAM_SIZE + 1);
  71. DISABLE_GIE();
  72. FLASH_Unlock();
  73. while(len--)
  74. {
  75. if(FLASH_COMPLETE != FLASH_ProgramWord(startAddr, *dataTmp))
  76. {
  77. FLASH_Lock();
  78. ENABLE_GIE();
  79. return 1;
  80. }
  81. startAddr += 4;
  82. dataTmp++;
  83. }
  84. FLASH_Lock();
  85. ENABLE_GIE();
  86. return 0;
  87. }