{"id":760,"date":"2023-02-03T20:12:01","date_gmt":"2023-02-03T12:12:01","guid":{"rendered":"http:\/\/www.huangrongzhen.ink\/?p=760"},"modified":"2023-02-03T20:20:10","modified_gmt":"2023-02-03T12:20:10","slug":"stm32f429igt6-%e8%af%bb%e5%86%99%e5%86%85%e9%83%a8-flash-%e9%a9%b1%e5%8a%a8","status":"publish","type":"post","link":"https:\/\/www.huangrongzhen.ink\/?p=760","title":{"rendered":"STM32F429IGT6 \u8bfb\u5199\u5185\u90e8 Flash \u9a71\u52a8"},"content":{"rendered":"<div class=\"wp-block-post-excerpt\"><p class=\"wp-block-post-excerpt__excerpt\">\u9488\u5bf9 F429 \u5185\u90e8 Flash \u6247\u533a\u5927\u5c0f\u4e0d\u4e00\u81f4\u7684\u7279\u70b9\u505a\u4e86\u9002\u914d\uff0c\u53ef\u4ee5\u8bfb\u5199\u4efb\u610f\u6247\u533a\u3001\u5730\u5740\u3002 <\/p><\/div>\n\n\n<p>\u672c\u9a71\u52a8\u4e2d\u4f7f\u7528\u4e86\u5185\u90e8 SRAM \u505a\u4e3a\u8bfb\u5199\u7f13\u51b2\u533a\uff0c\u5360\u7528\u5185\u5b58\u8f83\u5927\uff0c\u5b9e\u9645\u9879\u76ee\u4e2d\u63a8\u8350\u4f7f\u7528 SDRAM \u505a\u4e3a\u8bfb\u5199\u7f13\u51b2\u533a\uff0c\u5e76\u642d\u914d\u52a8\u6001\u5185\u5b58\u7ba1\u7406\u673a\u5236\u4f7f\u7528\u3002\u672c\u9a71\u52a8\u5df2\u7ecf\u901a\u8fc7\u4e86\u5145\u5206\u9a8c\u8bc1\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728\u9879\u76ee\u4e2d\u4f7f\u7528\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%A4%B4%E6%96%87%E4%BB%B6\"><\/span>\u5934\u6587\u4ef6<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">\/*********************************************************************************************************\n* \u6a21\u5757\u540d\u79f0\uff1aFlash.h\n* \u6458    \u8981\uff1aFlash\u6a21\u5757\n* \u5f53\u524d\u7248\u672c\uff1a1.0.0\n* \u4f5c    \u8005\uff1aSZLY(COPYRIGHT 2018 - 2020 SZLY. All rights reserved.)\n* \u5b8c\u6210\u65e5\u671f\uff1a2020\u5e7401\u670801\u65e5   \n* \u5185    \u5bb9\uff1a\n* \u6ce8    \u610f\uff1a\n**********************************************************************************************************\n* \u53d6\u4ee3\u7248\u672c\uff1a\n* \u4f5c    \u8005\uff1a\n* \u5b8c\u6210\u65e5\u671f\uff1a\n* \u4fee\u6539\u5185\u5bb9\uff1a\n* \u4fee\u6539\u6587\u4ef6\uff1a\n*********************************************************************************************************\/\n#ifndef _FLASH_H_\n#define _FLASH_H_\n\n\/*********************************************************************************************************\n*                                              \u5305\u542b\u5934\u6587\u4ef6\n*********************************************************************************************************\/\n#include \"DataType.h\"\n\n\/*********************************************************************************************************\n*                                              \u5b8f\u5b9a\u4e49\n*********************************************************************************************************\/\n\/\/\u6247\u533a\u5927\u5c0f\u4e3a128K\n#define FLASH_PAGE_SIZE ((u32)(128 * 1024))\n\n\/*********************************************************************************************************\n*                                              \u679a\u4e3e\u7ed3\u6784\u4f53\u5b9a\u4e49\n*********************************************************************************************************\/\n\n\/*********************************************************************************************************\n*                                              API\u51fd\u6570\u58f0\u660e\n*********************************************************************************************************\/\nvoid InitFlash(void);                                                              \/\/\u521d\u59cb\u5316\u5185\u90e8Flash\u6a21\u5757\nvoid FlashWriteWord(unsigned int startAddr, unsigned int* pBuf, unsigned int len); \/\/\u5411Flash\u4e2d\u5199\u5165\u5b57\nvoid FlashReadWord(unsigned int startAddr, unsigned int* pBuf, unsigned int len);  \/\/\u4eceFlash\u8bfb\u53d6\u5b57\n\n#endif<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%BA%90%E6%96%87%E4%BB%B6\"><\/span>\u6e90\u6587\u4ef6<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">\/*********************************************************************************************************\n* \u6a21\u5757\u540d\u79f0\uff1aFlash.c\n* \u6458    \u8981\uff1aFlash\u6a21\u5757\n* \u5f53\u524d\u7248\u672c\uff1a1.0.0\n* \u4f5c    \u8005\uff1aSZLY(COPYRIGHT 2018 - 2020 SZLY. All rights reserved.)\n* \u5b8c\u6210\u65e5\u671f\uff1a2020\u5e7401\u670801\u65e5   \n* \u5185    \u5bb9\uff1a\n* \u6ce8    \u610f\uff1a\n**********************************************************************************************************\n* \u53d6\u4ee3\u7248\u672c\uff1a\n* \u4f5c    \u8005\uff1a\n* \u5b8c\u6210\u65e5\u671f\uff1a\n* \u4fee\u6539\u5185\u5bb9\uff1a\n* \u4fee\u6539\u6587\u4ef6\uff1a\n*********************************************************************************************************\/\n\n\/*********************************************************************************************************\n*                                              \u5305\u542b\u5934\u6587\u4ef6\n*********************************************************************************************************\/\n#include \"Flash.h\"\n#include \"stm32f4xx_conf.h\"\n#include \"UART1.h\"\n\n\/*********************************************************************************************************\n*                                              \u5b8f\u5b9a\u4e49\n*********************************************************************************************************\/\n\n\/*********************************************************************************************************\n*                                              \u679a\u4e3e\u7ed3\u6784\u4f53\u5b9a\u4e49\n*********************************************************************************************************\/\ntypedef struct\n{\n  unsigned int sectorNumber;   \/\/\u6247\u533a\u7f16\u53f7\n  unsigned int sectorSize;     \/\/\u6247\u533a\u5927\u5c0f\n  unsigned int sectorBaseAddr; \/\/\u6247\u533a\u8d77\u59cb\u5730\u5740\n}StructSectorInfo;\n\n\/*********************************************************************************************************\n*                                              \u5185\u90e8\u53d8\u91cf\n*********************************************************************************************************\/\n\/\/Flash \u5199\u5165\u7f13\u51b2\u533a\nstatic unsigned int s_arrFlashBuf[FLASH_PAGE_SIZE \/ 4];\n\n\/\/\u6247\u533a\u4fe1\u606f\nstatic const StructSectorInfo s_arrSectorInfo[24] = \n{\n  {FLASH_Sector_0 , 16  * 1024, 0x08000000},\n  {FLASH_Sector_1 , 16  * 1024, 0x08004000},\n  {FLASH_Sector_2 , 16  * 1024, 0x08008000},\n  {FLASH_Sector_3 , 16  * 1024, 0x0800C000},\n  {FLASH_Sector_4 , 64  * 1024, 0x08010000},\n  {FLASH_Sector_5 , 128 * 1024, 0x08020000},\n  {FLASH_Sector_6 , 128 * 1024, 0x08040000},\n  {FLASH_Sector_7 , 128 * 1024, 0x08060000},\n  {FLASH_Sector_8 , 128 * 1024, 0x08080000},\n  {FLASH_Sector_9 , 128 * 1024, 0x080A0000},\n  {FLASH_Sector_10, 128 * 1024, 0x080C0000},\n  {FLASH_Sector_11, 128 * 1024, 0x080E0000},\n  {FLASH_Sector_12, 16  * 1024, 0x08100000},\n  {FLASH_Sector_13, 16  * 1024, 0x08104000},\n  {FLASH_Sector_14, 16  * 1024, 0x08108000},\n  {FLASH_Sector_15, 16  * 1024, 0x0810C000},\n  {FLASH_Sector_16, 64  * 1024, 0x08110000},\n  {FLASH_Sector_17, 128 * 1024, 0x08120000},\n  {FLASH_Sector_18, 128 * 1024, 0x08140000},\n  {FLASH_Sector_19, 128 * 1024, 0x08160000},\n  {FLASH_Sector_20, 128 * 1024, 0x08180000},\n  {FLASH_Sector_21, 128 * 1024, 0x081A0000},\n  {FLASH_Sector_22, 128 * 1024, 0x081C0000},\n  {FLASH_Sector_23, 128 * 1024, 0x081E0000},\n};\n\n\/*********************************************************************************************************\n*                                              \u5185\u90e8\u51fd\u6570\u58f0\u660e\n*********************************************************************************************************\/ \nstatic unsigned int GetSectorSize(unsigned int sector);     \/\/\u6839\u636e\u6247\u533a\u7f16\u53f7\u83b7\u53d6\u6247\u533a\u5927\u5c0f\nstatic unsigned int GetSectorBaseAddr(unsigned int sector); \/\/\u6839\u636e\u6247\u533a\u7f16\u53f7\u83b7\u53d6\u6247\u533a\u8d77\u59cb\u5730\u5740\nstatic unsigned int GetSectorNumber(unsigned int addr);     \/\/\u6839\u636e\u5730\u5740\u83b7\u53d6\u6247\u533a\u7f16\u53f7\n\n\/*********************************************************************************************************\n*                                              \u5185\u90e8\u51fd\u6570\u5b9e\u73b0\n*********************************************************************************************************\/\n\/*********************************************************************************************************\n* \u51fd\u6570\u540d\u79f0\uff1a GetSectorSize\n* \u51fd\u6570\u529f\u80fd\uff1a \u6839\u636e\u6247\u533a\u7f16\u53f7\u83b7\u53d6\u6247\u533a\u5927\u5c0f\n* \u8f93\u5165\u53c2\u6570\uff1a sector\uff1a\u6247\u533a\u7f16\u53f7\n* \u8f93\u51fa\u53c2\u6570\uff1a void\n* \u8fd4 \u56de \u503c\uff1a \u6247\u533a\u5927\u5c0f\uff08\u5b57\u8282\uff09\n* \u521b\u5efa\u65e5\u671f\uff1a 2023\u5e7402\u670803\u65e5\n* \u6ce8    \u610f\uff1a\n*********************************************************************************************************\/\nstatic unsigned int GetSectorSize(unsigned int sector)\n{\n  unsigned int i;\n  for(i = 0; i &lt; sizeof(s_arrSectorInfo) \/ sizeof(StructSectorInfo); i++)\n  {\n    if(sector == s_arrSectorInfo[i].sectorNumber)\n    {\n      return s_arrSectorInfo[i].sectorSize;\n    }\n  }\n  return 0;\n}\n\n\/*********************************************************************************************************\n* \u51fd\u6570\u540d\u79f0\uff1a GetSectorBaseAddr\n* \u51fd\u6570\u529f\u80fd\uff1a \u6839\u636e\u6247\u533a\u7f16\u53f7\u83b7\u53d6\u6247\u533a\u8d77\u59cb\u5730\u5740\n* \u8f93\u5165\u53c2\u6570\uff1a sector\uff1a\u6247\u533a\u7f16\u53f7\n* \u8f93\u51fa\u53c2\u6570\uff1a void\n* \u8fd4 \u56de \u503c\uff1a \u6247\u533a\u8d77\u59cb\u5730\u5740\n* \u521b\u5efa\u65e5\u671f\uff1a 2023\u5e7402\u670803\u65e5\n* \u6ce8    \u610f\uff1a\n*********************************************************************************************************\/\nstatic unsigned int GetSectorBaseAddr(unsigned int sector)\n{\n  unsigned int i;\n  for(i = 0; i &lt; sizeof(s_arrSectorInfo) \/ sizeof(StructSectorInfo); i++)\n  {\n    if(sector == s_arrSectorInfo[i].sectorNumber)\n    {\n      return s_arrSectorInfo[i].sectorBaseAddr;\n    }\n  }\n  return s_arrSectorInfo[0].sectorBaseAddr;\n}\n\n\/*********************************************************************************************************\n* \u51fd\u6570\u540d\u79f0\uff1a GetSectorNumber\n* \u51fd\u6570\u529f\u80fd\uff1a \u6839\u636e\u5730\u5740\u83b7\u53d6\u6247\u533a\u7f16\u53f7\n* \u8f93\u5165\u53c2\u6570\uff1a addr\uff1a\u5730\u5740\n* \u8f93\u51fa\u53c2\u6570\uff1a void\n* \u8fd4 \u56de \u503c\uff1a \u6247\u533a\u7f16\u53f7\n* \u521b\u5efa\u65e5\u671f\uff1a 2023\u5e7402\u670803\u65e5\n* \u6ce8    \u610f\uff1a\n*********************************************************************************************************\/\nstatic unsigned int GetSectorNumber(unsigned int addr)\n{\n  unsigned int i;\n  for(i = 0; i &lt; sizeof(s_arrSectorInfo) \/ sizeof(StructSectorInfo); i++)\n  {\n    if((addr >= s_arrSectorInfo[i].sectorBaseAddr) &amp;&amp; (addr &lt; (s_arrSectorInfo[i].sectorBaseAddr + s_arrSectorInfo[i].sectorSize)))\n    {\n      return s_arrSectorInfo[i].sectorNumber;\n    }\n  }\n  return s_arrSectorInfo[0].sectorNumber;\n}\n\n\/*********************************************************************************************************\n*                                              API\u51fd\u6570\u5b9e\u73b0\n*********************************************************************************************************\/\n\/*********************************************************************************************************\n* \u51fd\u6570\u540d\u79f0\uff1aInitFlash\n* \u51fd\u6570\u529f\u80fd\uff1a\u521d\u59cb\u5316Flash\u6a21\u5757\n* \u8f93\u5165\u53c2\u6570\uff1avoid\n* \u8f93\u51fa\u53c2\u6570\uff1avoid\n* \u8fd4 \u56de \u503c\uff1avoid\n* \u521b\u5efa\u65e5\u671f\uff1a2018\u5e7401\u670801\u65e5\n* \u6ce8    \u610f\uff1a\n*********************************************************************************************************\/\nvoid InitFlash(void)\n{\n  \n}\n\n\/*********************************************************************************************************\n* \u51fd\u6570\u540d\u79f0\uff1aFlashWriteWord\n* \u51fd\u6570\u529f\u80fd\uff1a\u5411Flash\u4e2d\u5199\u5165\u5b57\n* \u8f93\u5165\u53c2\u6570\uff1astartAddr-\u8d77\u59cb\u5730\u5740\uff0cpBuf-\u5f85\u5199\u5165\u6570\u636e\u6307\u9488\uff0clen-\u5199\u5165\u6570\u636e\u7684\u6570\u91cf\n* \u8f93\u51fa\u53c2\u6570\uff1avoid\n* \u8fd4 \u56de \u503c\uff1avoid\n* \u521b\u5efa\u65e5\u671f\uff1a2021\u5e7407\u670801\u65e5\n* \u6ce8    \u610f\uff1a\u8f93\u5165\u6570\u636e\u4e00\u5b9a\u662fuint32_t\u7684\u6307\u9488\uff0c\u5373\u6570\u636e\u4e00\u5b9a\u662f\u6309\u71674\u5b57\u8282\u5bf9\u9f50\u5199\u5165\u7684\n*          \u5199\u5165\u6570\u636e\u65f6\u4e3a\u4fdd\u8bc1\u4e4b\u524d\u5199\u5165\u7684\u6570\u636e\u4e0d\u88ab\u64e6\u9664\uff0cFlash\u8bfb\u5199\u4ee5\u9875\u4e3a\u5355\u4f4d\n*********************************************************************************************************\/\nvoid FlashWriteWord(unsigned int startAddr, unsigned int* pBuf, unsigned int len)\n{\n  unsigned int i;          \/\/\u5faa\u73af\u53d8\u91cf\n  unsigned int pageNumber; \/\/\u9875\u7f16\u53f7\n  unsigned int pageSize;   \/\/\u9875\u5927\u5c0f\uff0c\u6309\u5b57\u8282\n  unsigned int pageAddr;   \/\/\u9875\u5730\u5740\uff0c\u5373\u8d77\u59cb\u5730\u5740 startAddr \u6240\u5728\u7684\u9875\u5730\u5740\n  unsigned int pageOff;    \/\/\u9875\u5185\u504f\u79fb\u5730\u5740\uff0832\u4f4d\u8ba1\u7b97\uff09\uff0c\u5373\u8d77\u59cb\u5730\u5740 startAddr \u6240\u5728\u7684\u9875\u7684\u504f\u79fb\u5730\u5740\n  unsigned int rwAddr;     \/\/\u8bfb\u5199\u5730\u5740\n  unsigned int dataCnt;    \/\/\u5df2\u5199\u5165\u6570\u636e\u91cf\n  \n  \/\/\u83b7\u53d6\u9875\u7f16\u53f7\u548c\u9875\u5927\u5c0f\n  pageNumber = GetSectorNumber(startAddr);\n  pageSize = GetSectorSize(pageNumber);\n\n  \/\/\u8ba1\u7b97\u9875\u5730\u5740\u548c\u9875\u5185\u504f\u79fb\u91cf\n  pageAddr = GetSectorBaseAddr(pageNumber);\n  pageOff  = (startAddr - pageAddr) \/ 4;\n\n  \/\/\u89e3\u9501Flash\uff0c\u51c6\u5907\u5199\u5165\n  FLASH_Unlock();\n\n  \/\/\u5df2\u5199\u5165\u6570\u636e\u91cf\u6e05\u96f6\n  dataCnt = 0;\n\n  \/\/\u5199\u5165Flash\u65f6\u9700\u8981\u5148\u8bfb\u53d6\u6574\u9875\u7684\u5185\u5bb9\u5230\u7f13\u51b2\u533a\uff0c\u7136\u540e\u64e6\u9664\u4e00\u6574\u9875\uff0c\u5c06\u7f13\u51b2\u533a\u4fee\u6539\u540e\u518d\u5199\u56deFlash\n  while(1)\n  {\n    \/\/\u8bfb\u53d6\u4e00\u6574\u9875\u7684\u6570\u636e\u5230\u7f13\u51b2\u533a\n    rwAddr = pageAddr;\n    for(i = 0; i &lt; pageSize \/ 4; i++)\n    {\n      s_arrFlashBuf[i] = *(u32*)rwAddr;\n      rwAddr = rwAddr + 4;\n    }\n\n    \/\/\u64e6\u9664\u4e00\u6574\u9875\n    FLASH_EraseSector(pageNumber, VoltageRange_3);;\n    \n    \/\/\u4fee\u6539\u7f13\u51b2\u533a\u5185\u7684\u5185\u5bb9\n    while(pageOff &lt; pageSize \/ 4)\n    {\n      \/\/\u5c06\u6570\u636e\u4fdd\u5b58\u5230\u7f13\u51b2\u533a\n      s_arrFlashBuf[pageOff] = pBuf[dataCnt];\n\n      \/\/\u5df2\u5199\u5165\u6570\u636e\u52a0\u4e00\n      dataCnt++;\n\n      \/\/\u9875\u5185\u504f\u79fb\u91cf\u52a0\u4e00\n      pageOff++;\n\n      \/\/\u5199\u5165\u5b8c\u6210\n      if(dataCnt >= len)\n      {\n        break;\n      }\n    }\n\n    \/\/\u9875\u5185\u504f\u79fb\u91cf\u6e05\u96f6\n    pageOff = 0;\n\n    \/\/\u5c06\u4fee\u6539\u540e\u7684\u7f13\u51b2\u533a\u5185\u5bb9\u5199\u56deFlash\n    rwAddr = pageAddr;\n    for(i = 0; i &lt; pageSize \/ 4; i++)\n    {\n      FLASH_ProgramWord(rwAddr, s_arrFlashBuf[i]);\n      rwAddr = rwAddr + 4;\n    }\n\n    \/\/\u66f4\u65b0\u5230\u4e0b\u4e00\u9875\n    pageAddr = pageAddr + pageSize;\n    pageNumber = GetSectorNumber(pageAddr);\n\n    \/\/\u5199\u5165\u5b8c\u6210\n    if(dataCnt >= len)\n    {\n      break;\n    }\n  }\n\n  \/\/Flash\u4e0a\u9501\n  FLASH_Lock();\n}\n\n\/*********************************************************************************************************\n* \u51fd\u6570\u540d\u79f0\uff1aFlashReadWord\n* \u51fd\u6570\u529f\u80fd\uff1a\u4eceFlash\u8bfb\u53d6\u5b57\n* \u8f93\u5165\u53c2\u6570\uff1astartAddr-\u8d77\u59cb\u5730\u5740\uff08\u7531\u4e8e\u662f\u5b57\uff0832\u4f4d\uff09\u8bfb\u53d6\uff0c\u56e0\u6b64\uff0c\u6b64\u5730\u5740\u5fc5\u987b\u4e3a4\u7684\u500d\u6570\uff09\uff1bpBuf-\u6570\u636e\u6307\u9488\n*           len-\u5b57\uff0832\u4f4d\uff09\u6570\uff0c\u5373\u8981\u8bfb\u53d6\u768432\u4f4d\u6570\u636e\u7684\u4e2a\u6570\n* \u8f93\u51fa\u53c2\u6570\uff1avoid\n* \u8fd4 \u56de \u503c\uff1avoid\n* \u521b\u5efa\u65e5\u671f\uff1a2021\u5e7407\u670801\u65e5\n* \u6ce8    \u610f\uff1a\n*********************************************************************************************************\/\nvoid FlashReadWord(unsigned int startAddr, unsigned int* pBuf, unsigned int len)\n{\n  u16 i;\n  u32 addr;\n  addr = startAddr; \n  for(i = 0; i &lt; len; i++)\n  {\n    pBuf[i] = *(vu32*)(addr);     \/\/\u8bfb\u53d6\u5b57\uff0832\u4f4d\uff09\n    addr += 4;                    \/\/\u7531\u4e8e\u662f\u5b57\uff0832\u4f4d\uff09\uff0c\u6545\u5730\u5740\u589e\u52a04\n  }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u9488\u5bf9 F429 \u5185\u90e8 Flash \u6247\u533a\u5927\u5c0f\u4e0d\u4e00\u81f4\u7684\u7279\u70b9\u505a\u4e86\u9002\u914d\uff0c\u53ef\u4ee5\u8bfb\u5199\u4efb\u610f\u6247\u533a\u3001\u5730\u5740\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,6],"tags":[],"_links":{"self":[{"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/posts\/760"}],"collection":[{"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=760"}],"version-history":[{"count":3,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/posts\/760\/revisions"}],"predecessor-version":[{"id":763,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/posts\/760\/revisions\/763"}],"wp:attachment":[{"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=760"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}