#ifndef __LKS32MC09X_FLASH_H__
#define __LKS32MC09X_FLASH_H__

#include "lks32mc09x_reg.h"
// 各扇区的定义
#define FLASH_SECTOR(x)       (x * 0x200)       // 0.5KB per sector (0x200 = 512 bytes)
#define FLASH_SECTOR_0        FLASH_SECTOR(0)   // 0x00000
#define FLASH_SECTOR_1        FLASH_SECTOR(1)   // 0x00200
#define FLASH_SECTOR_2        FLASH_SECTOR(2)   // 0x00400
#define FLASH_SECTOR_3        FLASH_SECTOR(3)   // 0x00600
#define FLASH_SECTOR_4        FLASH_SECTOR(4)   // 0x00800
#define FLASH_SECTOR_5        FLASH_SECTOR(5)   // 0x00A00
#define FLASH_SECTOR_6        FLASH_SECTOR(6)   // 0x00C00
#define FLASH_SECTOR_7        FLASH_SECTOR(7)   // 0x00E00
#define FLASH_SECTOR_8        FLASH_SECTOR(8)   // 0x01000
#define FLASH_SECTOR_9        FLASH_SECTOR(9)   // 0x01200
#define FLASH_SECTOR_10       FLASH_SECTOR(10)  // 0x01400
#define FLASH_SECTOR_11       FLASH_SECTOR(11)  // 0x01600
#define FLASH_SECTOR_12       FLASH_SECTOR(12)  // 0x01800
#define FLASH_SECTOR_13       FLASH_SECTOR(13)  // 0x01A00
#define FLASH_SECTOR_14       FLASH_SECTOR(14)  // 0x01C00
#define FLASH_SECTOR_15       FLASH_SECTOR(15)  // 0x01E00
#define FLASH_SECTOR_16       FLASH_SECTOR(16)  // 0x02000
#define FLASH_SECTOR_17       FLASH_SECTOR(17)  // 0x02200
#define FLASH_SECTOR_18       FLASH_SECTOR(18)  // 0x02400
#define FLASH_SECTOR_19       FLASH_SECTOR(19)  // 0x02600
#define FLASH_SECTOR_20       FLASH_SECTOR(20)  // 0x02800
#define FLASH_SECTOR_21       FLASH_SECTOR(21)  // 0x02A00
#define FLASH_SECTOR_22       FLASH_SECTOR(22)  // 0x02C00
#define FLASH_SECTOR_23       FLASH_SECTOR(23)  // 0x02E00
#define FLASH_SECTOR_24       FLASH_SECTOR(24)  // 0x03000
#define FLASH_SECTOR_25       FLASH_SECTOR(25)  // 0x03200
#define FLASH_SECTOR_26       FLASH_SECTOR(26)  // 0x03400
#define FLASH_SECTOR_27       FLASH_SECTOR(27)  // 0x03600
#define FLASH_SECTOR_28       FLASH_SECTOR(28)  // 0x03800
#define FLASH_SECTOR_29       FLASH_SECTOR(29)  // 0x03A00
#define FLASH_SECTOR_30       FLASH_SECTOR(30)  // 0x03C00
#define FLASH_SECTOR_31       FLASH_SECTOR(31)  // 0x03E00
#define FLASH_SECTOR_32       FLASH_SECTOR(32)  // 0x04000
#define FLASH_SECTOR_33       FLASH_SECTOR(33)  // 0x04200
#define FLASH_SECTOR_34       FLASH_SECTOR(34)  // 0x04400
#define FLASH_SECTOR_35       FLASH_SECTOR(35)  // 0x04600
#define FLASH_SECTOR_36       FLASH_SECTOR(36)  // 0x04800
#define FLASH_SECTOR_37       FLASH_SECTOR(37)  // 0x04A00
#define FLASH_SECTOR_38       FLASH_SECTOR(38)  // 0x04C00
#define FLASH_SECTOR_39       FLASH_SECTOR(39)  // 0x04E00
#define FLASH_SECTOR_40       FLASH_SECTOR(40)  // 0x05000
#define FLASH_SECTOR_41       FLASH_SECTOR(41)  // 0x05200
#define FLASH_SECTOR_42       FLASH_SECTOR(42)  // 0x05400
#define FLASH_SECTOR_43       FLASH_SECTOR(43)  // 0x05600
#define FLASH_SECTOR_44       FLASH_SECTOR(44)  // 0x05800
#define FLASH_SECTOR_45       FLASH_SECTOR(45)  // 0x05A00
#define FLASH_SECTOR_46       FLASH_SECTOR(46)  // 0x05C00
#define FLASH_SECTOR_47       FLASH_SECTOR(47)  // 0x05E00
#define FLASH_SECTOR_48       FLASH_SECTOR(48)  // 0x06000
#define FLASH_SECTOR_49       FLASH_SECTOR(49)  // 0x06200
#define FLASH_SECTOR_50       FLASH_SECTOR(50)  // 0x06400
#define FLASH_SECTOR_51       FLASH_SECTOR(51)  // 0x06600
#define FLASH_SECTOR_52       FLASH_SECTOR(52)  // 0x06800
#define FLASH_SECTOR_53       FLASH_SECTOR(53)  // 0x06A00
#define FLASH_SECTOR_54       FLASH_SECTOR(54)  // 0x06C00
#define FLASH_SECTOR_55       FLASH_SECTOR(55)  // 0x06E00
#define FLASH_SECTOR_56       FLASH_SECTOR(56)  // 0x07000
#define FLASH_SECTOR_57       FLASH_SECTOR(57)  // 0x07200
#define FLASH_SECTOR_58       FLASH_SECTOR(58)  // 0x07400
#define FLASH_SECTOR_59       FLASH_SECTOR(59)  // 0x07600
#define FLASH_SECTOR_60       FLASH_SECTOR(60)  // 0x07800
#define FLASH_SECTOR_61       FLASH_SECTOR(61)  // 0x07A00
#define FLASH_SECTOR_62       FLASH_SECTOR(62)  // 0x07C00
#define FLASH_SECTOR_63       FLASH_SECTOR(63)  // 0x07E00
#define FLASH_SECTOR_64       FLASH_SECTOR(64)  // 0x08000
#define FLASH_SECTOR_65       FLASH_SECTOR(65)  // 0x08200
#define FLASH_SECTOR_66       FLASH_SECTOR(66)  // 0x08400
#define FLASH_SECTOR_67       FLASH_SECTOR(67)  // 0x08600
#define FLASH_SECTOR_68       FLASH_SECTOR(68)  // 0x08800
#define FLASH_SECTOR_69       FLASH_SECTOR(69)  // 0x08A00
#define FLASH_SECTOR_70       FLASH_SECTOR(70)  // 0x08C00
#define FLASH_SECTOR_71       FLASH_SECTOR(71)  // 0x08E00
#define FLASH_SECTOR_72       FLASH_SECTOR(72)  // 0x09000
#define FLASH_SECTOR_73       FLASH_SECTOR(73)  // 0x09200
#define FLASH_SECTOR_74       FLASH_SECTOR(74)  // 0x09400
#define FLASH_SECTOR_75       FLASH_SECTOR(75)  // 0x09600
#define FLASH_SECTOR_76       FLASH_SECTOR(76)  // 0x09800
#define FLASH_SECTOR_77       FLASH_SECTOR(77)  // 0x09A00
#define FLASH_SECTOR_78       FLASH_SECTOR(78)  // 0x09C00
#define FLASH_SECTOR_79       FLASH_SECTOR(79)  // 0x09E00
#define FLASH_SECTOR_80       FLASH_SECTOR(80)  // 0x0A000
#define FLASH_SECTOR_81       FLASH_SECTOR(81)  // 0x0A200
#define FLASH_SECTOR_82       FLASH_SECTOR(82)  // 0x0A400
#define FLASH_SECTOR_83       FLASH_SECTOR(83)  // 0x0A600
#define FLASH_SECTOR_84       FLASH_SECTOR(84)  // 0x0A800
#define FLASH_SECTOR_85       FLASH_SECTOR(85)  // 0x0AA00
#define FLASH_SECTOR_86       FLASH_SECTOR(86)  // 0x0AC00
#define FLASH_SECTOR_87       FLASH_SECTOR(87)  // 0x0AE00
#define FLASH_SECTOR_88       FLASH_SECTOR(88)  // 0x0B000
#define FLASH_SECTOR_89       FLASH_SECTOR(89)  // 0x0B200
#define FLASH_SECTOR_90       FLASH_SECTOR(90)  // 0x0B400
#define FLASH_SECTOR_91       FLASH_SECTOR(91)  // 0x0B600
#define FLASH_SECTOR_92       FLASH_SECTOR(92)  // 0x0B800
#define FLASH_SECTOR_93       FLASH_SECTOR(93)  // 0x0BA00
#define FLASH_SECTOR_94       FLASH_SECTOR(94)  // 0x0BC00
#define FLASH_SECTOR_95       FLASH_SECTOR(95)  // 0x0BE00
#define FLASH_SECTOR_96       FLASH_SECTOR(96)  // 0x0C000
#define FLASH_SECTOR_97       FLASH_SECTOR(97)  // 0x0C200
#define FLASH_SECTOR_98       FLASH_SECTOR(98)  // 0x0C400
#define FLASH_SECTOR_99       FLASH_SECTOR(99)  // 0x0C600
#define FLASH_SECTOR_100      FLASH_SECTOR(100) // 0x0C800
#define FLASH_SECTOR_101      FLASH_SECTOR(101) // 0x0CA00
#define FLASH_SECTOR_102      FLASH_SECTOR(102) // 0x0CC00
#define FLASH_SECTOR_103      FLASH_SECTOR(103) // 0x0CE00
#define FLASH_SECTOR_104      FLASH_SECTOR(104) // 0x0D000
#define FLASH_SECTOR_105      FLASH_SECTOR(105) // 0x0D200
#define FLASH_SECTOR_106      FLASH_SECTOR(106) // 0x0D400
#define FLASH_SECTOR_107      FLASH_SECTOR(107) // 0x0D600
#define FLASH_SECTOR_108      FLASH_SECTOR(108) // 0x0D800
#define FLASH_SECTOR_109      FLASH_SECTOR(109) // 0x0DA00
#define FLASH_SECTOR_110      FLASH_SECTOR(110) // 0x0DC00
#define FLASH_SECTOR_111      FLASH_SECTOR(111) // 0x0DE00
#define FLASH_SECTOR_112      FLASH_SECTOR(112) // 0x0E000
#define FLASH_SECTOR_113      FLASH_SECTOR(113) // 0x0E200
#define FLASH_SECTOR_114      FLASH_SECTOR(114) // 0x0E400
#define FLASH_SECTOR_115      FLASH_SECTOR(115) // 0x0E600
#define FLASH_SECTOR_116      FLASH_SECTOR(116) // 0x0E800
#define FLASH_SECTOR_117      FLASH_SECTOR(117) // 0x0EA00
#define FLASH_SECTOR_118      FLASH_SECTOR(118) // 0x0EC00
#define FLASH_SECTOR_119      FLASH_SECTOR(119) // 0x0EE00
#define FLASH_SECTOR_120      FLASH_SECTOR(120) // 0x0F000
#define FLASH_SECTOR_121      FLASH_SECTOR(121) // 0x0F200
#define FLASH_SECTOR_122      FLASH_SECTOR(122) // 0x0F400
#define FLASH_SECTOR_123      FLASH_SECTOR(123) // 0x0F600
#define FLASH_SECTOR_124      FLASH_SECTOR(124) // 0x0F800
#define FLASH_SECTOR_125      FLASH_SECTOR(125) // 0x0FA00
#define FLASH_SECTOR_126      FLASH_SECTOR(126) // 0x0FC00
#define FLASH_SECTOR_127      FLASH_SECTOR(127) // 0x0FE00
#define FLASH_SECTOR_128      FLASH_SECTOR(128) // 0x10000
#define FLASH_SECTOR_129      FLASH_SECTOR(129) // 0x10200
#define FLASH_SECTOR_130      FLASH_SECTOR(130) // 0x10400
#define FLASH_SECTOR_131      FLASH_SECTOR(131) // 0x10600
#define FLASH_SECTOR_132      FLASH_SECTOR(132) // 0x10800
#define FLASH_SECTOR_133      FLASH_SECTOR(133) // 0x10A00
#define FLASH_SECTOR_134      FLASH_SECTOR(134) // 0x10C00
#define FLASH_SECTOR_135      FLASH_SECTOR(135) // 0x10E00
#define FLASH_SECTOR_136      FLASH_SECTOR(136) // 0x11000
#define FLASH_SECTOR_137      FLASH_SECTOR(137) // 0x11200
#define FLASH_SECTOR_138      FLASH_SECTOR(138) // 0x11400
#define FLASH_SECTOR_139      FLASH_SECTOR(139) // 0x11600
#define FLASH_SECTOR_140      FLASH_SECTOR(140) // 0x11800
#define FLASH_SECTOR_141      FLASH_SECTOR(141) // 0x11A00
#define FLASH_SECTOR_142      FLASH_SECTOR(142) // 0x11C00
#define FLASH_SECTOR_143      FLASH_SECTOR(143) // 0x11E00
#define FLASH_SECTOR_144      FLASH_SECTOR(144) // 0x12000
#define FLASH_SECTOR_145      FLASH_SECTOR(145) // 0x12200
#define FLASH_SECTOR_146      FLASH_SECTOR(146) // 0x12400
#define FLASH_SECTOR_147      FLASH_SECTOR(147) // 0x12600
#define FLASH_SECTOR_148      FLASH_SECTOR(148) // 0x12800
#define FLASH_SECTOR_149      FLASH_SECTOR(149) // 0x12A00
#define FLASH_SECTOR_150      FLASH_SECTOR(150) // 0x12C00
#define FLASH_SECTOR_151      FLASH_SECTOR(151) // 0x12E00
#define FLASH_SECTOR_152      FLASH_SECTOR(152) // 0x13000
#define FLASH_SECTOR_153      FLASH_SECTOR(153) // 0x13200
#define FLASH_SECTOR_154      FLASH_SECTOR(154) // 0x13400
#define FLASH_SECTOR_155      FLASH_SECTOR(155) // 0x13600
#define FLASH_SECTOR_156      FLASH_SECTOR(156) // 0x13800
#define FLASH_SECTOR_157      FLASH_SECTOR(157) // 0x13A00
#define FLASH_SECTOR_158      FLASH_SECTOR(158) // 0x13C00
#define FLASH_SECTOR_159      FLASH_SECTOR(159) // 0x13E00
#define FLASH_SECTOR_160      FLASH_SECTOR(160) // 0x14000
#define FLASH_SECTOR_161      FLASH_SECTOR(161) // 0x14200
#define FLASH_SECTOR_162      FLASH_SECTOR(162) // 0x14400
#define FLASH_SECTOR_163      FLASH_SECTOR(163) // 0x14600
#define FLASH_SECTOR_164      FLASH_SECTOR(164) // 0x14800
#define FLASH_SECTOR_165      FLASH_SECTOR(165) // 0x14A00
#define FLASH_SECTOR_166      FLASH_SECTOR(166) // 0x14C00
#define FLASH_SECTOR_167      FLASH_SECTOR(167) // 0x14E00
#define FLASH_SECTOR_168      FLASH_SECTOR(168) // 0x15000
#define FLASH_SECTOR_169      FLASH_SECTOR(169) // 0x15200
#define FLASH_SECTOR_170      FLASH_SECTOR(170) // 0x15400
#define FLASH_SECTOR_171      FLASH_SECTOR(171) // 0x15600
#define FLASH_SECTOR_172      FLASH_SECTOR(172) // 0x15800
#define FLASH_SECTOR_173      FLASH_SECTOR(173) // 0x15A00
#define FLASH_SECTOR_174      FLASH_SECTOR(174) // 0x15C00
#define FLASH_SECTOR_175      FLASH_SECTOR(175) // 0x15E00
#define FLASH_SECTOR_176      FLASH_SECTOR(176) // 0x16000
#define FLASH_SECTOR_177      FLASH_SECTOR(177) // 0x16200
#define FLASH_SECTOR_178      FLASH_SECTOR(178) // 0x16400
#define FLASH_SECTOR_179      FLASH_SECTOR(179) // 0x16600
#define FLASH_SECTOR_180      FLASH_SECTOR(180) // 0x16800
#define FLASH_SECTOR_181      FLASH_SECTOR(181) // 0x16A00
#define FLASH_SECTOR_182      FLASH_SECTOR(182) // 0x16C00
#define FLASH_SECTOR_183      FLASH_SECTOR(183) // 0x16E00
#define FLASH_SECTOR_184      FLASH_SECTOR(184) // 0x17000
#define FLASH_SECTOR_185      FLASH_SECTOR(185) // 0x17200
#define FLASH_SECTOR_186      FLASH_SECTOR(186) // 0x17400
#define FLASH_SECTOR_187      FLASH_SECTOR(187) // 0x17600
#define FLASH_SECTOR_188      FLASH_SECTOR(188) // 0x17800
#define FLASH_SECTOR_189      FLASH_SECTOR(189) // 0x17A00
#define FLASH_SECTOR_190      FLASH_SECTOR(190) // 0x17C00
#define FLASH_SECTOR_191      FLASH_SECTOR(191) // 0x17E00
#define FLASH_SECTOR_192      FLASH_SECTOR(192) // 0x18000
#define FLASH_SECTOR_193      FLASH_SECTOR(193) // 0x18200
#define FLASH_SECTOR_194      FLASH_SECTOR(194) // 0x18400
#define FLASH_SECTOR_195      FLASH_SECTOR(195) // 0x18600
#define FLASH_SECTOR_196      FLASH_SECTOR(196) // 0x18800
#define FLASH_SECTOR_197      FLASH_SECTOR(197) // 0x18A00
#define FLASH_SECTOR_198      FLASH_SECTOR(198) // 0x18C00
#define FLASH_SECTOR_199      FLASH_SECTOR(199) // 0x18E00
#define FLASH_SECTOR_200      FLASH_SECTOR(200) // 0x19000
#define FLASH_SECTOR_201      FLASH_SECTOR(201) // 0x19200
#define FLASH_SECTOR_202      FLASH_SECTOR(202) // 0x19400
#define FLASH_SECTOR_203      FLASH_SECTOR(203) // 0x19600
#define FLASH_SECTOR_204      FLASH_SECTOR(204) // 0x19800
#define FLASH_SECTOR_205      FLASH_SECTOR(205) // 0x19A00
#define FLASH_SECTOR_206      FLASH_SECTOR(206) // 0x19C00
#define FLASH_SECTOR_207      FLASH_SECTOR(207) // 0x19E00
#define FLASH_SECTOR_208      FLASH_SECTOR(208) // 0x1A000
#define FLASH_SECTOR_209      FLASH_SECTOR(209) // 0x1A200
#define FLASH_SECTOR_210      FLASH_SECTOR(210) // 0x1A400
#define FLASH_SECTOR_211      FLASH_SECTOR(211) // 0x1A600
#define FLASH_SECTOR_212      FLASH_SECTOR(212) // 0x1A800
#define FLASH_SECTOR_213      FLASH_SECTOR(213) // 0x1AA00
#define FLASH_SECTOR_214      FLASH_SECTOR(214) // 0x1AC00
#define FLASH_SECTOR_215      FLASH_SECTOR(215) // 0x1AE00
#define FLASH_SECTOR_216      FLASH_SECTOR(216) // 0x1B000
#define FLASH_SECTOR_217      FLASH_SECTOR(217) // 0x1B200
#define FLASH_SECTOR_218      FLASH_SECTOR(218) // 0x1B400
#define FLASH_SECTOR_219      FLASH_SECTOR(219) // 0x1B600
#define FLASH_SECTOR_220      FLASH_SECTOR(220) // 0x1B800
#define FLASH_SECTOR_221      FLASH_SECTOR(221) // 0x1BA00
#define FLASH_SECTOR_222      FLASH_SECTOR(222) // 0x1BC00
#define FLASH_SECTOR_223      FLASH_SECTOR(223) // 0x1BE00
#define FLASH_SECTOR_224      FLASH_SECTOR(224) // 0x1C000
#define FLASH_SECTOR_225      FLASH_SECTOR(225) // 0x1C200
#define FLASH_SECTOR_226      FLASH_SECTOR(226) // 0x1C400
#define FLASH_SECTOR_227      FLASH_SECTOR(227) // 0x1C600
#define FLASH_SECTOR_228      FLASH_SECTOR(228) // 0x1C800
#define FLASH_SECTOR_229      FLASH_SECTOR(229) // 0x1CA00
#define FLASH_SECTOR_230      FLASH_SECTOR(230) // 0x1CC00
#define FLASH_SECTOR_231      FLASH_SECTOR(231) // 0x1CE00
#define FLASH_SECTOR_232      FLASH_SECTOR(232) // 0x1D000
#define FLASH_SECTOR_233      FLASH_SECTOR(233) // 0x1D200
#define FLASH_SECTOR_234      FLASH_SECTOR(234) // 0x1D400
#define FLASH_SECTOR_235      FLASH_SECTOR(235) // 0x1D600
#define FLASH_SECTOR_236      FLASH_SECTOR(236) // 0x1D800
#define FLASH_SECTOR_237      FLASH_SECTOR(237) // 0x1DA00
#define FLASH_SECTOR_238      FLASH_SECTOR(238) // 0x1DC00
#define FLASH_SECTOR_239      FLASH_SECTOR(239) // 0x1DE00
#define FLASH_SECTOR_240      FLASH_SECTOR(240) // 0x1E000
#define FLASH_SECTOR_241      FLASH_SECTOR(241) // 0x1E200
#define FLASH_SECTOR_242      FLASH_SECTOR(242) // 0x1E400
#define FLASH_SECTOR_243      FLASH_SECTOR(243) // 0x1E600
#define FLASH_SECTOR_244      FLASH_SECTOR(244) // 0x1E800
#define FLASH_SECTOR_245      FLASH_SECTOR(245) // 0x1EA00
#define FLASH_SECTOR_246      FLASH_SECTOR(246) // 0x1EC00
#define FLASH_SECTOR_247      FLASH_SECTOR(247) // 0x1EE00
#define FLASH_SECTOR_248      FLASH_SECTOR(248) // 0x1F000
#define FLASH_SECTOR_249      FLASH_SECTOR(249) // 0x1F200
#define FLASH_SECTOR_250      FLASH_SECTOR(250) // 0x1F400
#define FLASH_SECTOR_251      FLASH_SECTOR(251) // 0x1F600
#define FLASH_SECTOR_252      FLASH_SECTOR(252) // 0x1F800
#define FLASH_SECTOR_253      FLASH_SECTOR(253) // 0x1FA00
#define FLASH_SECTOR_254      FLASH_SECTOR(254) // 0x1FC00
#define FLASH_SECTOR_255      FLASH_SECTOR(255) // 0x1FE00

