fmc.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "gd32f10x.h"
  2. #include "fmc.h"
  3. /*-------------------------------------------------*/
  4. /*函数名:擦除FLASH 一个扇区1KB,共3*1024个扇区 */
  5. /*参 数:start:擦除起始页 num:擦几个页 */
  6. /*返回值:无 */
  7. /*
  8. flash结构:
  9. 0x08000000~0x0807FFFF bank0(2KB一页,0~255页,共256页)共512KB
  10. 0x08080000~0x082FFFFF bank1(4KB一页,256~895页,共640页)共2.5MB
  11. */
  12. /*-------------------------------------------------*/
  13. void GD32_EraseFlash(uint16_t start, uint16_t num)
  14. {
  15. uint16_t i; //用于for循环
  16. uint16_t j = 0;
  17. fmc_unlock(); //解锁
  18. if ((start < 256) && ((start + num) < 256))
  19. {
  20. for(i = 0; i < num; i++) //循环num次,一个页一个页的擦除
  21. {
  22. fmc_page_erase((0x08000000 + start * 2048) + (2048 * i)); //擦除bank0一个页2KB
  23. }
  24. }
  25. else if ((start < 256) && ((start + num) > 256))
  26. {
  27. for(i = 0; i < num; i++) //循环num次,一个页一个页的擦除
  28. {
  29. if((start + i) < 256)
  30. {
  31. fmc_page_erase((0x08000000 + start * 2 * 1024) + (2 * 1024 * i)); //擦除bank0一个页2KB
  32. }
  33. else
  34. {
  35. fmc_page_erase(0x08080000 + (4 * 1024 * j)); //擦除bank1一个页4KB
  36. j++;
  37. }
  38. }
  39. }
  40. else if (start > 256)
  41. {
  42. for(i = 0; i < num; i++) //循环num次,一个页一个页的擦除
  43. {
  44. fmc_page_erase((0x08080000 + (start - 256) * 4 * 1024) + (4 * 1024 * i)); //擦除bank1一个页4KB
  45. }
  46. }
  47. fmc_lock(); //上锁
  48. }
  49. /*---------------------------------------------------------------------*/
  50. /*函数名:写入FLASH */
  51. /*参 数:saddr:写入地址 wdata:写入数据指针 wnum:写入多少个字节 */
  52. /*返回值:无 */
  53. /*---------------------------------------------------------------------*/
  54. void GD32_WriteFlash(uint32_t saddr, uint32_t *wdata, uint32_t wnum)
  55. {
  56. fmc_unlock(); //解锁
  57. while(wnum){ //循环写入,知道num等于0退出while,表示写入完毕
  58. fmc_word_program(saddr,*wdata); //写入一个字(4个字节)
  59. wnum-=4; //写入字节数量-4
  60. saddr+=4; //写入地址+4
  61. wdata++; //写入数据的指针,往后挪动一次
  62. }
  63. fmc_lock(); //上锁
  64. }