hw_flash_data.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "board.h"
  2. /**
  3. * 读取flash一个字
  4. *
  5. * @author Lim (2023/3/15)
  6. *
  7. * @param pos
  8. *
  9. * @return uint32_t
  10. */
  11. uint32_t hw_flash_read_word(uint32_t pos)
  12. {
  13. return *(vu32*)pos;
  14. }
  15. /**
  16. * 读取硬件参数保存部分,要求数据指针地址是4字节对齐
  17. *
  18. * @author lxz (2019/5/30/周四)
  19. *
  20. * @param data
  21. *
  22. * @return int
  23. */
  24. int hw_flash_read(uint32_t pos, void *data, uint32_t length) {
  25. uint32_t *dat = data;
  26. int size = 0;
  27. for (size = 0; size < length; size++) {
  28. *dat = hw_flash_read_word(pos + size);
  29. dat++;
  30. }
  31. return size;
  32. }
  33. /**
  34. * 写入硬件参数部分,要求数据指针地址是4字节对齐
  35. *
  36. * @author lxz (2019/5/30/周四)
  37. *
  38. * @param data
  39. *
  40. * @return int
  41. */
  42. int hw_flash_write(uint32_t pos, void *data, uint32_t length) {
  43. int size = 0;
  44. uint32_t *ptr = data;
  45. //开始编写参数
  46. INTX_DISABLE();
  47. fmc_unlock();
  48. for (size = 0; size < length; size++) {
  49. if (fmc_word_program(pos,*ptr) != FMC_READY)
  50. {
  51. break;
  52. }
  53. ptr++;
  54. pos += 4;
  55. }
  56. fmc_lock();
  57. INTX_ENABLE();
  58. return length;
  59. }
  60. /**
  61. * 擦除地址所在的扇区
  62. *
  63. * @author lxz
  64. *
  65. * @param pos
  66. */
  67. void hw_flash_erase(uint32_t pos) {
  68. INTX_DISABLE();
  69. fmc_unlock();
  70. fmc_page_erase(pos & 0xFFFFF400U);
  71. fmc_lock();
  72. INTX_ENABLE();
  73. }
  74. /**
  75. * 检查指定的空间是否能写入
  76. *
  77. * @author lxz (2019/5/31/周五)
  78. *
  79. * @param pos 必须保证32字节对齐的地址
  80. * @param length
  81. *
  82. * @return int
  83. */
  84. int hw_flash_data_is_valid(uint32_t pos, uint32_t length) {
  85. length = (length + 3) / 4;
  86. while (length > 0) {
  87. if (hw_flash_read_word(pos) != 0xFFFFFFFF) {
  88. break;
  89. }
  90. length--;
  91. pos += 4;
  92. }
  93. return length;
  94. }