#define FLASH_SECTOR_END_128K FLASH_SECTOR_255 // 芯片容量为128k的最后一个扇区
#define FLASH_SECTOR_END_64K  FLASH_SECTOR_127 // 芯片容量为64k的最后一个扇区
#define FLASH_SECTOR_END_32K  FLASH_SECTOR_63  // 芯片容量为32k的最后一个扇区

/**
 * @brief 向指定地址写入数据
 * @param adr 目标地址
 * @param data 数据缓冲区指针
 * @param len 数据长度
 */
void FLASH_Write(uint32_t adr, uint8_t *data, uint32_t len);

/**
 * @brief 从指定地址读取数据
 *
 * @param adr 目标地址
 * @param buf 数据缓冲区指针
 * @param len 数据长度
 */
void FLASH_Read(uint32_t adr, uint8_t *data, uint32_t len);

/**
 * @brief 擦除指定扇区
 *
 * @param adr 目标地址
 */
void FLASH_Erase(uint32_t adr);

/**
 * @brief 向指定地址写入数据(NVR区域)
 * @param adr 目标地址
 * @param data 数据缓冲区指针
 * @param len 数据长度
 * @note 触发掉电检测后，对flash的操作无效，掉电检测的配置参考SYS_SetPowerFailureDetection
 */
void FLASH_WriteNvr(uint32_t adr, uint8_t *data, uint32_t len);

/**
 * @brief 擦除指定扇区(NVR区域)
 *
 * @param adr 目标地址
 * @note 触发掉电检测后，对flash的操作无效，掉电检测的配置参考SYS_SetPowerFailureDetection
 */
void FLASH_EraseNvr(uint32_t adr);
/**
 * @brief 从指定地址读取数据(NVR区域)
 *
 * @param adr 目标地址
 * @param buf 数据缓冲区指针
 * @param len 数据长度
 */
void FLASH_ReadNvr(uint32_t adr, uint8_t *data, uint32_t len);

#endif
