fmc.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "gd32f10x.h"
  2. #include "fmc.h"
  3. /*-------------------------------------------------*/
  4. /*函数名:擦除FLASH */
  5. /*参 数:start:擦除起始扇区 num:擦几个扇区 */
  6. /*返回值:无 */
  7. /*-------------------------------------------------*/
  8. void GD32_EraseFlash(uint16_t start, uint16_t num)
  9. {
  10. uint16_t i; //用于for循环
  11. fmc_unlock(); //解锁
  12. for(i=0;i<num;i++){ //循环num次,一个扇区一个扇区的擦除
  13. fmc_page_erase((0x08000000 + start * 1024) + (1024 * i)); //擦除一个扇区
  14. }
  15. fmc_lock(); //上锁
  16. }
  17. /*---------------------------------------------------------------------*/
  18. /*函数名:写入FLASH */
  19. /*参 数:saddr:写入地址 wdata:写入数据指针 wnum:写入多少个字节 */
  20. /*返回值:无 */
  21. /*---------------------------------------------------------------------*/
  22. void GD32_WriteFlash(uint32_t saddr, uint32_t *wdata, uint32_t wnum)
  23. {
  24. fmc_unlock(); //解锁
  25. while(wnum){ //循环写入,知道num等于0退出while,表示写入完毕
  26. fmc_word_program(saddr,*wdata); //写入一个字(4个字节)
  27. wnum-=4; //写入字节数量-4
  28. saddr+=4; //写入地址+4
  29. wdata++; //写入数据的指针,往后挪动一次
  30. }
  31. fmc_lock(); //上锁
  32. }
  33. /**
  34. * 读FLASH
  35. * @param Address 地址
  36. * @param Buffer 存放读取的数据
  37. * @param Size 要读取的数据大小,单位字节
  38. * @return 读出成功的字节数
  39. */
  40. uint32_t FLASH_Read(uint32_t Address, void *Buffer, uint32_t Size)
  41. {
  42. uint32_t nread = Size;
  43. uint8_t* d = (uint8_t *)Buffer;
  44. const uint8_t* s = (const uint8_t *)Address;
  45. if (!Buffer || Address < GD32FLASH_BASE || Address >= GD32FLASH_END)
  46. return 0;
  47. while (nread >= sizeof(uint32_t) && (((uint32_t)s) <= (GD32FLASH_END - 4)))
  48. {
  49. *(volatile uint32_t *)d = *(volatile uint32_t *)s;
  50. d += sizeof(uint32_t);
  51. s += sizeof(uint32_t);
  52. nread -= sizeof(uint32_t);
  53. }
  54. while (nread && (((uint32_t)s) < GD32FLASH_END))
  55. {
  56. *d++ = *s++;
  57. nread--;
  58. }
  59. return Size - nread;
  60. }