diff --git a/MDK-ARM/controller-v2.uvoptx b/MDK-ARM/controller-v2.uvoptx index f059961..57ce19e 100644 --- a/MDK-ARM/controller-v2.uvoptx +++ b/MDK-ARM/controller-v2.uvoptx @@ -682,7 +682,7 @@ Application/MDK-ARM - 1 + 0 0 0 0 @@ -702,7 +702,7 @@ Application/User/Core - 1 + 0 0 0 0 @@ -1278,7 +1278,7 @@ User/system - 0 + 1 0 0 0 diff --git a/User/lib/flow/flow.h b/User/lib/flow/flow.h index 3369a53..49871d5 100644 --- a/User/lib/flow/flow.h +++ b/User/lib/flow/flow.h @@ -95,6 +95,11 @@ */ #define FL_SEM_RELEASE(sem) FLOW_SEM_RELEASE((sem)) +/** + * 检测一个信号量是否被释放 + */ +#define FL_SEM_IS_RELEASE(fl ,sem) FLOW_SEM_IS_RELEASE((fl), (sem)) + /** * 初始化一个软件定时器 */ diff --git a/User/lib/flow/flow_sem.h b/User/lib/flow/flow_sem.h index 967440a..b524683 100644 --- a/User/lib/flow/flow_sem.h +++ b/User/lib/flow/flow_sem.h @@ -33,6 +33,8 @@ --(s)->count; \ } while (0) -#define FLOW_SEM_RELEASE(s) (++(s)->count) // 释放信号量s的计数值 +#define FLOW_SEM_RELEASE(s) (++(s)->count) + +#define FLOW_SEM_IS_RELEASE(f, s) (flow_tick - (f)->time) < ((s)->time) #endif /* __FLOW_SEM_H__ */ diff --git a/User/lib/inc/data_type_def.h b/User/lib/inc/data_type_def.h index 516f5e4..bae01cb 100644 --- a/User/lib/inc/data_type_def.h +++ b/User/lib/inc/data_type_def.h @@ -21,7 +21,8 @@ #define __IO volatile #endif -typedef unsigned char BOOL; /* boolean data */ +typedef unsigned char BOOL; /* boolean data */ +typedef unsigned char bool_t; /* boolean data */ #if !defined(__stdint_h) && !defined(_GCC_WRAP_STDINT_H) typedef unsigned char uint8_t; diff --git a/User/lib/inc/filter.h b/User/lib/inc/filter.h index ced893c..d13d1a3 100644 --- a/User/lib/inc/filter.h +++ b/User/lib/inc/filter.h @@ -33,12 +33,12 @@ typedef struct typedef struct { - uint16_t size; // 滑动窗口大小 - float32 *window; // 滑动窗口 - float32 out; // 滤波结果 - uint16_t index; // 滑动窗口索引 - uint16_t sum; -} lpf_window_t; // 滑动窗口滤波器 + uint16_t size; // 滑动窗口大小 + float32 *window; // 滑动窗口 + volatile float32 sum; // 滑动窗口和 + volatile float32 out; // 滤波结果 + uint16_t index; // 滑动窗口索引 +} lpf_window_t; // 滑动窗口滤波器 void kalman_init(kalman_t *cfg); void kalman_reset(kalman_t *cfg); diff --git a/User/lib/inc/lib.h b/User/lib/inc/lib.h index 42c7507..cdb16d2 100644 --- a/User/lib/inc/lib.h +++ b/User/lib/inc/lib.h @@ -60,14 +60,15 @@ extern uint16_t crc16_compute(const uint8_t *const uc_ptr, uint16_t uc_len); // extern uint8_t xor_compute(const uint8_t *const uc_ptr, uint16_t uc_len); // 异或校验 extern uint8_t get_bit_num(uint8_t bit); // 获取bit位的值 extern BOOL is_bit_set(int x, int k); // 判断x的第k位是否为1 -extern uint8_t isLeap(uint16_t year); // 检查是否是闰年 +extern uint8_t isLeap(uint16_t year); // 检查是否是闰年 extern uint16_t dayOfyear(uint16_t year, uint8_t month, uint8_t day); // 计算一年中的第几天 extern uint16_t weekOfyear(uint16_t year, uint8_t month, uint8_t day); // 计算一年中的第几周 extern uint8_t get_weekday(uint16_t year, uint8_t month, uint8_t day); // 获取今天星期几 extern uint8_t hex_format_dec(uint8_t hex); // 十六进制转十进制 extern uint8_t dec_format_hex(uint8_t dec); // 十进制转十六进制 +extern void quicksort(uint16_t arr[], int low, int high); // 快速排序 -uint32_t time2Stamp(rtc_date_t date, rtc_time_t time); // 北京时间转时间戳 +extern uint32_t time2Stamp(rtc_date_t date, rtc_time_t time); // 北京时间转时间戳 extern void stamp2Time(uint32_t stamp, rtc_date_t *date, rtc_time_t *time); // 时间戳转北京时间 #endif //__LIB_H diff --git a/User/lib/inc/malloc.h b/User/lib/inc/malloc.h index 5e33c76..31dc53e 100644 --- a/User/lib/inc/malloc.h +++ b/User/lib/inc/malloc.h @@ -15,7 +15,7 @@ // mem1内存参数设定.mem1完全处于内部SRAM里面.(设置内部SARM的内存池和内存表的参数) #define MEM1_BLOCK_SIZE 32 // 一个内存块大小为32字节 -#define MEM1_MAX_SIZE 30 * 1024 // 最大管理内存 1K (我们这个内存管理系统的内部SRAM可控制的内存大小) +#define MEM1_MAX_SIZE 20 * 1024 // 最大管理内存 1K (我们这个内存管理系统的内部SRAM可控制的内存大小) #define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE / MEM1_BLOCK_SIZE // 内存表大小(有多少块内存块) // mem2内存参数设定.mem2的内存池处于外部SRAM里面 diff --git a/User/lib/inc/osel_arch.h b/User/lib/inc/osel_arch.h index bb3da64..ed2b607 100644 --- a/User/lib/inc/osel_arch.h +++ b/User/lib/inc/osel_arch.h @@ -15,16 +15,28 @@ #define hal_int_state_t char #ifdef STM32 #include "stm32l4xx.h" +#define HAL_ENTER_CRITICAL(__HANDLE__) \ + do \ + { \ + if ((__HANDLE__)->Lock == HAL_LOCKED) \ + { \ + return HAL_BUSY; \ + } \ + else \ + { \ + (__HANDLE__)->Lock = HAL_LOCKED; \ + } \ + } while (0U) -#define HAL_ENTER_CRITICAL(s) \ - s = s; \ - __ASM volatile("cpsid i"); -#define HAL_EXIT_CRITICAL(s) \ - __ASM volatile("cpsie i"); +#define HAL_EXIT_CRITICAL(__HANDLE__) \ + do \ + { \ + (__HANDLE__)->Lock = HAL_UNLOCKED; \ + } while (0U) #else -#define HAL_ENTER_CRITICAL(s) +#define HAL_ENTER_CRITICAL(__HANDLE__) -#define HAL_EXIT_CRITICAL(s) +#define HAL_EXIT_CRITICAL(__HANDLE__) #endif @@ -39,7 +51,6 @@ #define osel_mem_free2 _free2 #define osel_mstrlen _mstrlen -#define osel_quick_sort _quick_sort static inline void *_malloc(uint32_t size) { @@ -127,32 +138,4 @@ static inline unsigned int _mstrlen(const unsigned char *s) return ss - s; } -// 快速排序 -static inline void _quick_sort(uint16_t *array, int left, int right) -{ - if (left >= right) - { - return; - } - int i = left; - int j = right; - uint16_t key = array[left]; - while (i < j) - { - while (i < j && array[j] > key) - { - j--; - } - array[i] = array[j]; - while (i < j && array[i] <= key) - { - i++; - } - array[j] = array[i]; - } - array[i] = key; - _quick_sort(array, left, i - 1); - _quick_sort(array, i + 1, right); -} - #endif // __OSEL_ARCH_H__ diff --git a/User/lib/lcd/gui/Font/HZ20x20.c b/User/lib/lcd/gui/Font/HZ20x20.c index d74f522..12ed338 100644 --- a/User/lib/lcd/gui/Font/HZ20x20.c +++ b/User/lib/lcd/gui/Font/HZ20x20.c @@ -81,8 +81,8 @@ static GUI_CONST_STORAGE unsigned char ac0032[60] = { ________, ______XX, XXX_____, ________, _______X, XX______}; -/* char: code:0x0034 */ -static GUI_CONST_STORAGE unsigned char ac0034[60] = { +/* char: code:0x0033 */ +static GUI_CONST_STORAGE unsigned char ac0033[60] = { ________, ________, ________, ________, ________, ________, ________, ________, ________, @@ -104,24 +104,90 @@ static GUI_CONST_STORAGE unsigned char ac0034[60] = { ________, ________, ________, ________, ________, ________}; -static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[4] = { +/* char: code:0x0034 */ +static GUI_CONST_STORAGE unsigned char ac0034[60] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, _______X, ________, + ___X____, _X____X_, X_______, + __X_X___, X_X__X__, ________, + ___X____, _X____X_, X_______, + ________, _______X, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: code:0x0035 */ +static GUI_CONST_STORAGE unsigned char ac0035[60] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ___X____, ________, ________, + __X_XX__, _X_____X, ________, + _____X__, X_X___X_, X_______, + __X_XX__, _X_____X, ________, + ___X____, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: code:0x0036 */ +static GUI_CONST_STORAGE unsigned char ac0036[60] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, _X______, ________, + ___X____, X_X____X, ________, + __X_X__X, ___X__X_, X_______, + ___X____, X_X____X, ________, + ________, _X______, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[7] = { {19, 19, 3, (unsigned char *)&ac0030}, /*0: */ {20, 20, 3, (unsigned char *)&ac0031}, /*1: */ {20, 20, 3, (unsigned char *)&ac0032}, /*2: */ - {19, 19, 3, (unsigned char *)&ac0034}, /*3: */ + {19, 19, 3, (unsigned char *)&ac0033}, /*3: */ + {17, 17, 3, (unsigned char *)&ac0034}, /*4: */ + {17, 17, 3, (unsigned char *)&ac0035}, /*5: */ + {17, 17, 3, (unsigned char *)&ac0036}, /*6: */ }; -static GUI_CONST_STORAGE GUI_FONT_PROP Prop2 = { - 0x0034, /*start :*/ - 0x0034, /*end :, len=1*/ - &Cinfo[3], - (void *)0}; - static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = { 0x0030, /*start :*/ - 0x0032, /*end :, len=3*/ + 0x0036, /*end :, len=7*/ &Cinfo[0], - &Prop2}; + (void *)0}; GUI_CONST_STORAGE GUI_FONT GUI_FontHZ20x20 = { GUI_FONTTYPE_PROP_SJIS, diff --git a/User/lib/lcd/gui/Font/HZ24x24.c b/User/lib/lcd/gui/Font/HZ24x24.c index c78e11a..50b1811 100644 --- a/User/lib/lcd/gui/Font/HZ24x24.c +++ b/User/lib/lcd/gui/Font/HZ24x24.c @@ -3727,6 +3727,82 @@ static GUI_CONST_STORAGE unsigned char acB1E0[72] = { ________, }; +/* char: 变 code:0xB1E4 */ +static GUI_CONST_STORAGE unsigned char acB1E4[72] = { + ________, + ________, + ________, + ________, + __XX____, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ____XX__, + _XXXXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + _XX___XX, + ________, + ________, + _XX___XX, + ________, + ______XX, + XXX___XX, + XXX_____, + _____XXX, + _XX___XX, + __XX____, + ____XXX_, + _XX___XX, + ___XXX__, + ____XX__, + _XX___XX, + ____XXX_, + ___XX___, + _XX___XX, + _XX__XX_, + __XXXXXX, + XXXXXXXX, + XXXX____, + ________, + XX______, + XXX_____, + ________, + _XX____X, + XX______, + ________, + _XX___XX, + X_______, + ________, + __XX__XX, + ________, + ________, + ___XXXX_, + ________, + ________, + ___XXX__, + ________, + ________, + __XXXXXX, + ________, + ________, + XXX____X, + XXX_____, + _____XXX, + X_______, + _XXXXXXX, + __XXXX__, + ________, + ___XXX__, + ________, + ________, + ________, +}; + /* char: 标 code:0xB1EA */ static GUI_CONST_STORAGE unsigned char acB1EA[72] = { ________, @@ -5703,6 +5779,82 @@ static GUI_CONST_STORAGE unsigned char acB5AF[72] = { ________, }; +/* char: 当 code:0xB5B1 */ +static GUI_CONST_STORAGE unsigned char acB5B1[72] = { + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ________, + ________, + ___XXX__, + ________, + ____XX__, + ___XXX__, + _XXX____, + _____XXX, + ___XXX__, + _XXX____, + ______XX, + X__XXX__, + XXX_____, + ______XX, + X__XXX__, + XX______, + _______X, + X__XXX_X, + X_______, + ________, + ___XXXXX, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ____XXXX, + XXXXXXXX, + XXXXXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + __XXXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ________, +}; + /* char: 等 code:0xB5C8 */ static GUI_CONST_STORAGE unsigned char acB5C8[72] = { ________, @@ -6463,6 +6615,82 @@ static GUI_CONST_STORAGE unsigned char acB7A7[72] = { ________, }; +/* char: 法 code:0xB7A8 */ +static GUI_CONST_STORAGE unsigned char acB7A8[72] = { + ________, + ________, + ________, + ________, + ______XX, + ________, + ___XXX__, + ______XX, + X_______, + ____XXX_, + ______XX, + ________, + _____XX_, + ______XX, + ________, + _____XX_, + XX____XX, + ________, + ________, + XXXXXXXX, + XXXXXX__, + _XX____X, + X_____XX, + ________, + __XX___X, + X_____XX, + ________, + __XXX__X, + X_____XX, + ________, + ___XX_XX, + ______XX, + ________, + ___XX_XX, + ______XX, + _____XX_, + _____XXX, + XXXXXXXX, + XXXXXXXX, + _____XX_, + ______XX, + ________, + _____XX_, + _____XXX, + ________, + ____XX__, + _____XX_, + ________, + _XXXXX__, + ____XXX_, + ________, + ___XXX__, + ___XXX__, + _XX_____, + ___XXX__, + ___XX___, + __XXX___, + ___XXX__, + __XX____, + ___XXX__, + ___XXX__, + _XX___XX, + XXXXXXX_, + ___XXX__, + XXXXXXX_, + ____XXX_, + ________, + _XX_____, + _____XX_, + ________, + ________, + ________, +}; + /* char: 反 code:0xB7B4 */ static GUI_CONST_STORAGE unsigned char acB7B4[72] = { ________, @@ -7907,6 +8135,82 @@ static GUI_CONST_STORAGE unsigned char acBACF[72] = { ________, }; +/* char: 衡 code:0xBAE2 */ +static GUI_CONST_STORAGE unsigned char acBAE2[72] = { + ________, + ________, + ________, + ________, + __XX____, + ________, + _____XX_, + __XX____, + ________, + ____XXX_, + _XXX____, + XXXXXXX_, + ____XX__, + _XXXXXXX, + ________, + ___XX___, + XXX__XX_, + ________, + __XX____, + XX__XX__, + ________, + _XX____X, + XXXXXXXX, + X____XX_, + _____XXX, + XX_XX_XX, + XXXXXXX_, + _____XX_, + XX_XX_XX, + ___XX___, + ____XXX_, + XXXXXXXX, + ___XX___, + ____XX__, + XX_XX_XX, + ___XX___, + ___XXX__, + XX_XX_XX, + ___XX___, + __XXXX__, + XXXXXXXX, + ___XX___, + _XX_XX__, + XX_XX_XX, + ___XX___, + ____XX__, + ___XX__X, + X__XX___, + ____XXXX, + XXXXXXXX, + XX_XX___, + ____XX__, + __XXX___, + ___XX___, + ____XX__, + __XXXX__, + ___XX___, + ____XX__, + __XX_XXX, + ___XX___, + ____XX__, + _XX___XX, + ___XX___, + ____XX_X, + XX____XX, + _XXXX___, + ____XXXX, + ________, + __XX____, + ________, + ________, + ________, +}; + /* char: 后 code:0xBAF3 */ static GUI_CONST_STORAGE unsigned char acBAF3[72] = { ________, @@ -11707,6 +12011,158 @@ static GUI_CONST_STORAGE unsigned char acC5C5[72] = { ________, }; +/* char: 频 code:0xC6B5 */ +static GUI_CONST_STORAGE unsigned char acC6B5[72] = { + ________, + ________, + ________, + _______X, + X_______, + _____XX_, + _______X, + X__XXXXX, + XXXXXXXX, + _______X, + X_______, + XXX_____, + ____XXXX, + X_______, + XX______, + ____XX_X, + XXXX____, + XX______, + ____XX_X, + X____XXX, + XXXXXXX_, + ____XX_X, + X____XX_, + _____XX_, + ____XX_X, + X____XX_, + _____XX_, + _XXXXXXX, + XXXXXXX_, + _XX__XX_, + _______X, + X____XX_, + _XX__XX_, + _______X, + X____XX_, + _XX__XX_, + ____XX_X, + X____XX_, + _XX__XX_, + ____XX_X, + X_XX_XX_, + _XX__XX_, + ___XX__X, + X_XXXXX_, + XXX__XX_, + ___XX__X, + XXXX_XX_, + XXX__XX_, + __XX____, + _XX__XX_, + XX______, + _XX_____, + XX______, + XX______, + _______X, + XX_____X, + XXXXX___, + ______XX, + X______X, + X___XXX_, + _____XX_, + _____XXX, + ____XXX_, + ___XXX__, + ____XX__, + _____XXX, + __XX____, + __XXX___, + ________, + ________, + ________, + ________, +}; + +/* char: 平 code:0xC6BD */ +static GUI_CONST_STORAGE unsigned char acC6BD[72] = { + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + __XX____, + _____XX_, + ___XXX__, + _XXX____, + ______XX, + X__XXX__, + _XX_____, + _______X, + X__XXX__, + XX______, + _______X, + X__XXX_X, + X_______, + ________, + ___XXXXX, + ____XX__, + _XXXXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XXX__, + ________, + ________, + ___XX___, + ________, + ________, + ________, + ________, +}; + /* char: 屏 code:0xC6C1 */ static GUI_CONST_STORAGE unsigned char acC6C1[72] = { ________, @@ -12163,6 +12619,82 @@ static GUI_CONST_STORAGE unsigned char acC6F8[72] = { ________, }; +/* char: 前 code:0xC7B0 */ +static GUI_CONST_STORAGE unsigned char acC7B0[72] = { + ________, + ________, + ________, + _______X, + X_______, + ________, + ________, + XX_____X, + XX______, + ________, + XXX____X, + X_______, + ________, + _XX___XX, + ____XX__, + _XXXXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + __XX____, + ____XXXX, + XXXX__XX, + __XXX___, + ____XX__, + __XX__XX, + X_XXX___, + ____XX__, + __XX__XX, + __XXX___, + ____XX__, + __XX__XX, + __XXX___, + ____XXXX, + XXXX__XX, + __XXX___, + ____XX__, + __XX__XX, + __XXX___, + ____XX__, + __XX__XX, + __XXX___, + ____XX__, + __XX__XX, + __XXX___, + ____XXXX, + XXXX__XX, + __XXX___, + ____XX__, + __XX__XX, + __XXX___, + ____XX__, + __XX__XX, + X_XXX___, + ____XX__, + __XX____, + __XXX___, + ____XX__, + __XX___X, + X_XXX___, + ____XX_X, + XXXX____, + XXXX____, + ____XX__, + _XX_____, + _XX_____, + ________, + ________, + ________, +}; + /* char: 切 code:0xC7D0 */ static GUI_CONST_STORAGE unsigned char acC7D0[72] = { ________, @@ -14671,6 +15203,82 @@ static GUI_CONST_STORAGE unsigned char acCBD9[72] = { ________, }; +/* char: 算 code:0xCBE3 */ +static GUI_CONST_STORAGE unsigned char acCBE3[72] = { + ________, + ________, + ________, + ______XX, + _______X, + X_______, + _____XXX, + _______X, + X_______, + _____XXX, + XXXXX_XX, + ________, + ____XX__, + XX____XX, + XXXXXXX_, + ____XX__, + XXX__XX_, + _XXX____, + ___XX___, + XX__XX__, + __XXX___, + __XX__XX, + XXXXXXXX, + XXXX____, + ______XX, + ________, + _XX_____, + ______XX, + XXXXXXXX, + XXX_____, + ______XX, + ________, + _XX_____, + ______XX, + XXXXXXXX, + XXX_____, + ______XX, + ________, + _XX_____, + ______XX, + ________, + _XX_____, + ______XX, + XXXXXXXX, + XXX_____, + ______XX, + _XX___XX, + XXX_____, + ________, + XXX___XX, + X_______, + __XXXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + XXX___XX, + X_______, + ________, + XX____XX, + X_______, + _______X, + X_____XX, + X_______, + _____XXX, + ______XX, + X_______, + ___XXX__, + ______XX, + ________, + ________, + ________, + ________, +}; + /* char: 他 code:0xCBFB */ static GUI_CONST_STORAGE unsigned char acCBFB[72] = { ________, @@ -17559,6 +18167,82 @@ static GUI_CONST_STORAGE unsigned char acD2C6[72] = { ________, }; +/* char: 已 code:0xD2D1 */ +static GUI_CONST_STORAGE unsigned char acD2D1[72] = { + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + ____XXXX, + XXXXXXXX, + XXXX____, + ________, + ________, + _XXX____, + ________, + ________, + _XXX____, + ________, + ________, + _XXX____, + ________, + ________, + _XXX____, + ____XX__, + ________, + _XXX____, + ____XXX_, + ________, + _XXX____, + ____XXXX, + XXXXXXXX, + XXXX____, + ____XXX_, + ________, + _XXX____, + ____XXX_, + ________, + ________, + ____XXX_, + ________, + ________, + ____XXX_, + ________, + ________, + ____XXX_, + ________, + ________, + ____XXX_, + ________, + ____XX__, + ____XXX_, + ________, + ____XX__, + ____XXX_, + ________, + ____XX__, + ____XXX_, + ________, + ____XX__, + ____XXX_, + ________, + ____XXX_, + _____XXX, + XXXXXXXX, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, +}; + /* char: 义 code:0xD2E5 */ static GUI_CONST_STORAGE unsigned char acD2E5[72] = { ________, @@ -18091,6 +18775,82 @@ static GUI_CONST_STORAGE unsigned char acD3EF[72] = { ________, }; +/* char: 域 code:0xD3F2 */ +static GUI_CONST_STORAGE unsigned char acD3F2[72] = { + ________, + ________, + ________, + ________, + _______X, + X_XX____, + ____XXX_, + _______X, + XX_XX___, + ____XXX_, + _______X, + XX_XXX__, + ____XXX_, + _______X, + XX__XX__, + ____XXX_, + _______X, + XX___XX_, + ____XXX_, + XXXXXXXX, + XXXXXXX_, + ____XXXX, + X______X, + XX______, + _XXXXXXX, + XX_____X, + XX______, + ____XXX_, + _XXXXXXX, + XX__XX__, + ____XXX_, + _XXX_XX_, + XX_XXX__, + ____XXX_, + _XXX_XX_, + XX_XXX__, + ____XXX_, + _XXX_XX_, + XX_XX___, + ____XXX_, + _XXXXXX_, + XXXXX___, + ____XXX_, + _XXX_XX_, + XXXX____, + ____XXX_, + ________, + XXXX____, + ____XXXX, + X_____XX, + XXX___XX, + _XXXXX__, + ___XXXX_, + XXXX__XX, + __XX___X, + XXXX___X, + X_XX__XX, + ________, + XX____XX, + __XXXXX_, + ________, + _____XX_, + ___XXXX_, + ________, + ____XX__, + ____XXXX, + ________, + __XXX___, + ______XX, + ________, + ________, + ________, +}; + /* char: 源 code:0xD4B4 */ static GUI_CONST_STORAGE unsigned char acD4B4[72] = { ________, @@ -20143,7 +20903,7 @@ static GUI_CONST_STORAGE unsigned char acD7F7[72] = { ________, }; -static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[328] = { +static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[338] = { {10, 10, 1, (unsigned char *)&ac000A}, /*0: */ {10, 10, 1, (unsigned char *)&ac000D}, /*1: @@ -20258,1481 +21018,1545 @@ static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[328] = { {24, 24, 3, (unsigned char *)&acB1BE}, /*109: 本*/ {23, 23, 3, (unsigned char *)&acB1D5}, /*110: 闭*/ {23, 23, 3, (unsigned char *)&acB1E0}, /*111: 编*/ - {24, 24, 3, (unsigned char *)&acB1EA}, /*112: 标*/ - {24, 24, 3, (unsigned char *)&acB2C1}, /*113: 擦*/ - {24, 24, 3, (unsigned char *)&acB2CB}, /*114: 菜*/ - {24, 24, 3, (unsigned char *)&acB2CE}, /*115: 参*/ - {22, 22, 3, (unsigned char *)&acB2E2}, /*116: 测*/ - {24, 24, 3, (unsigned char *)&acB2E9}, /*117: 查*/ - {23, 23, 3, (unsigned char *)&acB2EE}, /*118: 差*/ - {23, 23, 3, (unsigned char *)&acB3A3}, /*119: 常*/ - {23, 23, 3, (unsigned char *)&acB3A7}, /*120: 厂*/ - {24, 24, 3, (unsigned char *)&acB3AC}, /*121: 超*/ - {24, 24, 3, (unsigned char *)&acB3C9}, /*122: 成*/ - {24, 24, 3, (unsigned char *)&acB3CC}, /*123: 程*/ - {24, 24, 3, (unsigned char *)&acB3D6}, /*124: 持*/ - {22, 22, 3, (unsigned char *)&acB3F6}, /*125: 出*/ - {23, 23, 3, (unsigned char *)&acB3FD}, /*126: 除*/ - {24, 24, 3, (unsigned char *)&acB4A5}, /*127: 触*/ - {23, 23, 3, (unsigned char *)&acB4A6}, /*128: 处*/ - {23, 23, 3, (unsigned char *)&acB4AB}, /*129: 传*/ - {24, 24, 3, (unsigned char *)&acB4C5}, /*130: 磁*/ - {24, 24, 3, (unsigned char *)&acB4CE}, /*131: 次*/ - {23, 23, 3, (unsigned char *)&acB4E6}, /*132: 存*/ - {24, 24, 3, (unsigned char *)&acB4ED}, /*133: 错*/ - {23, 23, 3, (unsigned char *)&acB4F3}, /*134: 大*/ - {23, 23, 3, (unsigned char *)&acB4FD}, /*135: 待*/ - {23, 23, 3, (unsigned char *)&acB5A5}, /*136: 单*/ - {23, 23, 3, (unsigned char *)&acB5AF}, /*137: 弹*/ - {23, 23, 3, (unsigned char *)&acB5C8}, /*138: 等*/ - {24, 24, 3, (unsigned char *)&acB5D8}, /*139: 地*/ - {23, 23, 3, (unsigned char *)&acB5E7}, /*140: 电*/ - {23, 23, 3, (unsigned char *)&acB5F7}, /*141: 调*/ - {23, 23, 3, (unsigned char *)&acB6A8}, /*142: 定*/ - {23, 23, 3, (unsigned char *)&acB6AF}, /*143: 动*/ - {24, 24, 3, (unsigned char *)&acB6C8}, /*144: 度*/ - {23, 23, 3, (unsigned char *)&acB6CF}, /*145: 断*/ - {24, 24, 3, (unsigned char *)&acB7A2}, /*146: 发*/ - {23, 23, 3, (unsigned char *)&acB7A7}, /*147: 阀*/ - {24, 24, 3, (unsigned char *)&acB7B4}, /*148: 反*/ - {23, 23, 3, (unsigned char *)&acB7B6}, /*149: 范*/ - {24, 24, 3, (unsigned char *)&acB7BD}, /*150: 方*/ - {24, 24, 3, (unsigned char *)&acB7D6}, /*151: 分*/ - {23, 23, 3, (unsigned char *)&acB7F1}, /*152: 否*/ - {24, 24, 3, (unsigned char *)&acB8B4}, /*153: 复*/ - {24, 24, 3, (unsigned char *)&acB8D0}, /*154: 感*/ - {23, 23, 3, (unsigned char *)&acB8DF}, /*155: 高*/ - {23, 23, 3, (unsigned char *)&acB8F1}, /*156: 格*/ - {23, 23, 3, (unsigned char *)&acB9A4}, /*157: 工*/ - {23, 23, 3, (unsigned char *)&acB9A6}, /*158: 功*/ - {24, 24, 3, (unsigned char *)&acB9A9}, /*159: 供*/ - {23, 23, 3, (unsigned char *)&acB9AB}, /*160: 公*/ - {23, 23, 3, (unsigned char *)&acB9B9}, /*161: 构*/ - {24, 24, 3, (unsigned char *)&acB9CA}, /*162: 故*/ - {24, 24, 3, (unsigned char *)&acB9D8}, /*163: 关*/ - {24, 24, 3, (unsigned char *)&acB9E6}, /*164: 规*/ - {23, 23, 3, (unsigned char *)&acBAC5}, /*165: 号*/ - {23, 23, 3, (unsigned char *)&acBACF}, /*166: 合*/ - {23, 23, 3, (unsigned char *)&acBAF3}, /*167: 后*/ - {23, 23, 3, (unsigned char *)&acBBA4}, /*168: 护*/ - {24, 24, 3, (unsigned char *)&acBBB6}, /*169: 欢*/ - {24, 24, 3, (unsigned char *)&acBBC9}, /*170: 簧*/ - {23, 23, 3, (unsigned char *)&acBBD6}, /*171: 恢*/ - {24, 24, 3, (unsigned char *)&acBBEC}, /*172: 混*/ - {24, 24, 3, (unsigned char *)&acBBEE}, /*173: 活*/ - {24, 24, 3, (unsigned char *)&acBBF2}, /*174: 或*/ - {24, 24, 3, (unsigned char *)&acBBFA}, /*175: 机*/ - {23, 23, 3, (unsigned char *)&acBBFD}, /*176: 积*/ - {24, 24, 3, (unsigned char *)&acBCA4}, /*177: 激*/ - {23, 23, 3, (unsigned char *)&acBCAD}, /*178: 辑*/ - {24, 24, 3, (unsigned char *)&acBCB6}, /*179: 级*/ - {24, 24, 3, (unsigned char *)&acBCBC}, /*180: 技*/ - {23, 23, 3, (unsigned char *)&acBCC6}, /*181: 计*/ - {23, 23, 3, (unsigned char *)&acBCCA}, /*182: 际*/ - {23, 23, 3, (unsigned char *)&acBCD3}, /*183: 加*/ - {22, 22, 3, (unsigned char *)&acBCE4}, /*184: 间*/ - {23, 23, 3, (unsigned char *)&acBCEC}, /*185: 检*/ - {24, 24, 3, (unsigned char *)&acBCF5}, /*186: 减*/ - {24, 24, 3, (unsigned char *)&acBDAD}, /*187: 江*/ - {22, 22, 3, (unsigned char *)&acBDC7}, /*188: 角*/ - {23, 23, 3, (unsigned char *)&acBDDA}, /*189: 节*/ - {23, 23, 3, (unsigned char *)&acBDE1}, /*190: 结*/ - {23, 23, 3, (unsigned char *)&acBDE9}, /*191: 介*/ - {24, 24, 3, (unsigned char *)&acBDF8}, /*192: 进*/ - {24, 24, 3, (unsigned char *)&acBDFB}, /*193: 禁*/ - {23, 23, 3, (unsigned char *)&acBEAF}, /*194: 警*/ - {23, 23, 3, (unsigned char *)&acBEDE}, /*195: 巨*/ - {23, 23, 3, (unsigned char *)&acBFAA}, /*196: 开*/ - {23, 23, 3, (unsigned char *)&acBFD8}, /*197: 控*/ - {24, 24, 3, (unsigned char *)&acBFE9}, /*198: 块*/ - {24, 24, 3, (unsigned char *)&acBFEC}, /*199: 快*/ - {22, 22, 3, (unsigned char *)&acC0DB}, /*200: 累*/ - {23, 23, 3, (unsigned char *)&acC0E0}, /*201: 类*/ - {23, 23, 3, (unsigned char *)&acC0EB}, /*202: 离*/ - {24, 24, 3, (unsigned char *)&acC0ED}, /*203: 理*/ - {23, 23, 3, (unsigned char *)&acC1A6}, /*204: 力*/ - {24, 24, 3, (unsigned char *)&acC1AC}, /*205: 连*/ - {24, 24, 3, (unsigned char *)&acC1BF}, /*206: 量*/ - {24, 24, 3, (unsigned char *)&acC1F7}, /*207: 流*/ - {23, 23, 3, (unsigned char *)&acC2CA}, /*208: 率*/ - {24, 24, 3, (unsigned char *)&acC2DF}, /*209: 逻*/ - {22, 22, 3, (unsigned char *)&acC3C5}, /*210: 门*/ - {24, 24, 3, (unsigned char *)&acC4A3}, /*211: 模*/ - {23, 23, 3, (unsigned char *)&acC4A6}, /*212: 摩*/ - {23, 23, 3, (unsigned char *)&acC4BB}, /*213: 幕*/ - {20, 20, 3, (unsigned char *)&acC4BF}, /*214: 目*/ - {24, 24, 3, (unsigned char *)&acC4DC}, /*215: 能*/ - {24, 24, 3, (unsigned char *)&acC5C5}, /*216: 排*/ - {23, 23, 3, (unsigned char *)&acC6C1}, /*217: 屏*/ - {23, 23, 3, (unsigned char *)&acC6DA}, /*218: 期*/ - {23, 23, 3, (unsigned char *)&acC6E4}, /*219: 其*/ - {21, 21, 3, (unsigned char *)&acC6F4}, /*220: 启*/ - {23, 23, 3, (unsigned char *)&acC6F7}, /*221: 器*/ - {23, 23, 3, (unsigned char *)&acC6F8}, /*222: 气*/ - {23, 23, 3, (unsigned char *)&acC7D0}, /*223: 切*/ - {24, 24, 3, (unsigned char *)&acC7F3}, /*224: 求*/ - {22, 22, 3, (unsigned char *)&acC7F8}, /*225: 区*/ - {22, 22, 3, (unsigned char *)&acC7FA}, /*226: 曲*/ - {24, 24, 3, (unsigned char *)&acC7FD}, /*227: 驱*/ - {24, 24, 3, (unsigned char *)&acC8A1}, /*228: 取*/ - {24, 24, 3, (unsigned char *)&acC8AB}, /*229: 全*/ - {23, 23, 3, (unsigned char *)&acC8B7}, /*230: 确*/ - {23, 23, 3, (unsigned char *)&acC8CF}, /*231: 认*/ - {20, 20, 3, (unsigned char *)&acC8D5}, /*232: 日*/ - {24, 24, 3, (unsigned char *)&acC8EB}, /*233: 入*/ - {23, 23, 3, (unsigned char *)&acC9CF}, /*234: 上*/ - {23, 23, 3, (unsigned char *)&acC9DC}, /*235: 绍*/ - {24, 24, 3, (unsigned char *)&acC9E8}, /*236: 设*/ - {24, 24, 3, (unsigned char *)&acCAA7}, /*237: 失*/ - {23, 23, 3, (unsigned char *)&acCAAF}, /*238: 石*/ - {23, 23, 3, (unsigned char *)&acCAB1}, /*239: 时*/ - {23, 23, 3, (unsigned char *)&acCAB5}, /*240: 实*/ - {24, 24, 3, (unsigned char *)&acCAB9}, /*241: 使*/ - {24, 24, 3, (unsigned char *)&acCABD}, /*242: 式*/ - {23, 23, 3, (unsigned char *)&acCABE}, /*243: 示*/ - {23, 23, 3, (unsigned char *)&acCAC7}, /*244: 是*/ - {24, 24, 3, (unsigned char *)&acCAD4}, /*245: 试*/ - {23, 23, 3, (unsigned char *)&acCAD6}, /*246: 手*/ - {23, 23, 3, (unsigned char *)&acCAE4}, /*247: 输*/ - {23, 23, 3, (unsigned char *)&acCAF5}, /*248: 术*/ - {23, 23, 3, (unsigned char *)&acCAF8}, /*249: 束*/ - {23, 23, 3, (unsigned char *)&acCAFD}, /*250: 数*/ - {23, 23, 3, (unsigned char *)&acCBAB}, /*251: 双*/ - {21, 21, 3, (unsigned char *)&acCBBE}, /*252: 司*/ - {24, 24, 3, (unsigned char *)&acCBC0}, /*253: 死*/ - {23, 23, 3, (unsigned char *)&acCBD5}, /*254: 苏*/ - {24, 24, 3, (unsigned char *)&acCBD9}, /*255: 速*/ - {24, 24, 3, (unsigned char *)&acCBFB}, /*256: 他*/ - {24, 24, 3, (unsigned char *)&acCCD8}, /*257: 特*/ - {24, 24, 3, (unsigned char *)&acCCE1}, /*258: 提*/ - {24, 24, 3, (unsigned char *)&acCCF5}, /*259: 条*/ - {23, 23, 3, (unsigned char *)&acCDA3}, /*260: 停*/ - {23, 23, 3, (unsigned char *)&acCDA8}, /*261: 通*/ - {23, 23, 3, (unsigned char *)&acCDEA}, /*262: 完*/ - {23, 23, 3, (unsigned char *)&acCEA7}, /*263: 围*/ - {24, 24, 3, (unsigned char *)&acCEAC}, /*264: 维*/ - {24, 24, 3, (unsigned char *)&acCEBB}, /*265: 位*/ - {24, 24, 3, (unsigned char *)&acCEC2}, /*266: 温*/ - {23, 23, 3, (unsigned char *)&acCEC4}, /*267: 文*/ - {24, 24, 3, (unsigned char *)&acCEDE}, /*268: 无*/ - {24, 24, 3, (unsigned char *)&acCEF3}, /*269: 误*/ - {23, 23, 3, (unsigned char *)&acCFA2}, /*270: 息*/ - {23, 23, 3, (unsigned char *)&acCFB8}, /*271: 细*/ - {23, 23, 3, (unsigned char *)&acCFC2}, /*272: 下*/ - {23, 23, 3, (unsigned char *)&acCFD4}, /*273: 显*/ - {23, 23, 3, (unsigned char *)&acCFDE}, /*274: 限*/ - {23, 23, 3, (unsigned char *)&acCFDF}, /*275: 线*/ - {23, 23, 3, (unsigned char *)&acCFEA}, /*276: 详*/ - {22, 22, 3, (unsigned char *)&acCFF2}, /*277: 向*/ - {23, 23, 3, (unsigned char *)&acCFFB}, /*278: 消*/ - {23, 23, 3, (unsigned char *)&acD0A1}, /*279: 小*/ - {24, 24, 3, (unsigned char *)&acD0A3}, /*280: 校*/ - {23, 23, 3, (unsigned char *)&acD0C5}, /*281: 信*/ - {23, 23, 3, (unsigned char *)&acD0CD}, /*282: 型*/ - {23, 23, 3, (unsigned char *)&acD0D0}, /*283: 行*/ - {24, 24, 3, (unsigned char *)&acD0D4}, /*284: 性*/ - {24, 24, 3, (unsigned char *)&acD0ED}, /*285: 许*/ - {23, 23, 3, (unsigned char *)&acD0F8}, /*286: 续*/ - {23, 23, 3, (unsigned char *)&acD1A1}, /*287: 选*/ - {24, 24, 3, (unsigned char *)&acD1B6}, /*288: 讯*/ - {23, 23, 3, (unsigned char *)&acD1B9}, /*289: 压*/ - {23, 23, 3, (unsigned char *)&acD1D4}, /*290: 言*/ - {24, 24, 3, (unsigned char *)&acD1E9}, /*291: 验*/ - {23, 23, 3, (unsigned char *)&acD2AA}, /*292: 要*/ - {23, 23, 3, (unsigned char *)&acD2C6}, /*293: 移*/ - {23, 23, 3, (unsigned char *)&acD2E5}, /*294: 义*/ - {24, 24, 3, (unsigned char *)&acD3A2}, /*295: 英*/ - {24, 24, 3, (unsigned char *)&acD3AD}, /*296: 迎*/ - {22, 22, 3, (unsigned char *)&acD3C3}, /*297: 用*/ - {23, 23, 3, (unsigned char *)&acD3D0}, /*298: 有*/ - {23, 23, 3, (unsigned char *)&acD3DA}, /*299: 于*/ - {24, 24, 3, (unsigned char *)&acD3EF}, /*300: 语*/ - {24, 24, 3, (unsigned char *)&acD4B4}, /*301: 源*/ - {23, 23, 3, (unsigned char *)&acD4CA}, /*302: 允*/ - {24, 24, 3, (unsigned char *)&acD4D8}, /*303: 载*/ - {23, 23, 3, (unsigned char *)&acD4DA}, /*304: 在*/ - {23, 23, 3, (unsigned char *)&acD4DD}, /*305: 暂*/ - {24, 24, 3, (unsigned char *)&acD4F1}, /*306: 择*/ - {23, 23, 3, (unsigned char *)&acD4F6}, /*307: 增*/ - {24, 24, 3, (unsigned char *)&acD5CF}, /*308: 障*/ - {24, 24, 3, (unsigned char *)&acD5EF}, /*309: 诊*/ - {23, 23, 3, (unsigned char *)&acD5FB}, /*310: 整*/ - {23, 23, 3, (unsigned char *)&acD5FD}, /*311: 正*/ - {23, 23, 3, (unsigned char *)&acD6B1}, /*312: 直*/ - {24, 24, 3, (unsigned char *)&acD6B4}, /*313: 执*/ - {24, 24, 3, (unsigned char *)&acD6B5}, /*314: 值*/ - {23, 23, 3, (unsigned char *)&acD6B7}, /*315: 址*/ - {24, 24, 3, (unsigned char *)&acD6C3}, /*316: 置*/ - {22, 22, 3, (unsigned char *)&acD6C6}, /*317: 制*/ - {22, 22, 3, (unsigned char *)&acD6C7}, /*318: 智*/ - {23, 23, 3, (unsigned char *)&acD6CD}, /*319: 滞*/ - {22, 22, 3, (unsigned char *)&acD6D0}, /*320: 中*/ - {23, 23, 3, (unsigned char *)&acD6D8}, /*321: 重*/ - {23, 23, 3, (unsigned char *)&acD6F7}, /*322: 主*/ - {23, 23, 3, (unsigned char *)&acD7BC}, /*323: 准*/ - {21, 21, 3, (unsigned char *)&acD7D4}, /*324: 自*/ - {23, 23, 3, (unsigned char *)&acD7D6}, /*325: 字*/ - {23, 23, 3, (unsigned char *)&acD7EE}, /*326: 最*/ - {23, 23, 3, (unsigned char *)&acD7F7}, /*327: 作*/ + {24, 24, 3, (unsigned char *)&acB1E4}, /*112: 变*/ + {24, 24, 3, (unsigned char *)&acB1EA}, /*113: 标*/ + {24, 24, 3, (unsigned char *)&acB2C1}, /*114: 擦*/ + {24, 24, 3, (unsigned char *)&acB2CB}, /*115: 菜*/ + {24, 24, 3, (unsigned char *)&acB2CE}, /*116: 参*/ + {22, 22, 3, (unsigned char *)&acB2E2}, /*117: 测*/ + {24, 24, 3, (unsigned char *)&acB2E9}, /*118: 查*/ + {23, 23, 3, (unsigned char *)&acB2EE}, /*119: 差*/ + {23, 23, 3, (unsigned char *)&acB3A3}, /*120: 常*/ + {23, 23, 3, (unsigned char *)&acB3A7}, /*121: 厂*/ + {24, 24, 3, (unsigned char *)&acB3AC}, /*122: 超*/ + {24, 24, 3, (unsigned char *)&acB3C9}, /*123: 成*/ + {24, 24, 3, (unsigned char *)&acB3CC}, /*124: 程*/ + {24, 24, 3, (unsigned char *)&acB3D6}, /*125: 持*/ + {22, 22, 3, (unsigned char *)&acB3F6}, /*126: 出*/ + {23, 23, 3, (unsigned char *)&acB3FD}, /*127: 除*/ + {24, 24, 3, (unsigned char *)&acB4A5}, /*128: 触*/ + {23, 23, 3, (unsigned char *)&acB4A6}, /*129: 处*/ + {23, 23, 3, (unsigned char *)&acB4AB}, /*130: 传*/ + {24, 24, 3, (unsigned char *)&acB4C5}, /*131: 磁*/ + {24, 24, 3, (unsigned char *)&acB4CE}, /*132: 次*/ + {23, 23, 3, (unsigned char *)&acB4E6}, /*133: 存*/ + {24, 24, 3, (unsigned char *)&acB4ED}, /*134: 错*/ + {23, 23, 3, (unsigned char *)&acB4F3}, /*135: 大*/ + {23, 23, 3, (unsigned char *)&acB4FD}, /*136: 待*/ + {23, 23, 3, (unsigned char *)&acB5A5}, /*137: 单*/ + {23, 23, 3, (unsigned char *)&acB5AF}, /*138: 弹*/ + {23, 23, 3, (unsigned char *)&acB5B1}, /*139: 当*/ + {23, 23, 3, (unsigned char *)&acB5C8}, /*140: 等*/ + {24, 24, 3, (unsigned char *)&acB5D8}, /*141: 地*/ + {23, 23, 3, (unsigned char *)&acB5E7}, /*142: 电*/ + {23, 23, 3, (unsigned char *)&acB5F7}, /*143: 调*/ + {23, 23, 3, (unsigned char *)&acB6A8}, /*144: 定*/ + {23, 23, 3, (unsigned char *)&acB6AF}, /*145: 动*/ + {24, 24, 3, (unsigned char *)&acB6C8}, /*146: 度*/ + {23, 23, 3, (unsigned char *)&acB6CF}, /*147: 断*/ + {24, 24, 3, (unsigned char *)&acB7A2}, /*148: 发*/ + {23, 23, 3, (unsigned char *)&acB7A7}, /*149: 阀*/ + {24, 24, 3, (unsigned char *)&acB7A8}, /*150: 法*/ + {24, 24, 3, (unsigned char *)&acB7B4}, /*151: 反*/ + {23, 23, 3, (unsigned char *)&acB7B6}, /*152: 范*/ + {24, 24, 3, (unsigned char *)&acB7BD}, /*153: 方*/ + {24, 24, 3, (unsigned char *)&acB7D6}, /*154: 分*/ + {23, 23, 3, (unsigned char *)&acB7F1}, /*155: 否*/ + {24, 24, 3, (unsigned char *)&acB8B4}, /*156: 复*/ + {24, 24, 3, (unsigned char *)&acB8D0}, /*157: 感*/ + {23, 23, 3, (unsigned char *)&acB8DF}, /*158: 高*/ + {23, 23, 3, (unsigned char *)&acB8F1}, /*159: 格*/ + {23, 23, 3, (unsigned char *)&acB9A4}, /*160: 工*/ + {23, 23, 3, (unsigned char *)&acB9A6}, /*161: 功*/ + {24, 24, 3, (unsigned char *)&acB9A9}, /*162: 供*/ + {23, 23, 3, (unsigned char *)&acB9AB}, /*163: 公*/ + {23, 23, 3, (unsigned char *)&acB9B9}, /*164: 构*/ + {24, 24, 3, (unsigned char *)&acB9CA}, /*165: 故*/ + {24, 24, 3, (unsigned char *)&acB9D8}, /*166: 关*/ + {24, 24, 3, (unsigned char *)&acB9E6}, /*167: 规*/ + {23, 23, 3, (unsigned char *)&acBAC5}, /*168: 号*/ + {23, 23, 3, (unsigned char *)&acBACF}, /*169: 合*/ + {23, 23, 3, (unsigned char *)&acBAE2}, /*170: 衡*/ + {23, 23, 3, (unsigned char *)&acBAF3}, /*171: 后*/ + {23, 23, 3, (unsigned char *)&acBBA4}, /*172: 护*/ + {24, 24, 3, (unsigned char *)&acBBB6}, /*173: 欢*/ + {24, 24, 3, (unsigned char *)&acBBC9}, /*174: 簧*/ + {23, 23, 3, (unsigned char *)&acBBD6}, /*175: 恢*/ + {24, 24, 3, (unsigned char *)&acBBEC}, /*176: 混*/ + {24, 24, 3, (unsigned char *)&acBBEE}, /*177: 活*/ + {24, 24, 3, (unsigned char *)&acBBF2}, /*178: 或*/ + {24, 24, 3, (unsigned char *)&acBBFA}, /*179: 机*/ + {23, 23, 3, (unsigned char *)&acBBFD}, /*180: 积*/ + {24, 24, 3, (unsigned char *)&acBCA4}, /*181: 激*/ + {23, 23, 3, (unsigned char *)&acBCAD}, /*182: 辑*/ + {24, 24, 3, (unsigned char *)&acBCB6}, /*183: 级*/ + {24, 24, 3, (unsigned char *)&acBCBC}, /*184: 技*/ + {23, 23, 3, (unsigned char *)&acBCC6}, /*185: 计*/ + {23, 23, 3, (unsigned char *)&acBCCA}, /*186: 际*/ + {23, 23, 3, (unsigned char *)&acBCD3}, /*187: 加*/ + {22, 22, 3, (unsigned char *)&acBCE4}, /*188: 间*/ + {23, 23, 3, (unsigned char *)&acBCEC}, /*189: 检*/ + {24, 24, 3, (unsigned char *)&acBCF5}, /*190: 减*/ + {24, 24, 3, (unsigned char *)&acBDAD}, /*191: 江*/ + {22, 22, 3, (unsigned char *)&acBDC7}, /*192: 角*/ + {23, 23, 3, (unsigned char *)&acBDDA}, /*193: 节*/ + {23, 23, 3, (unsigned char *)&acBDE1}, /*194: 结*/ + {23, 23, 3, (unsigned char *)&acBDE9}, /*195: 介*/ + {24, 24, 3, (unsigned char *)&acBDF8}, /*196: 进*/ + {24, 24, 3, (unsigned char *)&acBDFB}, /*197: 禁*/ + {23, 23, 3, (unsigned char *)&acBEAF}, /*198: 警*/ + {23, 23, 3, (unsigned char *)&acBEDE}, /*199: 巨*/ + {23, 23, 3, (unsigned char *)&acBFAA}, /*200: 开*/ + {23, 23, 3, (unsigned char *)&acBFD8}, /*201: 控*/ + {24, 24, 3, (unsigned char *)&acBFE9}, /*202: 块*/ + {24, 24, 3, (unsigned char *)&acBFEC}, /*203: 快*/ + {22, 22, 3, (unsigned char *)&acC0DB}, /*204: 累*/ + {23, 23, 3, (unsigned char *)&acC0E0}, /*205: 类*/ + {23, 23, 3, (unsigned char *)&acC0EB}, /*206: 离*/ + {24, 24, 3, (unsigned char *)&acC0ED}, /*207: 理*/ + {23, 23, 3, (unsigned char *)&acC1A6}, /*208: 力*/ + {24, 24, 3, (unsigned char *)&acC1AC}, /*209: 连*/ + {24, 24, 3, (unsigned char *)&acC1BF}, /*210: 量*/ + {24, 24, 3, (unsigned char *)&acC1F7}, /*211: 流*/ + {23, 23, 3, (unsigned char *)&acC2CA}, /*212: 率*/ + {24, 24, 3, (unsigned char *)&acC2DF}, /*213: 逻*/ + {22, 22, 3, (unsigned char *)&acC3C5}, /*214: 门*/ + {24, 24, 3, (unsigned char *)&acC4A3}, /*215: 模*/ + {23, 23, 3, (unsigned char *)&acC4A6}, /*216: 摩*/ + {23, 23, 3, (unsigned char *)&acC4BB}, /*217: 幕*/ + {20, 20, 3, (unsigned char *)&acC4BF}, /*218: 目*/ + {24, 24, 3, (unsigned char *)&acC4DC}, /*219: 能*/ + {24, 24, 3, (unsigned char *)&acC5C5}, /*220: 排*/ + {24, 24, 3, (unsigned char *)&acC6B5}, /*221: 频*/ + {23, 23, 3, (unsigned char *)&acC6BD}, /*222: 平*/ + {23, 23, 3, (unsigned char *)&acC6C1}, /*223: 屏*/ + {23, 23, 3, (unsigned char *)&acC6DA}, /*224: 期*/ + {23, 23, 3, (unsigned char *)&acC6E4}, /*225: 其*/ + {21, 21, 3, (unsigned char *)&acC6F4}, /*226: 启*/ + {23, 23, 3, (unsigned char *)&acC6F7}, /*227: 器*/ + {23, 23, 3, (unsigned char *)&acC6F8}, /*228: 气*/ + {23, 23, 3, (unsigned char *)&acC7B0}, /*229: 前*/ + {23, 23, 3, (unsigned char *)&acC7D0}, /*230: 切*/ + {24, 24, 3, (unsigned char *)&acC7F3}, /*231: 求*/ + {22, 22, 3, (unsigned char *)&acC7F8}, /*232: 区*/ + {22, 22, 3, (unsigned char *)&acC7FA}, /*233: 曲*/ + {24, 24, 3, (unsigned char *)&acC7FD}, /*234: 驱*/ + {24, 24, 3, (unsigned char *)&acC8A1}, /*235: 取*/ + {24, 24, 3, (unsigned char *)&acC8AB}, /*236: 全*/ + {23, 23, 3, (unsigned char *)&acC8B7}, /*237: 确*/ + {23, 23, 3, (unsigned char *)&acC8CF}, /*238: 认*/ + {20, 20, 3, (unsigned char *)&acC8D5}, /*239: 日*/ + {24, 24, 3, (unsigned char *)&acC8EB}, /*240: 入*/ + {23, 23, 3, (unsigned char *)&acC9CF}, /*241: 上*/ + {23, 23, 3, (unsigned char *)&acC9DC}, /*242: 绍*/ + {24, 24, 3, (unsigned char *)&acC9E8}, /*243: 设*/ + {24, 24, 3, (unsigned char *)&acCAA7}, /*244: 失*/ + {23, 23, 3, (unsigned char *)&acCAAF}, /*245: 石*/ + {23, 23, 3, (unsigned char *)&acCAB1}, /*246: 时*/ + {23, 23, 3, (unsigned char *)&acCAB5}, /*247: 实*/ + {24, 24, 3, (unsigned char *)&acCAB9}, /*248: 使*/ + {24, 24, 3, (unsigned char *)&acCABD}, /*249: 式*/ + {23, 23, 3, (unsigned char *)&acCABE}, /*250: 示*/ + {23, 23, 3, (unsigned char *)&acCAC7}, /*251: 是*/ + {24, 24, 3, (unsigned char *)&acCAD4}, /*252: 试*/ + {23, 23, 3, (unsigned char *)&acCAD6}, /*253: 手*/ + {23, 23, 3, (unsigned char *)&acCAE4}, /*254: 输*/ + {23, 23, 3, (unsigned char *)&acCAF5}, /*255: 术*/ + {23, 23, 3, (unsigned char *)&acCAF8}, /*256: 束*/ + {23, 23, 3, (unsigned char *)&acCAFD}, /*257: 数*/ + {23, 23, 3, (unsigned char *)&acCBAB}, /*258: 双*/ + {21, 21, 3, (unsigned char *)&acCBBE}, /*259: 司*/ + {24, 24, 3, (unsigned char *)&acCBC0}, /*260: 死*/ + {23, 23, 3, (unsigned char *)&acCBD5}, /*261: 苏*/ + {24, 24, 3, (unsigned char *)&acCBD9}, /*262: 速*/ + {23, 23, 3, (unsigned char *)&acCBE3}, /*263: 算*/ + {24, 24, 3, (unsigned char *)&acCBFB}, /*264: 他*/ + {24, 24, 3, (unsigned char *)&acCCD8}, /*265: 特*/ + {24, 24, 3, (unsigned char *)&acCCE1}, /*266: 提*/ + {24, 24, 3, (unsigned char *)&acCCF5}, /*267: 条*/ + {23, 23, 3, (unsigned char *)&acCDA3}, /*268: 停*/ + {23, 23, 3, (unsigned char *)&acCDA8}, /*269: 通*/ + {23, 23, 3, (unsigned char *)&acCDEA}, /*270: 完*/ + {23, 23, 3, (unsigned char *)&acCEA7}, /*271: 围*/ + {24, 24, 3, (unsigned char *)&acCEAC}, /*272: 维*/ + {24, 24, 3, (unsigned char *)&acCEBB}, /*273: 位*/ + {24, 24, 3, (unsigned char *)&acCEC2}, /*274: 温*/ + {23, 23, 3, (unsigned char *)&acCEC4}, /*275: 文*/ + {24, 24, 3, (unsigned char *)&acCEDE}, /*276: 无*/ + {24, 24, 3, (unsigned char *)&acCEF3}, /*277: 误*/ + {23, 23, 3, (unsigned char *)&acCFA2}, /*278: 息*/ + {23, 23, 3, (unsigned char *)&acCFB8}, /*279: 细*/ + {23, 23, 3, (unsigned char *)&acCFC2}, /*280: 下*/ + {23, 23, 3, (unsigned char *)&acCFD4}, /*281: 显*/ + {23, 23, 3, (unsigned char *)&acCFDE}, /*282: 限*/ + {23, 23, 3, (unsigned char *)&acCFDF}, /*283: 线*/ + {23, 23, 3, (unsigned char *)&acCFEA}, /*284: 详*/ + {22, 22, 3, (unsigned char *)&acCFF2}, /*285: 向*/ + {23, 23, 3, (unsigned char *)&acCFFB}, /*286: 消*/ + {23, 23, 3, (unsigned char *)&acD0A1}, /*287: 小*/ + {24, 24, 3, (unsigned char *)&acD0A3}, /*288: 校*/ + {23, 23, 3, (unsigned char *)&acD0C5}, /*289: 信*/ + {23, 23, 3, (unsigned char *)&acD0CD}, /*290: 型*/ + {23, 23, 3, (unsigned char *)&acD0D0}, /*291: 行*/ + {24, 24, 3, (unsigned char *)&acD0D4}, /*292: 性*/ + {24, 24, 3, (unsigned char *)&acD0ED}, /*293: 许*/ + {23, 23, 3, (unsigned char *)&acD0F8}, /*294: 续*/ + {23, 23, 3, (unsigned char *)&acD1A1}, /*295: 选*/ + {24, 24, 3, (unsigned char *)&acD1B6}, /*296: 讯*/ + {23, 23, 3, (unsigned char *)&acD1B9}, /*297: 压*/ + {23, 23, 3, (unsigned char *)&acD1D4}, /*298: 言*/ + {24, 24, 3, (unsigned char *)&acD1E9}, /*299: 验*/ + {23, 23, 3, (unsigned char *)&acD2AA}, /*300: 要*/ + {23, 23, 3, (unsigned char *)&acD2C6}, /*301: 移*/ + {23, 23, 3, (unsigned char *)&acD2D1}, /*302: 已*/ + {23, 23, 3, (unsigned char *)&acD2E5}, /*303: 义*/ + {24, 24, 3, (unsigned char *)&acD3A2}, /*304: 英*/ + {24, 24, 3, (unsigned char *)&acD3AD}, /*305: 迎*/ + {22, 22, 3, (unsigned char *)&acD3C3}, /*306: 用*/ + {23, 23, 3, (unsigned char *)&acD3D0}, /*307: 有*/ + {23, 23, 3, (unsigned char *)&acD3DA}, /*308: 于*/ + {24, 24, 3, (unsigned char *)&acD3EF}, /*309: 语*/ + {24, 24, 3, (unsigned char *)&acD3F2}, /*310: 域*/ + {24, 24, 3, (unsigned char *)&acD4B4}, /*311: 源*/ + {23, 23, 3, (unsigned char *)&acD4CA}, /*312: 允*/ + {24, 24, 3, (unsigned char *)&acD4D8}, /*313: 载*/ + {23, 23, 3, (unsigned char *)&acD4DA}, /*314: 在*/ + {23, 23, 3, (unsigned char *)&acD4DD}, /*315: 暂*/ + {24, 24, 3, (unsigned char *)&acD4F1}, /*316: 择*/ + {23, 23, 3, (unsigned char *)&acD4F6}, /*317: 增*/ + {24, 24, 3, (unsigned char *)&acD5CF}, /*318: 障*/ + {24, 24, 3, (unsigned char *)&acD5EF}, /*319: 诊*/ + {23, 23, 3, (unsigned char *)&acD5FB}, /*320: 整*/ + {23, 23, 3, (unsigned char *)&acD5FD}, /*321: 正*/ + {23, 23, 3, (unsigned char *)&acD6B1}, /*322: 直*/ + {24, 24, 3, (unsigned char *)&acD6B4}, /*323: 执*/ + {24, 24, 3, (unsigned char *)&acD6B5}, /*324: 值*/ + {23, 23, 3, (unsigned char *)&acD6B7}, /*325: 址*/ + {24, 24, 3, (unsigned char *)&acD6C3}, /*326: 置*/ + {22, 22, 3, (unsigned char *)&acD6C6}, /*327: 制*/ + {22, 22, 3, (unsigned char *)&acD6C7}, /*328: 智*/ + {23, 23, 3, (unsigned char *)&acD6CD}, /*329: 滞*/ + {22, 22, 3, (unsigned char *)&acD6D0}, /*330: 中*/ + {23, 23, 3, (unsigned char *)&acD6D8}, /*331: 重*/ + {23, 23, 3, (unsigned char *)&acD6F7}, /*332: 主*/ + {23, 23, 3, (unsigned char *)&acD7BC}, /*333: 准*/ + {21, 21, 3, (unsigned char *)&acD7D4}, /*334: 自*/ + {23, 23, 3, (unsigned char *)&acD7D6}, /*335: 字*/ + {23, 23, 3, (unsigned char *)&acD7EE}, /*336: 最*/ + {23, 23, 3, (unsigned char *)&acD7F7}, /*337: 作*/ }; -static GUI_CONST_STORAGE GUI_FONT_PROP Prop225 = { +static GUI_CONST_STORAGE GUI_FONT_PROP Prop234 = { 0xD7F7, /*start :作*/ 0xD7F7, /*end :作, len=1*/ - &Cinfo[327], + &Cinfo[337], (void *)0}; -static GUI_CONST_STORAGE GUI_FONT_PROP Prop224 = { +static GUI_CONST_STORAGE GUI_FONT_PROP Prop233 = { 0xD7EE, /*start :最*/ 0xD7EE, /*end :最, len=1*/ + &Cinfo[336], + &Prop234}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop232 = { + 0xD7D6, /*start :字*/ + 0xD7D6, /*end :字, len=1*/ + &Cinfo[335], + &Prop233}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop231 = { + 0xD7D4, /*start :自*/ + 0xD7D4, /*end :自, len=1*/ + &Cinfo[334], + &Prop232}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop230 = { + 0xD7BC, /*start :准*/ + 0xD7BC, /*end :准, len=1*/ + &Cinfo[333], + &Prop231}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop229 = { + 0xD6F7, /*start :主*/ + 0xD6F7, /*end :主, len=1*/ + &Cinfo[332], + &Prop230}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop228 = { + 0xD6D8, /*start :重*/ + 0xD6D8, /*end :重, len=1*/ + &Cinfo[331], + &Prop229}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop227 = { + 0xD6D0, /*start :中*/ + 0xD6D0, /*end :中, len=1*/ + &Cinfo[330], + &Prop228}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop226 = { + 0xD6CD, /*start :滞*/ + 0xD6CD, /*end :滞, len=1*/ + &Cinfo[329], + &Prop227}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop225 = { + 0xD6C6, /*start :制*/ + 0xD6C7, /*end :智, len=2*/ + &Cinfo[327], + &Prop226}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop224 = { + 0xD6C3, /*start :置*/ + 0xD6C3, /*end :置, len=1*/ &Cinfo[326], &Prop225}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop223 = { - 0xD7D6, /*start :字*/ - 0xD7D6, /*end :字, len=1*/ + 0xD6B7, /*start :址*/ + 0xD6B7, /*end :址, len=1*/ &Cinfo[325], &Prop224}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop222 = { - 0xD7D4, /*start :自*/ - 0xD7D4, /*end :自, len=1*/ - &Cinfo[324], + 0xD6B4, /*start :执*/ + 0xD6B5, /*end :值, len=2*/ + &Cinfo[323], &Prop223}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop221 = { - 0xD7BC, /*start :准*/ - 0xD7BC, /*end :准, len=1*/ - &Cinfo[323], + 0xD6B1, /*start :直*/ + 0xD6B1, /*end :直, len=1*/ + &Cinfo[322], &Prop222}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop220 = { - 0xD6F7, /*start :主*/ - 0xD6F7, /*end :主, len=1*/ - &Cinfo[322], + 0xD5FD, /*start :正*/ + 0xD5FD, /*end :正, len=1*/ + &Cinfo[321], &Prop221}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop219 = { - 0xD6D8, /*start :重*/ - 0xD6D8, /*end :重, len=1*/ - &Cinfo[321], + 0xD5FB, /*start :整*/ + 0xD5FB, /*end :整, len=1*/ + &Cinfo[320], &Prop220}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop218 = { - 0xD6D0, /*start :中*/ - 0xD6D0, /*end :中, len=1*/ - &Cinfo[320], + 0xD5EF, /*start :诊*/ + 0xD5EF, /*end :诊, len=1*/ + &Cinfo[319], &Prop219}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop217 = { - 0xD6CD, /*start :滞*/ - 0xD6CD, /*end :滞, len=1*/ - &Cinfo[319], + 0xD5CF, /*start :障*/ + 0xD5CF, /*end :障, len=1*/ + &Cinfo[318], &Prop218}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop216 = { - 0xD6C6, /*start :制*/ - 0xD6C7, /*end :智, len=2*/ + 0xD4F6, /*start :增*/ + 0xD4F6, /*end :增, len=1*/ &Cinfo[317], &Prop217}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop215 = { - 0xD6C3, /*start :置*/ - 0xD6C3, /*end :置, len=1*/ + 0xD4F1, /*start :择*/ + 0xD4F1, /*end :择, len=1*/ &Cinfo[316], &Prop216}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop214 = { - 0xD6B7, /*start :址*/ - 0xD6B7, /*end :址, len=1*/ + 0xD4DD, /*start :暂*/ + 0xD4DD, /*end :暂, len=1*/ &Cinfo[315], &Prop215}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop213 = { - 0xD6B4, /*start :执*/ - 0xD6B5, /*end :值, len=2*/ - &Cinfo[313], + 0xD4DA, /*start :在*/ + 0xD4DA, /*end :在, len=1*/ + &Cinfo[314], &Prop214}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop212 = { - 0xD6B1, /*start :直*/ - 0xD6B1, /*end :直, len=1*/ - &Cinfo[312], + 0xD4D8, /*start :载*/ + 0xD4D8, /*end :载, len=1*/ + &Cinfo[313], &Prop213}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop211 = { - 0xD5FD, /*start :正*/ - 0xD5FD, /*end :正, len=1*/ - &Cinfo[311], + 0xD4CA, /*start :允*/ + 0xD4CA, /*end :允, len=1*/ + &Cinfo[312], &Prop212}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop210 = { - 0xD5FB, /*start :整*/ - 0xD5FB, /*end :整, len=1*/ - &Cinfo[310], + 0xD4B4, /*start :源*/ + 0xD4B4, /*end :源, len=1*/ + &Cinfo[311], &Prop211}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop209 = { - 0xD5EF, /*start :诊*/ - 0xD5EF, /*end :诊, len=1*/ - &Cinfo[309], + 0xD3F2, /*start :域*/ + 0xD3F2, /*end :域, len=1*/ + &Cinfo[310], &Prop210}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop208 = { - 0xD5CF, /*start :障*/ - 0xD5CF, /*end :障, len=1*/ - &Cinfo[308], + 0xD3EF, /*start :语*/ + 0xD3EF, /*end :语, len=1*/ + &Cinfo[309], &Prop209}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop207 = { - 0xD4F6, /*start :增*/ - 0xD4F6, /*end :增, len=1*/ - &Cinfo[307], + 0xD3DA, /*start :于*/ + 0xD3DA, /*end :于, len=1*/ + &Cinfo[308], &Prop208}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop206 = { - 0xD4F1, /*start :择*/ - 0xD4F1, /*end :择, len=1*/ - &Cinfo[306], + 0xD3D0, /*start :有*/ + 0xD3D0, /*end :有, len=1*/ + &Cinfo[307], &Prop207}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop205 = { - 0xD4DD, /*start :暂*/ - 0xD4DD, /*end :暂, len=1*/ - &Cinfo[305], + 0xD3C3, /*start :用*/ + 0xD3C3, /*end :用, len=1*/ + &Cinfo[306], &Prop206}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop204 = { - 0xD4DA, /*start :在*/ - 0xD4DA, /*end :在, len=1*/ - &Cinfo[304], + 0xD3AD, /*start :迎*/ + 0xD3AD, /*end :迎, len=1*/ + &Cinfo[305], &Prop205}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop203 = { - 0xD4D8, /*start :载*/ - 0xD4D8, /*end :载, len=1*/ - &Cinfo[303], + 0xD3A2, /*start :英*/ + 0xD3A2, /*end :英, len=1*/ + &Cinfo[304], &Prop204}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop202 = { - 0xD4CA, /*start :允*/ - 0xD4CA, /*end :允, len=1*/ - &Cinfo[302], + 0xD2E5, /*start :义*/ + 0xD2E5, /*end :义, len=1*/ + &Cinfo[303], &Prop203}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop201 = { - 0xD4B4, /*start :源*/ - 0xD4B4, /*end :源, len=1*/ - &Cinfo[301], + 0xD2D1, /*start :已*/ + 0xD2D1, /*end :已, len=1*/ + &Cinfo[302], &Prop202}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop200 = { - 0xD3EF, /*start :语*/ - 0xD3EF, /*end :语, len=1*/ - &Cinfo[300], + 0xD2C6, /*start :移*/ + 0xD2C6, /*end :移, len=1*/ + &Cinfo[301], &Prop201}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop199 = { - 0xD3DA, /*start :于*/ - 0xD3DA, /*end :于, len=1*/ - &Cinfo[299], + 0xD2AA, /*start :要*/ + 0xD2AA, /*end :要, len=1*/ + &Cinfo[300], &Prop200}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop198 = { - 0xD3D0, /*start :有*/ - 0xD3D0, /*end :有, len=1*/ - &Cinfo[298], + 0xD1E9, /*start :验*/ + 0xD1E9, /*end :验, len=1*/ + &Cinfo[299], &Prop199}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop197 = { - 0xD3C3, /*start :用*/ - 0xD3C3, /*end :用, len=1*/ - &Cinfo[297], + 0xD1D4, /*start :言*/ + 0xD1D4, /*end :言, len=1*/ + &Cinfo[298], &Prop198}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop196 = { - 0xD3AD, /*start :迎*/ - 0xD3AD, /*end :迎, len=1*/ - &Cinfo[296], + 0xD1B9, /*start :压*/ + 0xD1B9, /*end :压, len=1*/ + &Cinfo[297], &Prop197}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop195 = { - 0xD3A2, /*start :英*/ - 0xD3A2, /*end :英, len=1*/ - &Cinfo[295], + 0xD1B6, /*start :讯*/ + 0xD1B6, /*end :讯, len=1*/ + &Cinfo[296], &Prop196}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop194 = { - 0xD2E5, /*start :义*/ - 0xD2E5, /*end :义, len=1*/ - &Cinfo[294], + 0xD1A1, /*start :选*/ + 0xD1A1, /*end :选, len=1*/ + &Cinfo[295], &Prop195}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop193 = { - 0xD2C6, /*start :移*/ - 0xD2C6, /*end :移, len=1*/ - &Cinfo[293], + 0xD0F8, /*start :续*/ + 0xD0F8, /*end :续, len=1*/ + &Cinfo[294], &Prop194}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop192 = { - 0xD2AA, /*start :要*/ - 0xD2AA, /*end :要, len=1*/ - &Cinfo[292], + 0xD0ED, /*start :许*/ + 0xD0ED, /*end :许, len=1*/ + &Cinfo[293], &Prop193}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop191 = { - 0xD1E9, /*start :验*/ - 0xD1E9, /*end :验, len=1*/ - &Cinfo[291], + 0xD0D4, /*start :性*/ + 0xD0D4, /*end :性, len=1*/ + &Cinfo[292], &Prop192}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop190 = { - 0xD1D4, /*start :言*/ - 0xD1D4, /*end :言, len=1*/ - &Cinfo[290], + 0xD0D0, /*start :行*/ + 0xD0D0, /*end :行, len=1*/ + &Cinfo[291], &Prop191}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop189 = { - 0xD1B9, /*start :压*/ - 0xD1B9, /*end :压, len=1*/ - &Cinfo[289], + 0xD0CD, /*start :型*/ + 0xD0CD, /*end :型, len=1*/ + &Cinfo[290], &Prop190}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop188 = { - 0xD1B6, /*start :讯*/ - 0xD1B6, /*end :讯, len=1*/ - &Cinfo[288], + 0xD0C5, /*start :信*/ + 0xD0C5, /*end :信, len=1*/ + &Cinfo[289], &Prop189}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop187 = { - 0xD1A1, /*start :选*/ - 0xD1A1, /*end :选, len=1*/ - &Cinfo[287], + 0xD0A3, /*start :校*/ + 0xD0A3, /*end :校, len=1*/ + &Cinfo[288], &Prop188}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop186 = { - 0xD0F8, /*start :续*/ - 0xD0F8, /*end :续, len=1*/ - &Cinfo[286], + 0xD0A1, /*start :小*/ + 0xD0A1, /*end :小, len=1*/ + &Cinfo[287], &Prop187}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop185 = { - 0xD0ED, /*start :许*/ - 0xD0ED, /*end :许, len=1*/ - &Cinfo[285], + 0xCFFB, /*start :消*/ + 0xCFFB, /*end :消, len=1*/ + &Cinfo[286], &Prop186}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop184 = { - 0xD0D4, /*start :性*/ - 0xD0D4, /*end :性, len=1*/ - &Cinfo[284], + 0xCFF2, /*start :向*/ + 0xCFF2, /*end :向, len=1*/ + &Cinfo[285], &Prop185}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop183 = { - 0xD0D0, /*start :行*/ - 0xD0D0, /*end :行, len=1*/ - &Cinfo[283], + 0xCFEA, /*start :详*/ + 0xCFEA, /*end :详, len=1*/ + &Cinfo[284], &Prop184}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop182 = { - 0xD0CD, /*start :型*/ - 0xD0CD, /*end :型, len=1*/ + 0xCFDE, /*start :限*/ + 0xCFDF, /*end :线, len=2*/ &Cinfo[282], &Prop183}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop181 = { - 0xD0C5, /*start :信*/ - 0xD0C5, /*end :信, len=1*/ + 0xCFD4, /*start :显*/ + 0xCFD4, /*end :显, len=1*/ &Cinfo[281], &Prop182}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop180 = { - 0xD0A3, /*start :校*/ - 0xD0A3, /*end :校, len=1*/ + 0xCFC2, /*start :下*/ + 0xCFC2, /*end :下, len=1*/ &Cinfo[280], &Prop181}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop179 = { - 0xD0A1, /*start :小*/ - 0xD0A1, /*end :小, len=1*/ + 0xCFB8, /*start :细*/ + 0xCFB8, /*end :细, len=1*/ &Cinfo[279], &Prop180}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop178 = { - 0xCFFB, /*start :消*/ - 0xCFFB, /*end :消, len=1*/ + 0xCFA2, /*start :息*/ + 0xCFA2, /*end :息, len=1*/ &Cinfo[278], &Prop179}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop177 = { - 0xCFF2, /*start :向*/ - 0xCFF2, /*end :向, len=1*/ + 0xCEF3, /*start :误*/ + 0xCEF3, /*end :误, len=1*/ &Cinfo[277], &Prop178}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop176 = { - 0xCFEA, /*start :详*/ - 0xCFEA, /*end :详, len=1*/ + 0xCEDE, /*start :无*/ + 0xCEDE, /*end :无, len=1*/ &Cinfo[276], &Prop177}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop175 = { - 0xCFDE, /*start :限*/ - 0xCFDF, /*end :线, len=2*/ - &Cinfo[274], + 0xCEC4, /*start :文*/ + 0xCEC4, /*end :文, len=1*/ + &Cinfo[275], &Prop176}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop174 = { - 0xCFD4, /*start :显*/ - 0xCFD4, /*end :显, len=1*/ - &Cinfo[273], + 0xCEC2, /*start :温*/ + 0xCEC2, /*end :温, len=1*/ + &Cinfo[274], &Prop175}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop173 = { - 0xCFC2, /*start :下*/ - 0xCFC2, /*end :下, len=1*/ - &Cinfo[272], + 0xCEBB, /*start :位*/ + 0xCEBB, /*end :位, len=1*/ + &Cinfo[273], &Prop174}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop172 = { - 0xCFB8, /*start :细*/ - 0xCFB8, /*end :细, len=1*/ - &Cinfo[271], + 0xCEAC, /*start :维*/ + 0xCEAC, /*end :维, len=1*/ + &Cinfo[272], &Prop173}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop171 = { - 0xCFA2, /*start :息*/ - 0xCFA2, /*end :息, len=1*/ - &Cinfo[270], + 0xCEA7, /*start :围*/ + 0xCEA7, /*end :围, len=1*/ + &Cinfo[271], &Prop172}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop170 = { - 0xCEF3, /*start :误*/ - 0xCEF3, /*end :误, len=1*/ - &Cinfo[269], + 0xCDEA, /*start :完*/ + 0xCDEA, /*end :完, len=1*/ + &Cinfo[270], &Prop171}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop169 = { - 0xCEDE, /*start :无*/ - 0xCEDE, /*end :无, len=1*/ - &Cinfo[268], + 0xCDA8, /*start :通*/ + 0xCDA8, /*end :通, len=1*/ + &Cinfo[269], &Prop170}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop168 = { - 0xCEC4, /*start :文*/ - 0xCEC4, /*end :文, len=1*/ - &Cinfo[267], + 0xCDA3, /*start :停*/ + 0xCDA3, /*end :停, len=1*/ + &Cinfo[268], &Prop169}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop167 = { - 0xCEC2, /*start :温*/ - 0xCEC2, /*end :温, len=1*/ - &Cinfo[266], + 0xCCF5, /*start :条*/ + 0xCCF5, /*end :条, len=1*/ + &Cinfo[267], &Prop168}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop166 = { - 0xCEBB, /*start :位*/ - 0xCEBB, /*end :位, len=1*/ - &Cinfo[265], + 0xCCE1, /*start :提*/ + 0xCCE1, /*end :提, len=1*/ + &Cinfo[266], &Prop167}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop165 = { - 0xCEAC, /*start :维*/ - 0xCEAC, /*end :维, len=1*/ - &Cinfo[264], + 0xCCD8, /*start :特*/ + 0xCCD8, /*end :特, len=1*/ + &Cinfo[265], &Prop166}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop164 = { - 0xCEA7, /*start :围*/ - 0xCEA7, /*end :围, len=1*/ - &Cinfo[263], + 0xCBFB, /*start :他*/ + 0xCBFB, /*end :他, len=1*/ + &Cinfo[264], &Prop165}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop163 = { - 0xCDEA, /*start :完*/ - 0xCDEA, /*end :完, len=1*/ - &Cinfo[262], + 0xCBE3, /*start :算*/ + 0xCBE3, /*end :算, len=1*/ + &Cinfo[263], &Prop164}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop162 = { - 0xCDA8, /*start :通*/ - 0xCDA8, /*end :通, len=1*/ - &Cinfo[261], + 0xCBD9, /*start :速*/ + 0xCBD9, /*end :速, len=1*/ + &Cinfo[262], &Prop163}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop161 = { - 0xCDA3, /*start :停*/ - 0xCDA3, /*end :停, len=1*/ - &Cinfo[260], + 0xCBD5, /*start :苏*/ + 0xCBD5, /*end :苏, len=1*/ + &Cinfo[261], &Prop162}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop160 = { - 0xCCF5, /*start :条*/ - 0xCCF5, /*end :条, len=1*/ - &Cinfo[259], + 0xCBC0, /*start :死*/ + 0xCBC0, /*end :死, len=1*/ + &Cinfo[260], &Prop161}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop159 = { - 0xCCE1, /*start :提*/ - 0xCCE1, /*end :提, len=1*/ - &Cinfo[258], + 0xCBBE, /*start :司*/ + 0xCBBE, /*end :司, len=1*/ + &Cinfo[259], &Prop160}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop158 = { - 0xCCD8, /*start :特*/ - 0xCCD8, /*end :特, len=1*/ - &Cinfo[257], + 0xCBAB, /*start :双*/ + 0xCBAB, /*end :双, len=1*/ + &Cinfo[258], &Prop159}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop157 = { - 0xCBFB, /*start :他*/ - 0xCBFB, /*end :他, len=1*/ - &Cinfo[256], + 0xCAFD, /*start :数*/ + 0xCAFD, /*end :数, len=1*/ + &Cinfo[257], &Prop158}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop156 = { - 0xCBD9, /*start :速*/ - 0xCBD9, /*end :速, len=1*/ - &Cinfo[255], + 0xCAF8, /*start :束*/ + 0xCAF8, /*end :束, len=1*/ + &Cinfo[256], &Prop157}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop155 = { - 0xCBD5, /*start :苏*/ - 0xCBD5, /*end :苏, len=1*/ - &Cinfo[254], + 0xCAF5, /*start :术*/ + 0xCAF5, /*end :术, len=1*/ + &Cinfo[255], &Prop156}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop154 = { - 0xCBC0, /*start :死*/ - 0xCBC0, /*end :死, len=1*/ - &Cinfo[253], + 0xCAE4, /*start :输*/ + 0xCAE4, /*end :输, len=1*/ + &Cinfo[254], &Prop155}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop153 = { - 0xCBBE, /*start :司*/ - 0xCBBE, /*end :司, len=1*/ - &Cinfo[252], + 0xCAD6, /*start :手*/ + 0xCAD6, /*end :手, len=1*/ + &Cinfo[253], &Prop154}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop152 = { - 0xCBAB, /*start :双*/ - 0xCBAB, /*end :双, len=1*/ - &Cinfo[251], + 0xCAD4, /*start :试*/ + 0xCAD4, /*end :试, len=1*/ + &Cinfo[252], &Prop153}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop151 = { - 0xCAFD, /*start :数*/ - 0xCAFD, /*end :数, len=1*/ - &Cinfo[250], + 0xCAC7, /*start :是*/ + 0xCAC7, /*end :是, len=1*/ + &Cinfo[251], &Prop152}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop150 = { - 0xCAF8, /*start :束*/ - 0xCAF8, /*end :束, len=1*/ + 0xCABD, /*start :式*/ + 0xCABE, /*end :示, len=2*/ &Cinfo[249], &Prop151}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop149 = { - 0xCAF5, /*start :术*/ - 0xCAF5, /*end :术, len=1*/ + 0xCAB9, /*start :使*/ + 0xCAB9, /*end :使, len=1*/ &Cinfo[248], &Prop150}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop148 = { - 0xCAE4, /*start :输*/ - 0xCAE4, /*end :输, len=1*/ + 0xCAB5, /*start :实*/ + 0xCAB5, /*end :实, len=1*/ &Cinfo[247], &Prop149}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop147 = { - 0xCAD6, /*start :手*/ - 0xCAD6, /*end :手, len=1*/ + 0xCAB1, /*start :时*/ + 0xCAB1, /*end :时, len=1*/ &Cinfo[246], &Prop148}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop146 = { - 0xCAD4, /*start :试*/ - 0xCAD4, /*end :试, len=1*/ + 0xCAAF, /*start :石*/ + 0xCAAF, /*end :石, len=1*/ &Cinfo[245], &Prop147}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop145 = { - 0xCAC7, /*start :是*/ - 0xCAC7, /*end :是, len=1*/ + 0xCAA7, /*start :失*/ + 0xCAA7, /*end :失, len=1*/ &Cinfo[244], &Prop146}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop144 = { - 0xCABD, /*start :式*/ - 0xCABE, /*end :示, len=2*/ - &Cinfo[242], + 0xC9E8, /*start :设*/ + 0xC9E8, /*end :设, len=1*/ + &Cinfo[243], &Prop145}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop143 = { - 0xCAB9, /*start :使*/ - 0xCAB9, /*end :使, len=1*/ - &Cinfo[241], + 0xC9DC, /*start :绍*/ + 0xC9DC, /*end :绍, len=1*/ + &Cinfo[242], &Prop144}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop142 = { - 0xCAB5, /*start :实*/ - 0xCAB5, /*end :实, len=1*/ - &Cinfo[240], + 0xC9CF, /*start :上*/ + 0xC9CF, /*end :上, len=1*/ + &Cinfo[241], &Prop143}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop141 = { - 0xCAB1, /*start :时*/ - 0xCAB1, /*end :时, len=1*/ - &Cinfo[239], + 0xC8EB, /*start :入*/ + 0xC8EB, /*end :入, len=1*/ + &Cinfo[240], &Prop142}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop140 = { - 0xCAAF, /*start :石*/ - 0xCAAF, /*end :石, len=1*/ - &Cinfo[238], + 0xC8D5, /*start :日*/ + 0xC8D5, /*end :日, len=1*/ + &Cinfo[239], &Prop141}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop139 = { - 0xCAA7, /*start :失*/ - 0xCAA7, /*end :失, len=1*/ - &Cinfo[237], + 0xC8CF, /*start :认*/ + 0xC8CF, /*end :认, len=1*/ + &Cinfo[238], &Prop140}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop138 = { - 0xC9E8, /*start :设*/ - 0xC9E8, /*end :设, len=1*/ - &Cinfo[236], + 0xC8B7, /*start :确*/ + 0xC8B7, /*end :确, len=1*/ + &Cinfo[237], &Prop139}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop137 = { - 0xC9DC, /*start :绍*/ - 0xC9DC, /*end :绍, len=1*/ - &Cinfo[235], + 0xC8AB, /*start :全*/ + 0xC8AB, /*end :全, len=1*/ + &Cinfo[236], &Prop138}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop136 = { - 0xC9CF, /*start :上*/ - 0xC9CF, /*end :上, len=1*/ - &Cinfo[234], + 0xC8A1, /*start :取*/ + 0xC8A1, /*end :取, len=1*/ + &Cinfo[235], &Prop137}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop135 = { - 0xC8EB, /*start :入*/ - 0xC8EB, /*end :入, len=1*/ - &Cinfo[233], + 0xC7FD, /*start :驱*/ + 0xC7FD, /*end :驱, len=1*/ + &Cinfo[234], &Prop136}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop134 = { - 0xC8D5, /*start :日*/ - 0xC8D5, /*end :日, len=1*/ - &Cinfo[232], + 0xC7FA, /*start :曲*/ + 0xC7FA, /*end :曲, len=1*/ + &Cinfo[233], &Prop135}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop133 = { - 0xC8CF, /*start :认*/ - 0xC8CF, /*end :认, len=1*/ - &Cinfo[231], + 0xC7F8, /*start :区*/ + 0xC7F8, /*end :区, len=1*/ + &Cinfo[232], &Prop134}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop132 = { - 0xC8B7, /*start :确*/ - 0xC8B7, /*end :确, len=1*/ - &Cinfo[230], + 0xC7F3, /*start :求*/ + 0xC7F3, /*end :求, len=1*/ + &Cinfo[231], &Prop133}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop131 = { - 0xC8AB, /*start :全*/ - 0xC8AB, /*end :全, len=1*/ - &Cinfo[229], + 0xC7D0, /*start :切*/ + 0xC7D0, /*end :切, len=1*/ + &Cinfo[230], &Prop132}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop130 = { - 0xC8A1, /*start :取*/ - 0xC8A1, /*end :取, len=1*/ - &Cinfo[228], + 0xC7B0, /*start :前*/ + 0xC7B0, /*end :前, len=1*/ + &Cinfo[229], &Prop131}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop129 = { - 0xC7FD, /*start :驱*/ - 0xC7FD, /*end :驱, len=1*/ + 0xC6F7, /*start :器*/ + 0xC6F8, /*end :气, len=2*/ &Cinfo[227], &Prop130}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop128 = { - 0xC7FA, /*start :曲*/ - 0xC7FA, /*end :曲, len=1*/ + 0xC6F4, /*start :启*/ + 0xC6F4, /*end :启, len=1*/ &Cinfo[226], &Prop129}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop127 = { - 0xC7F8, /*start :区*/ - 0xC7F8, /*end :区, len=1*/ + 0xC6E4, /*start :其*/ + 0xC6E4, /*end :其, len=1*/ &Cinfo[225], &Prop128}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop126 = { - 0xC7F3, /*start :求*/ - 0xC7F3, /*end :求, len=1*/ + 0xC6DA, /*start :期*/ + 0xC6DA, /*end :期, len=1*/ &Cinfo[224], &Prop127}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop125 = { - 0xC7D0, /*start :切*/ - 0xC7D0, /*end :切, len=1*/ + 0xC6C1, /*start :屏*/ + 0xC6C1, /*end :屏, len=1*/ &Cinfo[223], &Prop126}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop124 = { - 0xC6F7, /*start :器*/ - 0xC6F8, /*end :气, len=2*/ - &Cinfo[221], + 0xC6BD, /*start :平*/ + 0xC6BD, /*end :平, len=1*/ + &Cinfo[222], &Prop125}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop123 = { - 0xC6F4, /*start :启*/ - 0xC6F4, /*end :启, len=1*/ - &Cinfo[220], + 0xC6B5, /*start :频*/ + 0xC6B5, /*end :频, len=1*/ + &Cinfo[221], &Prop124}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop122 = { - 0xC6E4, /*start :其*/ - 0xC6E4, /*end :其, len=1*/ - &Cinfo[219], + 0xC5C5, /*start :排*/ + 0xC5C5, /*end :排, len=1*/ + &Cinfo[220], &Prop123}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop121 = { - 0xC6DA, /*start :期*/ - 0xC6DA, /*end :期, len=1*/ - &Cinfo[218], + 0xC4DC, /*start :能*/ + 0xC4DC, /*end :能, len=1*/ + &Cinfo[219], &Prop122}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop120 = { - 0xC6C1, /*start :屏*/ - 0xC6C1, /*end :屏, len=1*/ - &Cinfo[217], + 0xC4BF, /*start :目*/ + 0xC4BF, /*end :目, len=1*/ + &Cinfo[218], &Prop121}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop119 = { - 0xC5C5, /*start :排*/ - 0xC5C5, /*end :排, len=1*/ - &Cinfo[216], + 0xC4BB, /*start :幕*/ + 0xC4BB, /*end :幕, len=1*/ + &Cinfo[217], &Prop120}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop118 = { - 0xC4DC, /*start :能*/ - 0xC4DC, /*end :能, len=1*/ - &Cinfo[215], + 0xC4A6, /*start :摩*/ + 0xC4A6, /*end :摩, len=1*/ + &Cinfo[216], &Prop119}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop117 = { - 0xC4BF, /*start :目*/ - 0xC4BF, /*end :目, len=1*/ - &Cinfo[214], + 0xC4A3, /*start :模*/ + 0xC4A3, /*end :模, len=1*/ + &Cinfo[215], &Prop118}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop116 = { - 0xC4BB, /*start :幕*/ - 0xC4BB, /*end :幕, len=1*/ - &Cinfo[213], + 0xC3C5, /*start :门*/ + 0xC3C5, /*end :门, len=1*/ + &Cinfo[214], &Prop117}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop115 = { - 0xC4A6, /*start :摩*/ - 0xC4A6, /*end :摩, len=1*/ - &Cinfo[212], + 0xC2DF, /*start :逻*/ + 0xC2DF, /*end :逻, len=1*/ + &Cinfo[213], &Prop116}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop114 = { - 0xC4A3, /*start :模*/ - 0xC4A3, /*end :模, len=1*/ - &Cinfo[211], + 0xC2CA, /*start :率*/ + 0xC2CA, /*end :率, len=1*/ + &Cinfo[212], &Prop115}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop113 = { - 0xC3C5, /*start :门*/ - 0xC3C5, /*end :门, len=1*/ - &Cinfo[210], + 0xC1F7, /*start :流*/ + 0xC1F7, /*end :流, len=1*/ + &Cinfo[211], &Prop114}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop112 = { - 0xC2DF, /*start :逻*/ - 0xC2DF, /*end :逻, len=1*/ - &Cinfo[209], + 0xC1BF, /*start :量*/ + 0xC1BF, /*end :量, len=1*/ + &Cinfo[210], &Prop113}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop111 = { - 0xC2CA, /*start :率*/ - 0xC2CA, /*end :率, len=1*/ - &Cinfo[208], + 0xC1AC, /*start :连*/ + 0xC1AC, /*end :连, len=1*/ + &Cinfo[209], &Prop112}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop110 = { - 0xC1F7, /*start :流*/ - 0xC1F7, /*end :流, len=1*/ - &Cinfo[207], + 0xC1A6, /*start :力*/ + 0xC1A6, /*end :力, len=1*/ + &Cinfo[208], &Prop111}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop109 = { - 0xC1BF, /*start :量*/ - 0xC1BF, /*end :量, len=1*/ - &Cinfo[206], + 0xC0ED, /*start :理*/ + 0xC0ED, /*end :理, len=1*/ + &Cinfo[207], &Prop110}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop108 = { - 0xC1AC, /*start :连*/ - 0xC1AC, /*end :连, len=1*/ - &Cinfo[205], + 0xC0EB, /*start :离*/ + 0xC0EB, /*end :离, len=1*/ + &Cinfo[206], &Prop109}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop107 = { - 0xC1A6, /*start :力*/ - 0xC1A6, /*end :力, len=1*/ - &Cinfo[204], + 0xC0E0, /*start :类*/ + 0xC0E0, /*end :类, len=1*/ + &Cinfo[205], &Prop108}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop106 = { - 0xC0ED, /*start :理*/ - 0xC0ED, /*end :理, len=1*/ - &Cinfo[203], + 0xC0DB, /*start :累*/ + 0xC0DB, /*end :累, len=1*/ + &Cinfo[204], &Prop107}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop105 = { - 0xC0EB, /*start :离*/ - 0xC0EB, /*end :离, len=1*/ - &Cinfo[202], + 0xBFEC, /*start :快*/ + 0xBFEC, /*end :快, len=1*/ + &Cinfo[203], &Prop106}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop104 = { - 0xC0E0, /*start :类*/ - 0xC0E0, /*end :类, len=1*/ - &Cinfo[201], + 0xBFE9, /*start :块*/ + 0xBFE9, /*end :块, len=1*/ + &Cinfo[202], &Prop105}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop103 = { - 0xC0DB, /*start :累*/ - 0xC0DB, /*end :累, len=1*/ - &Cinfo[200], + 0xBFD8, /*start :控*/ + 0xBFD8, /*end :控, len=1*/ + &Cinfo[201], &Prop104}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop102 = { - 0xBFEC, /*start :快*/ - 0xBFEC, /*end :快, len=1*/ - &Cinfo[199], + 0xBFAA, /*start :开*/ + 0xBFAA, /*end :开, len=1*/ + &Cinfo[200], &Prop103}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop101 = { - 0xBFE9, /*start :块*/ - 0xBFE9, /*end :块, len=1*/ - &Cinfo[198], + 0xBEDE, /*start :巨*/ + 0xBEDE, /*end :巨, len=1*/ + &Cinfo[199], &Prop102}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop100 = { - 0xBFD8, /*start :控*/ - 0xBFD8, /*end :控, len=1*/ - &Cinfo[197], + 0xBEAF, /*start :警*/ + 0xBEAF, /*end :警, len=1*/ + &Cinfo[198], &Prop101}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop99 = { - 0xBFAA, /*start :开*/ - 0xBFAA, /*end :开, len=1*/ - &Cinfo[196], + 0xBDFB, /*start :禁*/ + 0xBDFB, /*end :禁, len=1*/ + &Cinfo[197], &Prop100}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop98 = { - 0xBEDE, /*start :巨*/ - 0xBEDE, /*end :巨, len=1*/ - &Cinfo[195], + 0xBDF8, /*start :进*/ + 0xBDF8, /*end :进, len=1*/ + &Cinfo[196], &Prop99}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop97 = { - 0xBEAF, /*start :警*/ - 0xBEAF, /*end :警, len=1*/ - &Cinfo[194], + 0xBDE9, /*start :介*/ + 0xBDE9, /*end :介, len=1*/ + &Cinfo[195], &Prop98}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop96 = { - 0xBDFB, /*start :禁*/ - 0xBDFB, /*end :禁, len=1*/ - &Cinfo[193], + 0xBDE1, /*start :结*/ + 0xBDE1, /*end :结, len=1*/ + &Cinfo[194], &Prop97}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop95 = { - 0xBDF8, /*start :进*/ - 0xBDF8, /*end :进, len=1*/ - &Cinfo[192], + 0xBDDA, /*start :节*/ + 0xBDDA, /*end :节, len=1*/ + &Cinfo[193], &Prop96}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop94 = { - 0xBDE9, /*start :介*/ - 0xBDE9, /*end :介, len=1*/ - &Cinfo[191], + 0xBDC7, /*start :角*/ + 0xBDC7, /*end :角, len=1*/ + &Cinfo[192], &Prop95}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop93 = { - 0xBDE1, /*start :结*/ - 0xBDE1, /*end :结, len=1*/ - &Cinfo[190], + 0xBDAD, /*start :江*/ + 0xBDAD, /*end :江, len=1*/ + &Cinfo[191], &Prop94}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop92 = { - 0xBDDA, /*start :节*/ - 0xBDDA, /*end :节, len=1*/ - &Cinfo[189], + 0xBCF5, /*start :减*/ + 0xBCF5, /*end :减, len=1*/ + &Cinfo[190], &Prop93}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop91 = { - 0xBDC7, /*start :角*/ - 0xBDC7, /*end :角, len=1*/ - &Cinfo[188], + 0xBCEC, /*start :检*/ + 0xBCEC, /*end :检, len=1*/ + &Cinfo[189], &Prop92}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop90 = { - 0xBDAD, /*start :江*/ - 0xBDAD, /*end :江, len=1*/ - &Cinfo[187], + 0xBCE4, /*start :间*/ + 0xBCE4, /*end :间, len=1*/ + &Cinfo[188], &Prop91}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop89 = { - 0xBCF5, /*start :减*/ - 0xBCF5, /*end :减, len=1*/ - &Cinfo[186], + 0xBCD3, /*start :加*/ + 0xBCD3, /*end :加, len=1*/ + &Cinfo[187], &Prop90}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop88 = { - 0xBCEC, /*start :检*/ - 0xBCEC, /*end :检, len=1*/ - &Cinfo[185], + 0xBCCA, /*start :际*/ + 0xBCCA, /*end :际, len=1*/ + &Cinfo[186], &Prop89}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop87 = { - 0xBCE4, /*start :间*/ - 0xBCE4, /*end :间, len=1*/ - &Cinfo[184], + 0xBCC6, /*start :计*/ + 0xBCC6, /*end :计, len=1*/ + &Cinfo[185], &Prop88}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop86 = { - 0xBCD3, /*start :加*/ - 0xBCD3, /*end :加, len=1*/ - &Cinfo[183], + 0xBCBC, /*start :技*/ + 0xBCBC, /*end :技, len=1*/ + &Cinfo[184], &Prop87}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop85 = { - 0xBCCA, /*start :际*/ - 0xBCCA, /*end :际, len=1*/ - &Cinfo[182], + 0xBCB6, /*start :级*/ + 0xBCB6, /*end :级, len=1*/ + &Cinfo[183], &Prop86}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop84 = { - 0xBCC6, /*start :计*/ - 0xBCC6, /*end :计, len=1*/ - &Cinfo[181], + 0xBCAD, /*start :辑*/ + 0xBCAD, /*end :辑, len=1*/ + &Cinfo[182], &Prop85}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop83 = { - 0xBCBC, /*start :技*/ - 0xBCBC, /*end :技, len=1*/ - &Cinfo[180], + 0xBCA4, /*start :激*/ + 0xBCA4, /*end :激, len=1*/ + &Cinfo[181], &Prop84}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop82 = { - 0xBCB6, /*start :级*/ - 0xBCB6, /*end :级, len=1*/ - &Cinfo[179], + 0xBBFD, /*start :积*/ + 0xBBFD, /*end :积, len=1*/ + &Cinfo[180], &Prop83}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop81 = { - 0xBCAD, /*start :辑*/ - 0xBCAD, /*end :辑, len=1*/ - &Cinfo[178], + 0xBBFA, /*start :机*/ + 0xBBFA, /*end :机, len=1*/ + &Cinfo[179], &Prop82}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop80 = { - 0xBCA4, /*start :激*/ - 0xBCA4, /*end :激, len=1*/ - &Cinfo[177], + 0xBBF2, /*start :或*/ + 0xBBF2, /*end :或, len=1*/ + &Cinfo[178], &Prop81}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop79 = { - 0xBBFD, /*start :积*/ - 0xBBFD, /*end :积, len=1*/ - &Cinfo[176], + 0xBBEE, /*start :活*/ + 0xBBEE, /*end :活, len=1*/ + &Cinfo[177], &Prop80}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop78 = { - 0xBBFA, /*start :机*/ - 0xBBFA, /*end :机, len=1*/ - &Cinfo[175], + 0xBBEC, /*start :混*/ + 0xBBEC, /*end :混, len=1*/ + &Cinfo[176], &Prop79}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop77 = { - 0xBBF2, /*start :或*/ - 0xBBF2, /*end :或, len=1*/ - &Cinfo[174], + 0xBBD6, /*start :恢*/ + 0xBBD6, /*end :恢, len=1*/ + &Cinfo[175], &Prop78}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop76 = { - 0xBBEE, /*start :活*/ - 0xBBEE, /*end :活, len=1*/ - &Cinfo[173], + 0xBBC9, /*start :簧*/ + 0xBBC9, /*end :簧, len=1*/ + &Cinfo[174], &Prop77}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop75 = { - 0xBBEC, /*start :混*/ - 0xBBEC, /*end :混, len=1*/ - &Cinfo[172], + 0xBBB6, /*start :欢*/ + 0xBBB6, /*end :欢, len=1*/ + &Cinfo[173], &Prop76}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop74 = { - 0xBBD6, /*start :恢*/ - 0xBBD6, /*end :恢, len=1*/ - &Cinfo[171], + 0xBBA4, /*start :护*/ + 0xBBA4, /*end :护, len=1*/ + &Cinfo[172], &Prop75}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop73 = { - 0xBBC9, /*start :簧*/ - 0xBBC9, /*end :簧, len=1*/ - &Cinfo[170], + 0xBAF3, /*start :后*/ + 0xBAF3, /*end :后, len=1*/ + &Cinfo[171], &Prop74}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop72 = { - 0xBBB6, /*start :欢*/ - 0xBBB6, /*end :欢, len=1*/ - &Cinfo[169], + 0xBAE2, /*start :衡*/ + 0xBAE2, /*end :衡, len=1*/ + &Cinfo[170], &Prop73}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop71 = { - 0xBBA4, /*start :护*/ - 0xBBA4, /*end :护, len=1*/ - &Cinfo[168], + 0xBACF, /*start :合*/ + 0xBACF, /*end :合, len=1*/ + &Cinfo[169], &Prop72}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop70 = { - 0xBAF3, /*start :后*/ - 0xBAF3, /*end :后, len=1*/ - &Cinfo[167], + 0xBAC5, /*start :号*/ + 0xBAC5, /*end :号, len=1*/ + &Cinfo[168], &Prop71}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop69 = { - 0xBACF, /*start :合*/ - 0xBACF, /*end :合, len=1*/ - &Cinfo[166], + 0xB9E6, /*start :规*/ + 0xB9E6, /*end :规, len=1*/ + &Cinfo[167], &Prop70}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop68 = { - 0xBAC5, /*start :号*/ - 0xBAC5, /*end :号, len=1*/ - &Cinfo[165], + 0xB9D8, /*start :关*/ + 0xB9D8, /*end :关, len=1*/ + &Cinfo[166], &Prop69}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop67 = { - 0xB9E6, /*start :规*/ - 0xB9E6, /*end :规, len=1*/ - &Cinfo[164], + 0xB9CA, /*start :故*/ + 0xB9CA, /*end :故, len=1*/ + &Cinfo[165], &Prop68}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop66 = { - 0xB9D8, /*start :关*/ - 0xB9D8, /*end :关, len=1*/ - &Cinfo[163], + 0xB9B9, /*start :构*/ + 0xB9B9, /*end :构, len=1*/ + &Cinfo[164], &Prop67}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop65 = { - 0xB9CA, /*start :故*/ - 0xB9CA, /*end :故, len=1*/ - &Cinfo[162], + 0xB9AB, /*start :公*/ + 0xB9AB, /*end :公, len=1*/ + &Cinfo[163], &Prop66}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop64 = { - 0xB9B9, /*start :构*/ - 0xB9B9, /*end :构, len=1*/ - &Cinfo[161], + 0xB9A9, /*start :供*/ + 0xB9A9, /*end :供, len=1*/ + &Cinfo[162], &Prop65}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop63 = { - 0xB9AB, /*start :公*/ - 0xB9AB, /*end :公, len=1*/ - &Cinfo[160], + 0xB9A6, /*start :功*/ + 0xB9A6, /*end :功, len=1*/ + &Cinfo[161], &Prop64}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop62 = { - 0xB9A9, /*start :供*/ - 0xB9A9, /*end :供, len=1*/ - &Cinfo[159], + 0xB9A4, /*start :工*/ + 0xB9A4, /*end :工, len=1*/ + &Cinfo[160], &Prop63}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop61 = { - 0xB9A6, /*start :功*/ - 0xB9A6, /*end :功, len=1*/ - &Cinfo[158], + 0xB8F1, /*start :格*/ + 0xB8F1, /*end :格, len=1*/ + &Cinfo[159], &Prop62}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop60 = { - 0xB9A4, /*start :工*/ - 0xB9A4, /*end :工, len=1*/ - &Cinfo[157], + 0xB8DF, /*start :高*/ + 0xB8DF, /*end :高, len=1*/ + &Cinfo[158], &Prop61}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop59 = { - 0xB8F1, /*start :格*/ - 0xB8F1, /*end :格, len=1*/ - &Cinfo[156], + 0xB8D0, /*start :感*/ + 0xB8D0, /*end :感, len=1*/ + &Cinfo[157], &Prop60}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop58 = { - 0xB8DF, /*start :高*/ - 0xB8DF, /*end :高, len=1*/ - &Cinfo[155], + 0xB8B4, /*start :复*/ + 0xB8B4, /*end :复, len=1*/ + &Cinfo[156], &Prop59}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop57 = { - 0xB8D0, /*start :感*/ - 0xB8D0, /*end :感, len=1*/ - &Cinfo[154], + 0xB7F1, /*start :否*/ + 0xB7F1, /*end :否, len=1*/ + &Cinfo[155], &Prop58}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop56 = { - 0xB8B4, /*start :复*/ - 0xB8B4, /*end :复, len=1*/ - &Cinfo[153], + 0xB7D6, /*start :分*/ + 0xB7D6, /*end :分, len=1*/ + &Cinfo[154], &Prop57}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop55 = { - 0xB7F1, /*start :否*/ - 0xB7F1, /*end :否, len=1*/ - &Cinfo[152], + 0xB7BD, /*start :方*/ + 0xB7BD, /*end :方, len=1*/ + &Cinfo[153], &Prop56}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop54 = { - 0xB7D6, /*start :分*/ - 0xB7D6, /*end :分, len=1*/ - &Cinfo[151], + 0xB7B6, /*start :范*/ + 0xB7B6, /*end :范, len=1*/ + &Cinfo[152], &Prop55}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop53 = { - 0xB7BD, /*start :方*/ - 0xB7BD, /*end :方, len=1*/ - &Cinfo[150], + 0xB7B4, /*start :反*/ + 0xB7B4, /*end :反, len=1*/ + &Cinfo[151], &Prop54}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop52 = { - 0xB7B6, /*start :范*/ - 0xB7B6, /*end :范, len=1*/ + 0xB7A7, /*start :阀*/ + 0xB7A8, /*end :法, len=2*/ &Cinfo[149], &Prop53}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop51 = { - 0xB7B4, /*start :反*/ - 0xB7B4, /*end :反, len=1*/ + 0xB7A2, /*start :发*/ + 0xB7A2, /*end :发, len=1*/ &Cinfo[148], &Prop52}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop50 = { - 0xB7A7, /*start :阀*/ - 0xB7A7, /*end :阀, len=1*/ + 0xB6CF, /*start :断*/ + 0xB6CF, /*end :断, len=1*/ &Cinfo[147], &Prop51}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop49 = { - 0xB7A2, /*start :发*/ - 0xB7A2, /*end :发, len=1*/ + 0xB6C8, /*start :度*/ + 0xB6C8, /*end :度, len=1*/ &Cinfo[146], &Prop50}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop48 = { - 0xB6CF, /*start :断*/ - 0xB6CF, /*end :断, len=1*/ + 0xB6AF, /*start :动*/ + 0xB6AF, /*end :动, len=1*/ &Cinfo[145], &Prop49}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop47 = { - 0xB6C8, /*start :度*/ - 0xB6C8, /*end :度, len=1*/ + 0xB6A8, /*start :定*/ + 0xB6A8, /*end :定, len=1*/ &Cinfo[144], &Prop48}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop46 = { - 0xB6AF, /*start :动*/ - 0xB6AF, /*end :动, len=1*/ + 0xB5F7, /*start :调*/ + 0xB5F7, /*end :调, len=1*/ &Cinfo[143], &Prop47}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop45 = { - 0xB6A8, /*start :定*/ - 0xB6A8, /*end :定, len=1*/ + 0xB5E7, /*start :电*/ + 0xB5E7, /*end :电, len=1*/ &Cinfo[142], &Prop46}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop44 = { - 0xB5F7, /*start :调*/ - 0xB5F7, /*end :调, len=1*/ + 0xB5D8, /*start :地*/ + 0xB5D8, /*end :地, len=1*/ &Cinfo[141], &Prop45}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop43 = { - 0xB5E7, /*start :电*/ - 0xB5E7, /*end :电, len=1*/ + 0xB5C8, /*start :等*/ + 0xB5C8, /*end :等, len=1*/ &Cinfo[140], &Prop44}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop42 = { - 0xB5D8, /*start :地*/ - 0xB5D8, /*end :地, len=1*/ + 0xB5B1, /*start :当*/ + 0xB5B1, /*end :当, len=1*/ &Cinfo[139], &Prop43}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop41 = { - 0xB5C8, /*start :等*/ - 0xB5C8, /*end :等, len=1*/ + 0xB5AF, /*start :弹*/ + 0xB5AF, /*end :弹, len=1*/ &Cinfo[138], &Prop42}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop40 = { - 0xB5AF, /*start :弹*/ - 0xB5AF, /*end :弹, len=1*/ + 0xB5A5, /*start :单*/ + 0xB5A5, /*end :单, len=1*/ &Cinfo[137], &Prop41}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop39 = { - 0xB5A5, /*start :单*/ - 0xB5A5, /*end :单, len=1*/ + 0xB4FD, /*start :待*/ + 0xB4FD, /*end :待, len=1*/ &Cinfo[136], &Prop40}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop38 = { - 0xB4FD, /*start :待*/ - 0xB4FD, /*end :待, len=1*/ + 0xB4F3, /*start :大*/ + 0xB4F3, /*end :大, len=1*/ &Cinfo[135], &Prop39}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop37 = { - 0xB4F3, /*start :大*/ - 0xB4F3, /*end :大, len=1*/ + 0xB4ED, /*start :错*/ + 0xB4ED, /*end :错, len=1*/ &Cinfo[134], &Prop38}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop36 = { - 0xB4ED, /*start :错*/ - 0xB4ED, /*end :错, len=1*/ + 0xB4E6, /*start :存*/ + 0xB4E6, /*end :存, len=1*/ &Cinfo[133], &Prop37}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop35 = { - 0xB4E6, /*start :存*/ - 0xB4E6, /*end :存, len=1*/ + 0xB4CE, /*start :次*/ + 0xB4CE, /*end :次, len=1*/ &Cinfo[132], &Prop36}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop34 = { - 0xB4CE, /*start :次*/ - 0xB4CE, /*end :次, len=1*/ + 0xB4C5, /*start :磁*/ + 0xB4C5, /*end :磁, len=1*/ &Cinfo[131], &Prop35}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop33 = { - 0xB4C5, /*start :磁*/ - 0xB4C5, /*end :磁, len=1*/ + 0xB4AB, /*start :传*/ + 0xB4AB, /*end :传, len=1*/ &Cinfo[130], &Prop34}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop32 = { - 0xB4AB, /*start :传*/ - 0xB4AB, /*end :传, len=1*/ - &Cinfo[129], + 0xB4A5, /*start :触*/ + 0xB4A6, /*end :处, len=2*/ + &Cinfo[128], &Prop33}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop31 = { - 0xB4A5, /*start :触*/ - 0xB4A6, /*end :处, len=2*/ + 0xB3FD, /*start :除*/ + 0xB3FD, /*end :除, len=1*/ &Cinfo[127], &Prop32}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop30 = { - 0xB3FD, /*start :除*/ - 0xB3FD, /*end :除, len=1*/ + 0xB3F6, /*start :出*/ + 0xB3F6, /*end :出, len=1*/ &Cinfo[126], &Prop31}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop29 = { - 0xB3F6, /*start :出*/ - 0xB3F6, /*end :出, len=1*/ + 0xB3D6, /*start :持*/ + 0xB3D6, /*end :持, len=1*/ &Cinfo[125], &Prop30}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop28 = { - 0xB3D6, /*start :持*/ - 0xB3D6, /*end :持, len=1*/ + 0xB3CC, /*start :程*/ + 0xB3CC, /*end :程, len=1*/ &Cinfo[124], &Prop29}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop27 = { - 0xB3CC, /*start :程*/ - 0xB3CC, /*end :程, len=1*/ + 0xB3C9, /*start :成*/ + 0xB3C9, /*end :成, len=1*/ &Cinfo[123], &Prop28}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop26 = { - 0xB3C9, /*start :成*/ - 0xB3C9, /*end :成, len=1*/ + 0xB3AC, /*start :超*/ + 0xB3AC, /*end :超, len=1*/ &Cinfo[122], &Prop27}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop25 = { - 0xB3AC, /*start :超*/ - 0xB3AC, /*end :超, len=1*/ + 0xB3A7, /*start :厂*/ + 0xB3A7, /*end :厂, len=1*/ &Cinfo[121], &Prop26}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop24 = { - 0xB3A7, /*start :厂*/ - 0xB3A7, /*end :厂, len=1*/ + 0xB3A3, /*start :常*/ + 0xB3A3, /*end :常, len=1*/ &Cinfo[120], &Prop25}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop23 = { - 0xB3A3, /*start :常*/ - 0xB3A3, /*end :常, len=1*/ + 0xB2EE, /*start :差*/ + 0xB2EE, /*end :差, len=1*/ &Cinfo[119], &Prop24}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop22 = { - 0xB2EE, /*start :差*/ - 0xB2EE, /*end :差, len=1*/ + 0xB2E9, /*start :查*/ + 0xB2E9, /*end :查, len=1*/ &Cinfo[118], &Prop23}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop21 = { - 0xB2E9, /*start :查*/ - 0xB2E9, /*end :查, len=1*/ + 0xB2E2, /*start :测*/ + 0xB2E2, /*end :测, len=1*/ &Cinfo[117], &Prop22}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop20 = { - 0xB2E2, /*start :测*/ - 0xB2E2, /*end :测, len=1*/ + 0xB2CE, /*start :参*/ + 0xB2CE, /*end :参, len=1*/ &Cinfo[116], &Prop21}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop19 = { - 0xB2CE, /*start :参*/ - 0xB2CE, /*end :参, len=1*/ + 0xB2CB, /*start :菜*/ + 0xB2CB, /*end :菜, len=1*/ &Cinfo[115], &Prop20}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop18 = { - 0xB2CB, /*start :菜*/ - 0xB2CB, /*end :菜, len=1*/ + 0xB2C1, /*start :擦*/ + 0xB2C1, /*end :擦, len=1*/ &Cinfo[114], &Prop19}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop17 = { - 0xB2C1, /*start :擦*/ - 0xB2C1, /*end :擦, len=1*/ + 0xB1EA, /*start :标*/ + 0xB1EA, /*end :标, len=1*/ &Cinfo[113], &Prop18}; static GUI_CONST_STORAGE GUI_FONT_PROP Prop16 = { - 0xB1EA, /*start :标*/ - 0xB1EA, /*end :标, len=1*/ + 0xB1E4, /*start :变*/ + 0xB1E4, /*end :变, len=1*/ &Cinfo[112], &Prop17}; diff --git a/User/lib/lcd/lcds.h b/User/lib/lcd/lcds.h index ec0a138..e9d707b 100644 --- a/User/lib/lcd/lcds.h +++ b/User/lib/lcd/lcds.h @@ -8,7 +8,7 @@ /** 定位器功能菜单介绍无江苏巨石数字技术有限公司实际行程目标报警提示自动手校验整详细设置备调试气作用电流输入范围开关显正常反类型直角速率增加 -减小下上供压力阀门特性信号切除值线等于快义闭使方式触发处理错误死区连续暂停待时间源次累计温度摩擦弹驱逻辑禁其他排量高级控制参准积分激活出传感选择语言中文向恢复厂否是诊断全允许移或启结束差最大混合滞后簧欢迎智版本主执机构地址日期编息双曲节通讯模块屏幕英工磁条在离确认保持完成存失败载取消进故障超规格检查要求维护测重℃○●↑↓√ +减小下上供压力阀门特性信号切除值线等于快义闭使方式触发处理错误死区连续暂停待时间源次累计温度摩擦弹驱逻辑禁其他排量高级控制参准积分激活出传感选择语言中文向恢复厂否是诊断全允许移或启结束差最大混合滞后簧欢迎智版本主执机构地址日期编息双曲节通讯模块屏幕英工磁条在离确认保持完成存失败载取消进故障超规格检查要求维护测重算法变频平衡当前已域℃○●↑↓√ */ #ifndef __LCDS_H__ #define __LCDS_H__ diff --git a/User/lib/lcd/uc_gui.lib b/User/lib/lcd/uc_gui.lib index b5a03a5..b5bb176 100644 Binary files a/User/lib/lcd/uc_gui.lib and b/User/lib/lcd/uc_gui.lib differ diff --git a/User/lib/src/filter.c b/User/lib/src/filter.c index d13c71e..53e8108 100644 --- a/User/lib/src/filter.c +++ b/User/lib/src/filter.c @@ -93,20 +93,20 @@ void lpf_reset(lpf_t *cfg) /** * 滑动平均窗口滤波 */ -lpf_window_t* lpf_window_init(uint16_t size) +lpf_window_t *lpf_window_init(uint16_t size) { - lpf_window_t* cfg = (lpf_window_t*)osel_mem_alloc(sizeof(lpf_window_t)); + lpf_window_t *cfg = (lpf_window_t *)osel_mem_alloc(sizeof(lpf_window_t)); DBG_ASSERT(cfg != NULL __DBG_LINE); - osel_memset((uint8_t*)cfg, 0, sizeof(lpf_window_t)); + osel_memset((uint8_t *)cfg, 0, sizeof(lpf_window_t)); cfg->size = size; - cfg->window = (float32*)osel_mem_alloc(sizeof(float32) * size); + cfg->window = (float32 *)osel_mem_alloc(sizeof(float32) * size); DBG_ASSERT(cfg->window != NULL __DBG_LINE); cfg->index = 0; cfg->sum = 0; return cfg; } -void lpf_window_dinit(lpf_window_t* cfg) +void lpf_window_dinit(lpf_window_t *cfg) { if (cfg != NULL) { @@ -119,14 +119,14 @@ void lpf_window_dinit(lpf_window_t* cfg) } // 滑动平均窗口重置 -void lpf_window_reset(lpf_window_t* cfg) +void lpf_window_reset(lpf_window_t *cfg) { cfg->index = 0; cfg->sum = 0; // osel_memset((uint8_t *)cfg->window, 0, sizeof(float32) * cfg->size); } -float32 lpf_window_update(lpf_window_t* cfg, float32 input) +float32 lpf_window_update(lpf_window_t *cfg, float32 input) { cfg->sum = 0; // 如果窗口未满,直接添加新值到当前索引位置 @@ -152,4 +152,3 @@ float32 lpf_window_update(lpf_window_t* cfg, float32 input) cfg->out = cfg->sum / cfg->index; return cfg->out; } - diff --git a/User/lib/src/lib.c b/User/lib/src/lib.c index fc5c10f..6f9212e 100644 --- a/User/lib/src/lib.c +++ b/User/lib/src/lib.c @@ -327,3 +327,37 @@ void stamp2Time(uint32_t stamp, rtc_date_t *date, rtc_time_t *time) } } } + +/**************************排序**************************/ +static void swap(uint16_t *a, uint16_t *b) +{ + uint16_t t = *a; + *a = *b; + *b = t; +} + +static int partition(uint16_t arr[], int low, int high) +{ + uint16_t pivot = arr[high]; + int i = (low - 1); + for (int j = low; j <= high - 1; j++) + { + if (arr[j] < pivot) + { + i++; + swap(&arr[i], &arr[j]); + } + } + swap(&arr[i + 1], &arr[high]); + return (i + 1); +} + +void quicksort(uint16_t arr[], int low, int high) +{ + if (low < high) + { + int pi = partition(arr, low, high); + quicksort(arr, low, pi - 1); + quicksort(arr, pi + 1, high); + } +} diff --git a/User/system/bsp/adcs.c b/User/system/bsp/adcs.c index 989b8ae..4a38ace 100644 --- a/User/system/bsp/adcs.c +++ b/User/system/bsp/adcs.c @@ -76,6 +76,28 @@ void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_chann } } +/** + * @brief ADC反初始化 + * @param {adcs_e} num ADC编号 + * @return {*} + * @note + */ +void adc_dinit(adcs_e num) +{ + DBG_ASSERT(num < ADCS_MAX __DBG_LINE); + adcs_t *p = &adcs[num]; + LL_ADC_REG_StopConversion(p->adc); + LL_DMA_DisableChannel(p->dma, p->dma_channel); + LL_ADC_Disable(p->adc); + if (p->adc_value != NULL) + { +#if defined(SRAM2_BASE) + osel_mem_free2(p->adc_value); +#else + osel_mem_free(p->adc_value); +#endif + } +} /** * @brief 获取ADC转换结果,只需要第一个值 * @param {adcs_e} num @@ -92,10 +114,6 @@ uint16_t adc_result_only_one(adcs_e num, uint8_t chan) return gram[0][chan]; } -/** - * 排序方法 - */ - /** * @brief 中位值平均滤波,获取ADC转换结果 * @param {adcs_e} num ADC编号 @@ -107,35 +125,18 @@ uint16_t adc_result_median_average(adcs_e num, uint8_t chan) { DBG_ASSERT(num < ADCS_MAX __DBG_LINE); uint16_t res = 0; - uint16_t temp = 0; - uint16_t *value = NULL; adcs_t *p = &adcs[num]; DBG_ASSERT(p != NULL __DBG_LINE); uint16_t adc_temp[p->adc_cct]; uint32_t adc_sum = 0; - value = (uint16_t *)osel_mem_alloc(sizeof(uint16_t) * p->adc_sum); - DBG_ASSERT(value != NULL __DBG_LINE); - osel_memcpy((uint8_t *)value, (uint8_t *)p->adc_value, sizeof(uint16_t) * p->adc_sum); - uint16_t(*gram)[p->adc_chans_count] = (uint16_t(*)[p->adc_chans_count])value; for (uint8_t i = 0; i < p->adc_cct; i++) { - adc_temp[i] = gram[i][chan]; + adc_temp[i] = p->adc_value[i * p->adc_chans_count + chan]; } - osel_mem_free(value); - for (uint8_t i = 0; i < p->adc_cct - 1; i++) - { - for (uint8_t j = 0; j < p->adc_cct - 1 - i; j++) - { - if (adc_temp[j] > adc_temp[j + 1]) - { - temp = adc_temp[j]; - adc_temp[j] = adc_temp[j + 1]; - adc_temp[j + 1] = temp; - } - } - } + quicksort(adc_temp, 0, p->adc_cct - 1); + for (uint8_t i = 0; i < p->adc_cct; i++) // 遍历所有ADC通道 { adc_sum += adc_temp[i]; // 将每个ADC通道的数据累加到adc_sum中 @@ -156,32 +157,14 @@ uint16_t adc_result_median(adcs_e num, uint8_t chan) { DBG_ASSERT(num < ADCS_MAX __DBG_LINE); uint16_t res = 0; - uint16_t temp = 0; - uint16_t *value = NULL; adcs_t *p = &adcs[num]; uint16_t adc_temp[p->adc_cct]; - value = (uint16_t *)osel_mem_alloc(sizeof(uint16_t) * p->adc_sum); - DBG_ASSERT(p != NULL __DBG_LINE); - DBG_ASSERT(value != NULL __DBG_LINE); - osel_memcpy((uint8_t *)value, (uint8_t *)p->adc_value, sizeof(uint16_t) * p->adc_sum); - uint16_t(*gram)[p->adc_chans_count] = (uint16_t(*)[p->adc_chans_count])value; for (uint8_t i = 0; i < p->adc_cct; i++) { - adc_temp[i] = gram[i][chan]; - } - osel_mem_free(value); - for (uint8_t i = 0; i < p->adc_cct - 1; i++) - { - for (uint8_t j = 0; j < p->adc_cct - 1 - i; j++) - { - if (adc_temp[j] > adc_temp[j + 1]) - { - temp = adc_temp[j]; - adc_temp[j] = adc_temp[j + 1]; - adc_temp[j + 1] = temp; - } - } + adc_temp[i] = p->adc_value[i * p->adc_chans_count + chan]; } + // 使用快速排序 + quicksort(adc_temp, 0, p->adc_cct - 1); res = adc_temp[p->adc_cct / 2]; return res; } @@ -196,20 +179,20 @@ uint16_t adc_result_median(adcs_e num, uint8_t chan) uint16_t adc_result_average(adcs_e num, uint8_t chan) { DBG_ASSERT(num < ADCS_MAX __DBG_LINE); - uint16_t res = 0; adcs_t *p = &adcs[num]; DBG_ASSERT(p != NULL __DBG_LINE); + DBG_ASSERT(p->adc_cct != 0 __DBG_LINE); // 避免除以零的错误 uint32_t adc_sum = 0; - uint16_t(*gram)[p->adc_chans_count] = (uint16_t(*)[p->adc_chans_count])p->adc_value; + for (uint8_t i = 0; i < p->adc_cct; i++) { - adc_sum += gram[i][chan]; + uint32_t next_sum = adc_sum + gram[i][chan]; + DBG_ASSERT(next_sum >= adc_sum __DBG_LINE); // 避免溢出 + adc_sum = next_sum; } - res = adc_sum / p->adc_cct; - - return res; + return adc_sum / p->adc_cct; } /** @@ -224,26 +207,18 @@ uint16_t adc_result_n_average(adcs_e num, uint8_t chan) DBG_ASSERT(num < ADCS_MAX __DBG_LINE); uint16_t res = 0; uint32_t adc_sum = 0; - uint16_t *value = NULL; adcs_t *p = &adcs[num]; DBG_ASSERT(p != NULL __DBG_LINE); uint16_t adc_temp[p->adc_cct]; uint8_t n = p->adc_cct / 4; uint8_t count = p->adc_cct > (2 * n) ? n : 0; - value = (uint16_t *)osel_mem_alloc(sizeof(uint16_t) * p->adc_sum); - DBG_ASSERT(value != NULL __DBG_LINE); - osel_memcpy((uint8_t *)value, (uint8_t *)p->adc_value, sizeof(uint16_t) * p->adc_sum); - uint16_t(*gram)[p->adc_chans_count] = (uint16_t(*)[p->adc_chans_count])value; + for (uint8_t i = 0; i < p->adc_cct; i++) { - adc_temp[i] = gram[i][chan]; + adc_temp[i] = p->adc_value[i * p->adc_chans_count + chan]; } - osel_mem_free(value); - for (uint8_t i = 0; i < p->adc_cct; i++) - { - adc_temp[i] = gram[i][chan]; - } - osel_quick_sort(adc_temp, 0, p->adc_cct - 1); + + quicksort(adc_temp, 0, p->adc_cct - 1); for (uint8_t i = count; i < p->adc_cct - count; i++) { diff --git a/User/system/bsp/adcs.h b/User/system/bsp/adcs.h index b245910..35d6510 100644 --- a/User/system/bsp/adcs.h +++ b/User/system/bsp/adcs.h @@ -84,6 +84,7 @@ typedef struct } adcs_t; extern void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_channel, uint8_t adc_cct, uint32_t channels); +extern void adc_dinit(adcs_e num); // ADC反初始化 extern uint16_t adc_result_only_one(adcs_e num, uint8_t chan); // 获取ADC转换结果,只需要第一个值 extern uint16_t adc_result_median_average(adcs_e num, uint8_t chan); // 中位值平均滤波,获取ADC转换结果 diff --git a/User/system/bsp/bsp.h b/User/system/bsp/bsp.h index 7ff625c..25b93cb 100644 --- a/User/system/bsp/bsp.h +++ b/User/system/bsp/bsp.h @@ -10,7 +10,6 @@ #include "eeprom.h" #include "spis.h" #include "i2cs.h" -#include "iwdgs.h" #define DMA_ClEAR_FLAG(DMAX, CHx, Flag) \ do \ diff --git a/User/system/bsp/flash.c b/User/system/bsp/flash.c new file mode 100644 index 0000000..8855cb7 --- /dev/null +++ b/User/system/bsp/flash.c @@ -0,0 +1,530 @@ +/** + * @file flash.c + * @author xxx + * @date 2024-02-07 11:49:34 + * @brief + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + * @attention + * + * ST 的官方驱动 LL 库并没有 flash 驱动。这里自己实现。 + * + * 1. 由于在 stm32l4xx_ll_system.h 中存在部分 FLASH 操作函数(ACR寄存器的处理)且不全面 + * 因此这里需要额外处理(重命名) + * + * 2. Main memory + * (1) FLASH_ACR 完成 + * (2) FLASH_PDKEYR 完成 + * (3) FLASH_KEYR 完成 + * (4) FLASH_OPTKEYR 完成 + * (5) FLASH_SR 完成 + * (6) FLASH_CR 完成 + * (7) FLASH_ECCR 完成 + * (8) FLASH_OPTR 未完成 + * (9) FLASH_PCROP1SR 未完成 + * 后续寄存器 均未完成 + * 3. Information block + * - System memory + * - OTP area + * - Option bytes + * 4. 根据 HAL 库的实现,相比于与手册的推荐流程,擦写的执行序列还有其他操作。 + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "flash.h" +#include "stm32l4xx_ll_rcc.h" +#include "stm32l4xx_ll_system.h" +#include "stm32l4xx_ll_pwr.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#define WHILE_MAX 10000U +/** @addtogroup STM32L4xx_LL_Driver + * @{ + */ + +/** @addtogroup FLASH_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup FLASH_LL_Private_Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup FLASH_LL_Private_Macros + * @{ + */ + +#define IS_LL_FLASH_WRITE_ADDR(__ADDR__) ((__ADDR__) % LL_FLASH_ALIGNMENT_MIN_SIZE == 0) + +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup FLASH_LL_Private_Functions FLASH Private functions + * @{ + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASH_LL_Exported_Functions + * @{ + */ +/** + * @brief Clear All Error in SR + * @param FLASHx FLASH Instance + * @retval None + */ +void LL_FLASH_ClearAllErrorFlag(void) +{ + LL_FLASH_ClearFlag_OPTVERR(FLASH); + LL_FLASH_ClearFlag_RDERR(FLASH); + LL_FLASH_ClearFlag_FASTERR(FLASH); + LL_FLASH_ClearFlag_MISERR(FLASH); + LL_FLASH_ClearFlag_PGSERR(FLASH); + LL_FLASH_ClearFlag_SIZERR(FLASH); + LL_FLASH_ClearFlag_PGAERR(FLASH); + LL_FLASH_ClearFlag_WRPERR(FLASH); + LL_FLASH_ClearFlag_PROGERR(FLASH); + LL_FLASH_ClearFlag_OPERR(FLASH); +} + +/** + * @brief Flush the instruction and data caches. + * @retval None + */ +void LL_FLASH_FlushCaches(void) +{ + /* Flush instruction cache */ + if (LL_FLASH_IsEnabledInstructionCache(FLASH)) + { + LL_FLASH_DisableInstructionCache(FLASH); + /* Reset instruction cache */ + LL_FLASH_InstructionCacheReset(FLASH); + /* Enable instruction cache */ + LL_FLASH_EnableInstructionCache(FLASH); + } + + /* Flush data cache */ + if (LL_FLASH_IsEnabledDataCache(FLASH)) + { + LL_FLASH_ZCS_DisableDataCache(FLASH); + /* Reset data cache */ + LL_FLASH_DataCacheReset(FLASH); + /* Enable data cache */ + LL_FLASH_ZCS_EnableDataCache(FLASH); + } +} + +/** + * @brief Erase Page + * @param pageno Page number + * @retval None + */ +ErrorStatus LL_FLASH_ErasePage(uint32_t pageno) +{ + uint16_t count = 0; + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* Check and clear all error programming flags due to a previous programming. If not, PGSERR is set. */ + LL_FLASH_ClearAllErrorFlag(); + + /* Set the PER bit and select the page you wish to erase (PNB) with the associated bank (BKER) in the Flash control register (FLASH_CR). */ + LL_FLASH_EnablePageErase(FLASH); + + if (pageno >= LL_FLASH_BANK1_PAGE_NUM) + { + pageno -= LL_FLASH_BANK1_PAGE_NUM; + LL_FLASH_SetErasePageBank(FLASH, LL_FLASH_BANK2); + } + else + { + LL_FLASH_SetErasePageBank(FLASH, LL_FLASH_BANK1); + } + + LL_FLASH_SetErasePageNo(FLASH, pageno); + + /* Set the STRT bit in the FLASH_CR register. */ + LL_FLASH_EraseStart(FLASH); + + /* Wait for the BSY bit to be cleared in the FLASH_SR register. */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* 完成只有需要清除擦除标志. */ + LL_FLASH_DisablePageErase(FLASH); + + /* Flush the caches to be sure of the data consistency */ + LL_FLASH_FlushCaches(); + + return SUCCESS; +} + +/** + * @brief Erase bank + * @param bank This parameter can be one of the following values: + * @arg @ref LL_FLASH_BANK1 + * @arg @ref LL_FLASH_BANK2 + * @retval None + */ +ErrorStatus LL_FLASH_EraseBank(uint32_t bank) +{ + uint16_t count = 0; + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* Check and clear all error programming flags due to a previous programming. If not, PGSERR is set. */ + LL_FLASH_ClearAllErrorFlag(); + + /* Set the MER1 bit or/and MER2 (depending on the bank) in the Flash control register (FLASH_CR). + Both banks can be selected in the same operation. */ + if (bank == LL_FLASH_BANK1) + { + LL_FLASH_EnableBank1Erase(FLASH); + } + else + { + LL_FLASH_EnableBank2Erase(FLASH); + } + + /* Set the STRT bit in the FLASH_CR register. */ + LL_FLASH_EraseStart(FLASH); + + /* Wait for the BSY bit to be cleared in the FLASH_SR register. */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* 完成只有需要清除擦除标志. */ + LL_FLASH_DisableBank1Erase(FLASH); + LL_FLASH_DisableBank2Erase(FLASH); + + /* Flush the caches to be sure of the data consistency */ + LL_FLASH_FlushCaches(); + return SUCCESS; +} + +/** + * @brief Erase Chip + * @param None + * @retval None + */ +ErrorStatus LL_FLASH_EraseChip(void) +{ + uint16_t count = 0; + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* Check and clear all error programming flags due to a previous programming. If not, PGSERR is set. */ + LL_FLASH_ClearAllErrorFlag(); + + /* Set the MER1 bit or/and MER2 (depending on the bank) in the Flash control register (FLASH_CR). + Both banks can be selected in the same operation. */ + LL_FLASH_EnableBank1Erase(FLASH); + LL_FLASH_EnableBank2Erase(FLASH); + + /* Set the STRT bit in the FLASH_CR register. */ + LL_FLASH_EraseStart(FLASH); + + /* Wait for the BSY bit to be cleared in the FLASH_SR register. */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* 完成只有需要清除擦除标志. */ + LL_FLASH_DisableBank1Erase(FLASH); + LL_FLASH_DisableBank2Erase(FLASH); + + /* Flush the caches to be sure of the data consistency */ + LL_FLASH_FlushCaches(); + return SUCCESS; +} + +/** + * @brief Program Double Word + * @param address specifies the address to be programmed. + * @param data specifies the data to be programmed. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Write successfully + * - ERROR: error + */ +ErrorStatus LL_FLASH_ProgramDoubleWord(uint32_t address, uint64_t data) +{ + assert_param(!IS_LL_FLASH_WRITE_ADDR(address)); + uint16_t count = 0; + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + /* Check and clear all error programming flags due to a previous programming. If not, PGSERR is set. */ + LL_FLASH_ClearAllErrorFlag(); + + /* Set the PG bit in the Flash control register (FLASH_CR). */ + LL_FLASH_EnableProgram(FLASH); + + /* Perform the data write operation at the desired memory address, inside main memory + block or OTP area. Only double word can be programmed. */ + /* Program the double word */ + *(__IO uint32_t *)address = (uint32_t)data; + *(__IO uint32_t *)(address + 4U) = (uint32_t)(data >> 32); + + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + /* Check that EOP flag is set in the FLASH_SR register (meaning that the programming + operation has succeed), and clear it by software. */ + if (LL_FLASH_IsActiveFlag_EOP(FLASH)) + { + LL_FLASH_ClearFlag_EOP(FLASH); + } + + /* Clear the PG bit in the FLASH_CR register if there no more programming request anymore. */ + LL_FLASH_DisableProgram(FLASH); + + /* Flush the caches to be sure of the data consistency */ + LL_FLASH_FlushCaches(); + + return SUCCESS; +} + +/** + * @brief Program + * @param address specifies the address to be programmed. + * @param data specifies the data to be programmed. + * @param num specifies the data number + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Write successfully + * - ERROR: error + */ +ErrorStatus LL_FLASH_Program(uint32_t address, uint8_t data[], uint32_t num) +{ + static uint64_t DataT = 0; + uint32_t T = 0, S = 0; + uint16_t count = 0; + assert_param(!IS_LL_FLASH_WRITE_ADDR(address)); + + if (num == 0) + { + return SUCCESS; + } + + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + /* Check and clear all error programming flags due to a previous programming. If not, PGSERR is set. */ + LL_FLASH_ClearAllErrorFlag(); + + /* Set the PG bit in the Flash control register (FLASH_CR). */ + LL_FLASH_EnableProgram(FLASH); + + /* Perform the data write operation at the desired memory address, inside main memory + block or OTP area. Only double word can be programmed. */ + T = num; + while (num > 0) + { + DataT = 0; + if (num >= 8) + { + for (int i = 0; i < LL_FLASH_ALIGNMENT_MIN_SIZE; i++) + { + DataT = DataT << 8; + DataT |= data[S + 7 - i]; + } + S += LL_FLASH_ALIGNMENT_MIN_SIZE; + num -= LL_FLASH_ALIGNMENT_MIN_SIZE; + } + else + { + for (int i = 0; i < num; i++) + { + DataT = DataT << 8; + DataT |= data[T - 1 - i]; + } + num = 0; + } + + /* Program the double word */ + *(__IO uint32_t *)address = (uint32_t)DataT; + *(__IO uint32_t *)(address + 4U) = (uint32_t)(DataT >> 32); + + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* Check that EOP flag is set in the FLASH_SR register (meaning that the programming + operation has succeed), and clear it by software. */ + if (LL_FLASH_IsActiveFlag_EOP(FLASH)) + { + LL_FLASH_ClearFlag_EOP(FLASH); + } + + address += LL_FLASH_ALIGNMENT_MIN_SIZE; + } + + /* Clear the PG bit in the FLASH_CR register if there no more programming request anymore. */ + LL_FLASH_DisableProgram(FLASH); + + /* Flush the caches to be sure of the data consistency */ + LL_FLASH_FlushCaches(); + + return SUCCESS; +} + +/** + * @} + */ + +/** @addtogroup FLASH_LL_Private_Functions + * @{ + */ +/** + * @brief Fast program a row double-word (64-bit) at a specified address. + * @param address: specifies the address to be programmed. + * @param DataAddress: specifies the address where the data are stored. + * @retval None + */ +void LL_FLASH_ProgramFast(uint32_t address, uint32_t DataAddress) +{ + uint8_t row_index = (2 * LL_FLASH_ROW_SIZE); + __IO uint32_t *dest_addr = (__IO uint32_t *)address; + __IO uint32_t *src_addr = (__IO uint32_t *)DataAddress; + + /* Check the parameters */ + assert_param(IS_FLASH_MAIN_MEM_ADDRESS(address)); + + /* Set FSTPG bit */ + LL_FLASH_EnableFastProgram(FLASH); + + /* Disable interrupts to avoid any interruption during the loop */ + __disable_irq(); + + /* Program the double word of the row */ + do + { + *dest_addr = *src_addr; + dest_addr++; + src_addr++; + row_index--; + } while (row_index != 0U); + + /* Re-enable the interrupts */ + __enable_irq(); + + LL_FLASH_DisableFastProgram(FLASH); +} + +/** + * @brief Fast program a row double-word (64-bit) at a specified address. + * @param address: specifies the address to be programmed. + * @param data: specifies the data to be programmed. + * @retval None + */ +ErrorStatus LL_FLASH_Read(uint32_t address, uint8_t data[], uint32_t num) +{ + if (num == 0) + { + return SUCCESS; + } + for (uint32_t i = 0; i < num; i++) + { + data[i] = *(__IO uint8_t *)(address + i); + } + + return SUCCESS; +} + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/User/system/bsp/flash.h b/User/system/bsp/flash.h new file mode 100644 index 0000000..8051762 --- /dev/null +++ b/User/system/bsp/flash.h @@ -0,0 +1,1725 @@ +/** + * @file flash.h + * @author xxx + * @date 2024-02-07 11:49:34 + * @brief + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + * @attention + * + * ST 的官方驱动 LL 库并没有 flash 驱动。这里自己实现。 + * + * 1. 由于在 stm32l4xx_ll_system.h 中存在部分 FLASH 操作函数(ACR寄存器的处理)且不全面 + * 因此这里需要额外处理(重命名) + * + * 2. Main memory + * (1) FLASH_ACR 完成 + * (2) FLASH_PDKEYR 完成 + * (3) FLASH_KEYR 完成 + * (4) FLASH_OPTKEYR 完成 + * (5) FLASH_SR 完成 + * (6) FLASH_CR 完成 + * (7) FLASH_ECCR 完成 + * (8) FLASH_OPTR 未完成 + * (9) FLASH_PCROP1SR 未完成 + * 后续寄存器 均未完成 + * 3. Information block + * - System memory + * - OTP area + * - Option bytes + * 4. 根据 HAL 库的实现,相比于与手册的推荐流程,擦写的执行序列还有其他操作。 + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_LL_FLASH_H +#define __STM32L4xx_LL_FLASH_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx.h" + +/** @addtogroup STM32L4xx_LL_Driver + * @{ + */ + +/** @defgroup FLASH_LL FLASH + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup FLASH_LL_Private_Constants FLASH Private Constants + * @{ + */ + +/* The following values must be written consecutively to unlock the FLASH_OPTR +register allowing option byte programming/erasing operations */ +#define LL_FLASH_OPT_KEY1 ((uint32_t)0x08192A3B) +#define LL_FLASH_OPT_KEY2 ((uint32_t)0x4C5D6E7F) + +/* The following values must be written consecutively to unlock the FLASH_CR +register allowing flash programming/erasing operations */ +#define LL_FLASH_KEY1 ((uint32_t)0x45670123) +#define LL_FLASH_KEY2 ((uint32_t)0xCDEF89AB) + +/* The following values must be written consecutively to unlock the RUN_PD bit in +FLASH_ACR */ +#define LL_FLASH_PDKEY1 ((uint32_t)0x04152637) +#define LL_FLASH_PDKEY2 ((uint32_t)0xFAFBFCFD) + +/* Page size */ +#define LL_FLASH_PAGE_SIZE (2 * 1024) + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup FLASH_LL_Private_Macros FLASH Private Macros + * @{ + */ +/** + * @} + */ +/* Exported types ------------------------------------------------------------*/ +/** @defgroup FLASH_LL_ES_INIT FLASH Exported structures + * @{ + */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup FLASH_LL_Exported_Constants FLASH Exported Constants + * @{ + */ + +/** @defgroup FLASH_LL_EC_BANK bank + * @{ + */ +#define LL_FLASH_BANK1 0 /*!< bank 1 */ +#define LL_FLASH_BANK2 1 /*!< bank 2 */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_ALIGNMENT alignment + * @{ + */ +#define LL_FLASH_ALIGNMENT_MIN_SIZE 8 /*!< the min alignment size */ +#define LL_FLASH_ROW_SIZE 32 /* row (32 double word) */ +#define LL_FLASH_BANK1_PAGE_NUM 256 /* */ +#define LL_FLASH_BANK2_PAGE_NUM 256 /* */ + +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_FLASH_ReadReg function. + * @{ + */ +#define LL_FLASH_SR_BSY FLASH_SR_BSY /*!< Busy flag */ +#define LL_FLASH_SR_OPTVERR FLASH_SR_OPTVERR /*!< Option validity error flag */ +#define LL_FLASH_SR_RDERR FLASH_SR_RDERR /*!< PCROP read error flag */ +#define LL_FLASH_SR_FASTERR FLASH_SR_FASTERR /*!< Fast programming error flag */ +#define LL_FLASH_SR_MISERR FLASH_SR_MISERR /*!< Fast programming data miss error flag */ +#define LL_FLASH_SR_PGSERR FLASH_SR_PGSERR /*!< Programming sequence error flag */ +#define LL_FLASH_SR_SIZERR FLASH_SR_SIZERR /*!< Size error flag */ +#define LL_FLASH_SR_PGAERR FLASH_SR_PGAERR /*!< Programming alignment error flag */ +#define LL_FLASH_SR_WRPERR FLASH_SR_WRPERR /*!< Write protection error flag */ +#define LL_FLASH_SR_PROGERR FLASH_SR_PROGERR /*!< Programming error flag */ +#define LL_FLASH_SR_OPERR FLASH_SR_OPERR /*!< Operation error flag */ +#define LL_FLASH_SR_EOP FLASH_SR_EOP /*!< End of operation flag */ +/* */ +#define LL_FLASH_ECCR_DETECTION FLASH_ECCR_ECCD /*!< ECC detection */ +#define LL_FLASH_ECCR_CORRECTION FLASH_ECCR_ECCC /*!< ECC correction */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_FLASH_ReadReg and LL_FLASH_WriteReg functions + * @{ + */ +#define LL_FLASH_CR_RDERRIE FLASH_CR_RDERRIE /*!< PCROP read error interrupt enable */ +#define LL_FLASH_CR_ERRIE FLASH_CR_ERRIE /*!< Error interrupt enable */ +#define LL_FLASH_CR_EOPIE FLASH_CR_EOPIE /*!< End of operation interrupt enable */ +#define LL_FLASH_CR_ECCIE FLASH_ECCR_ECCIE /*!< ECC correction interrupt enable */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_Latency Flash Latency + * @{ + */ +#define LL_FLASH_LATENCY_0WS FLASH_ACR_LATENCY_0WS /*!< FLASH Zero Latency cycle */ +#define LL_FLASH_LATENCY_1WS FLASH_ACR_LATENCY_1WS /*!< FLASH One Latency cycle */ +#define LL_FLASH_LATENCY_2WS FLASH_ACR_LATENCY_2WS /*!< FLASH Two Latency cycles */ +#define LL_FLASH_LATENCY_3WS FLASH_ACR_LATENCY_3WS /*!< FLASH Three Latency cycles */ +#define LL_FLASH_LATENCY_4WS FLASH_ACR_LATENCY_4WS /*!< FLASH Four Latency cycles */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_PREFETCH Prefetch + * @{ + */ +#define LL_FLASH_PREFETCH_DISABLE 0x00000000U /*!< Prefetch disabled */ +#define LL_FLASH_PREFETCH_ENABLE FLASH_ACR_PRFTEN /*!< Prefetch enabled */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_INSTRUCTION_CACHE Instruction cache + * @{ + */ +#define LL_FLASH_INSTRUCTION_CACHE_DISABLE 0x00000000U /*!< Instruction cache disabled */ +#define LL_FLASH_INSTRUCTION_CACHE_ENABLE FLASH_ACR_ICEN /*!< Instruction cache enabled */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_DATA_CACHE data cache + * @{ + */ +#define LL_FLASH_DATA_CACHE_DISABLE 0x00000000U /*!< data cache disabled */ +#define LL_FLASH_DATA_CACHE_ENABLE FLASH_ACR_DCEN /*!< data cache enabled */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_RUN_PD_MODE Flash Power-down mode during Run or Low-power run mode + * @{ + */ +#define LL_FLASH_RUN_PD_MODE_IDLE 0x00000000U /*!< Flash in Idle mode */ +#define LL_FLASH_RUN_PD_MODE_PD FLASH_ACR_RUN_PD /*!< Flash in Power-down mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_SLEEP_PD_MODE Flash Power-down mode during Sleep or Low-power sleep mode + * @{ + */ +#define LL_FLASH_SLEEP_PD_MODE_IDLE 0x00000000U /*!< Flash in Idle mode during Sleep and Low-power sleep modes */ +#define LL_FLASH_SLEEP_PD_MODE_PD FLASH_ACR_SLEEP_PD /*!< Flash in Power-down mode during Sleep and Low-power sleep modes */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_PG Programming + * @{ + */ +#define LL_FLASH_PROGRAMMING_DISABLE 0x00000000U /*!< Flash programming disabled */ +#define LL_FLASH_PROGRAMMING_ENABLE FLASH_CR_PG /*!< Flash programming enabled */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_PER Programming + * @{ + */ +#define LL_FLASH_PAGE_ERASE_DISABLE 0x00000000U /*!< page erase disabled */ +#define LL_FLASH_PAGE_ERASE_ENABLE FLASH_CR_PER /*!< page erase enabled */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_OBL_LAUNCH Force the option byte loading + * @{ + */ +#define LL_FLASH_OB_LAUNCH_COMPLETE 0x00000000U /*!< Option byte loading complete */ +#define LL_FLASH_OB_LAUNCH_REQUESTED FLASH_CR_OBL_LAUNCH /*!< Option byte loading requested */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_Read_Protection FLASH Option Bytes Read Protection + * @{ + */ +#define LL_FLASH_OB_RDP_LEVEL_0 ((uint32_t)0xAA) +#define LL_FLASH_OB_RDP_LEVEL_1 ((uint32_t)0xBB) +#define LL_FLASH_OB_RDP_LEVEL_2 ((uint32_t)0xCC) /*!< Warning: When enabling read protection level 2 it's no more possible to go back to level 1 or 0 */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_BOR_LEVEL FLASH Option Bytes BOR Level + * @{ + */ +#define LL_FLASH_OB_BOR_LEVEL_0 ((uint32_t)FLASH_OPTR_BOR_LEV_0) /*!< Reset level threshold is around 1.7V */ +#define LL_FLASH_OB_BOR_LEVEL_1 ((uint32_t)FLASH_OPTR_BOR_LEV_1) /*!< Reset level threshold is around 2.0V */ +#define LL_FLASH_OB_BOR_LEVEL_2 ((uint32_t)FLASH_OPTR_BOR_LEV_2) /*!< Reset level threshold is around 2.2V */ +#define LL_FLASH_OB_BOR_LEVEL_3 ((uint32_t)FLASH_OPTR_BOR_LEV_3) /*!< Reset level threshold is around 2.5V */ +#define LL_FLASH_OB_BOR_LEVEL_4 ((uint32_t)FLASH_OPTR_BOR_LEV_4) /*!< Reset level threshold is around 2.8V */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nRST_STOP FLASH Option Bytes Reset On Stop + * @{ + */ +#define LL_FLASH_OB_STOP_RST ((uint32_t)0x0000) /*!< Reset generated when entering the stop mode */ +#define LL_FLASH_OB_STOP_NORST ((uint32_t)FLASH_OPTR_nRST_STOP) /*!< No reset generated when entering the stop mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nRST_STANDBY FLASH Option Bytes Reset On Standby + * @{ + */ +#define LL_FLASH_OB_STANDBY_RST ((uint32_t)0x0000) /*!< Reset generated when entering the standby mode */ +#define LL_FLASH_OB_STANDBY_NORST ((uint32_t)FLASH_OPTR_nRST_STDBY) /*!< No reset generated when entering the standby mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nRST_SHUTDOWN FLASH Option Bytes Reset On Shutdown + * @{ + */ +#define LL_FLASH_OB_SHUTDOWN_RST ((uint32_t)0x0000) /*!< Reset generated when entering the shutdown mode */ +#define LL_FLASH_OB_SHUTDOWN_NORST ((uint32_t)FLASH_OPTR_nRST_SHDW) /*!< No reset generated when entering the shutdown mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_IWDG_SW FLASH Option Bytes IWDG Type + * @{ + */ +#define LL_FLASH_OB_IWDG_HW ((uint32_t)0x00000) /*!< Hardware independent watchdog */ +#define LL_FLASH_OB_IWDG_SW ((uint32_t)FLASH_OPTR_IWDG_SW) /*!< Software independent watchdog */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_IWDG_STOP FLASH Option Bytes IWDG Mode On Stop + * @{ + */ +#define LL_FLASH_OB_IWDG_STOP_FREEZE ((uint32_t)0x00000) /*!< Independent watchdog counter is frozen in Stop mode */ +#define LL_FLASH_OB_IWDG_STOP_RUN ((uint32_t)FLASH_OPTR_IWDG_STOP) /*!< Independent watchdog counter is running in Stop mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_IWDG_STANDBY FLASH Option Bytes IWDG Mode On Standby + * @{ + */ +#define LL_FLASH_OB_IWDG_STDBY_FREEZE ((uint32_t)0x00000) /*!< Independent watchdog counter is frozen in Standby mode */ +#define LL_FLASH_OB_IWDG_STDBY_RUN ((uint32_t)FLASH_OPTR_IWDG_STDBY) /*!< Independent watchdog counter is running in Standby mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_WWDG_SW FLASH Option Bytes WWDG Type + * @{ + */ +#define LL_FLASH_OB_WWDG_HW ((uint32_t)0x00000) /*!< Hardware window watchdog */ +#define LL_FLASH_OB_WWDG_SW ((uint32_t)FLASH_OPTR_WWDG_SW) /*!< Software window watchdog */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_BFB2 FLASH Option Bytes BFB2 Mode + * @{ + */ +#define LL_FLASH_OB_BFB2_DISABLE ((uint32_t)0x000000) /*!< Dual-bank boot disable */ +#define LL_FLASH_OB_BFB2_ENABLE ((uint32_t)FLASH_OPTR_BFB2) /*!< Dual-bank boot enable */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_DUALBANK FLASH Option Bytes Dual-bank Type + * @{ + */ +#define LL_FLASH_OB_DUALBANK_SINGLE ((uint32_t)0x000000) /*!< 256 KB/512 KB Single-bank Flash */ +#define LL_FLASH_OB_DUALBANK_DUAL ((uint32_t)FLASH_OPTR_DUALBANK) /*!< 256 KB/512 KB Dual-bank Flash */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nBOOT1 FLASH Option Bytes User BOOT1 Type + * @{ + */ +#define LL_FLASH_OB_BOOT1_SRAM ((uint32_t)0x000000) /*!< Embedded SRAM1 is selected as boot space (if BOOT0=1) */ +#define LL_FLASH_OB_BOOT1_SYSTEM ((uint32_t)FLASH_OPTR_nBOOT1) /*!< System memory is selected as boot space (if BOOT0=1) */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_SRAM2_PE FLASH Option Bytes User SRAM2 Parity Check Type + * @{ + */ +#define LL_FLASH_OB_SRAM2_PARITY_ENABLE ((uint32_t)0x0000000) /*!< SRAM2 parity check enable */ +#define LL_FLASH_OB_SRAM2_PARITY_DISABLE ((uint32_t)FLASH_OPTR_SRAM2_PE) /*!< SRAM2 parity check disable */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_SRAM2_RST FLASH Option Bytes User SRAM2 Erase On Reset Type + * @{ + */ +#define LL_FLASH_OB_SRAM2_RST_ERASE ((uint32_t)0x0000000) /*!< SRAM2 erased when a system reset occurs */ +#define LL_FLASH_OB_SRAM2_RST_NOT_ERASE ((uint32_t)FLASH_OPTR_SRAM2_RST) /*!< SRAM2 is not erased when a system reset occurs */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nSWBOOT0 FLASH Option Bytes User Software BOOT0 + * @{ + */ +#define LL_FLASH_OB_BOOT0_FROM_OB ((uint32_t)0x0000000) /*!< BOOT0 taken from the option bit nBOOT0 */ +#define LL_FLASH_OB_BOOT0_FROM_PIN ((uint32_t)FLASH_OPTR_nSWBOOT0) /*!< BOOT0 taken from PH3/BOOT0 pin */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nBOOT0 FLASH Option Bytes User nBOOT0 option bit + * @{ + */ +#define LL_FLASH_OB_BOOT0_RESET ((uint32_t)0x0000000) /*!< nBOOT0 = 0 */ +#define LL_FLASH_OB_BOOT0_SET ((uint32_t)FLASH_OPTR_nBOOT0) /*!< nBOOT0 = 1 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup CRS_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in FLASH register + * @param __INSTANCE__ FLASH Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_FLASH_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in FLASH register + * @param __INSTANCE__ FLASH Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_FLASH_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) + /** + * @} + */ + + /* Exported functions --------------------------------------------------------*/ + /** @defgroup FLASH_LL_Exported_Functions FLASH Exported Functions + * @{ + */ + + /** @defgroup FLASH_LL_EF_Configuration Configuration + * @{ + */ + /** + * @brief Sets the code latency value + * @note When changing the CPU frequency, the following software sequences must be applied in + * order to tune the number of wait states needed to access the Flash memory + * @rmtoll ACR LATENCY LL_FLASH_SetLatency + * @param FLASHx Flash instance + * @param FLASH_Latency This parameter can be one of the following values: + * @arg @ref LL_FLASH_LATENCY_0WS + * @arg @ref LL_FLASH_LATENCY_1WS + * @arg @ref LL_FLASH_LATENCY_2WS + * @arg @ref LL_FLASH_LATENCY_3WS + * @arg @ref LL_FLASH_LATENCY_4WS + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ZCS_SetLatency(FLASH_TypeDef *FLASHx, uint32_t FLASH_Latency) + { + MODIFY_REG(FLASHx->ACR, FLASH_ACR_LATENCY, FLASH_Latency); + } + + /** + * @brief Sets the code latency value + * @rmtoll ACR LATENCY LL_FLASH_GetLatency + * @param FLASHx Flash instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_LATENCY_0WS + * @arg @ref LL_FLASH_LATENCY_1WS + * @arg @ref LL_FLASH_LATENCY_2WS + * @arg @ref LL_FLASH_LATENCY_3WS + * @arg @ref LL_FLASH_LATENCY_4WS + */ + __STATIC_INLINE uint32_t LL_FLASH_ZCS_GetLatency(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->ACR, FLASH_ACR_LATENCY)); + } + + /** + * @brief Enable FLASH Prefetch + * @rmtoll ACR PRFTEN LL_FLASH_EnablePrefetch + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ZCS_EnablePrefetch(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ACR, FLASH_ACR_PRFTEN); + } + + /** + * @brief Disable FLASH Prefetch + * @rmtoll ACR PRFTEN LL_FLASH_DisablePrefetch + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ZCS_DisablePrefetch(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->ACR, FLASH_ACR_PRFTEN); + } + + /** + * @brief Indicates whether the FLASH Prefetch is enabled. + * @rmtoll ACR PRFTEN LL_FLASH_IsEnabledPrefetch + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledPrefetch(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ACR, FLASH_ACR_PRFTEN) == (FLASH_ACR_PRFTEN)) ? 1UL : 0UL); + } + + /** + * @brief Enable FLASH Instruction cache + * @rmtoll ACR ICEN LL_FLASH_EnableInstructionCache + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableInstructionCache(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ACR, FLASH_ACR_ICEN); + } + + /** + * @brief Disable FLASH Instruction cache + * @rmtoll ACR ICEN LL_FLASH_DisableInstructionCache + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableInstructionCache(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->ACR, FLASH_ACR_ICEN); + } + + /** + * @brief Indicates whether the FLASH Instruction cache is enabled. + * @rmtoll ACR ICEN LL_FLASH_IsEnabledInstructionCache + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledInstructionCache(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ACR, FLASH_ACR_ICEN) == (FLASH_ACR_ICEN)) ? 1UL : 0UL); + } + + /** + * @brief Enable FLASH data cache + * @rmtoll ACR DCEN LL_FLASH_EnableDataCache + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ZCS_EnableDataCache(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ACR, FLASH_ACR_DCEN); + } + + /** + * @brief Disable FLASH data cache + * @rmtoll ACR DCEN LL_FLASH_DisableDataCache + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ZCS_DisableDataCache(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->ACR, FLASH_ACR_DCEN); + } + + /** + * @brief Indicates whether the FLASH data cache is enabled. + * @rmtoll ACR DCEN LL_FLASH_IsEnabledDataCache + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledDataCache(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ACR, FLASH_ACR_DCEN) == (FLASH_ACR_DCEN)) ? 1UL : 0UL); + } + + /** + * @brief Reset FLASH Instruction cache + * @note This bit can be written only when the instruction cache is disabled. + * @rmtoll ACR ICRST LL_FLASH_InstructionCacheReset + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_InstructionCacheReset(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ACR, FLASH_ACR_ICRST); + CLEAR_BIT(FLASHx->ACR, FLASH_ACR_ICRST); + } + + /** + * @brief Reset FLASH data cache + * @note This bit can be written only when the data cache is disabled. + * @rmtoll ACR DCRST LL_FLASH_DataCacheReset + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DataCacheReset(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ACR, FLASH_ACR_DCRST); + CLEAR_BIT(FLASHx->ACR, FLASH_ACR_DCRST); + } + + /** + * @brief Set Flash Power-down mode during Run or Low-power run mode + * @note This bit is write-protected with FLASH_PDKEYR. Call LL_FLASH_UnlockRunPowerDownMode before using this api + * @note The flash memory can be put in power-down mode only when the code is executed from RAM. + * @note The Flash must not be accessed when RUN_PD is set. + * @note he flash must not be put in power-down while a program or an erase operation is on-going. + * @rmtoll ACR RUN_PD LL_FLASH_SetRunPowerDownMode + * @param FLASHx FLASH Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_FLASH_RUN_PD_MODE_IDLE + * @arg @ref LL_FLASH_RUN_PD_MODE_PD + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetRunPowerDownMode(FLASH_TypeDef *FLASHx, uint32_t Mode) + { + MODIFY_REG(FLASHx->ACR, FLASH_ACR_RUN_PD, Mode); + } + + /** + * @brief Get Flash Power-down mode during Run or Low-power run mode + * @note This bit is write-protected with FLASH_PDKEYR. Call LL_FLASH_UnlockRunPowerDownMode before using this api + * @note The flash memory can be put in power-down mode only when the code is executed from RAM. + * @note The Flash must not be accessed when RUN_PD is set. + * @note he flash must not be put in power-down while a program or an erase operation is on-going. + * @rmtoll ACR RUN_PD LL_FLASH_GetRunPowerDownMode + * @param FLASHx FLASH Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_RUN_PD_MODE_IDLE + * @arg @ref LL_FLASH_RUN_PD_MODE_PD + */ + __STATIC_INLINE uint32_t LL_FLASH_GetRunPowerDownMode(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->ACR, FLASH_ACR_RUN_PD)); + } + + /** + * @brief Set Flash Power-down mode during Sleep or Low-power sleep mode + * @note The flash must not be put in power-down while a program or an erase operation is on-going. + * @rmtoll ACR SLEEP_PD LL_FLASH_SetSleepPowerDownMode + * @param FLASHx FLASH Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_FLASH_SLEEP_PD_MODE_IDLE + * @arg @ref LL_FLASH_SLEEP_PD_MODE_PD + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetSleepPowerDownMode(FLASH_TypeDef *FLASHx, uint32_t Mode) + { + MODIFY_REG(FLASHx->ACR, FLASH_ACR_SLEEP_PD, Mode); + } + + /** + * @brief Get Flash Power-down mode during Sleep or Low-power sleep mode + * @rmtoll ACR SLEEP_PD LL_FLASH_SetSleepPowerDownMode + * @param FLASHx FLASH Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_SLEEP_PD_MODE_IDLE + * @arg @ref LL_FLASH_SLEEP_PD_MODE_PD + */ + __STATIC_INLINE uint32_t LL_FLASH_GetSleepPowerDownMode(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->ACR, FLASH_ACR_SLEEP_PD)); + } + + /** + * @brief Unlock Power-down in Run mode + * @rmtoll PDKEYR LL_FLASH_SetSleepPowerDownMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_UnlockRunPowerDownMode(FLASH_TypeDef *FLASHx) + { + WRITE_REG(FLASHx->PDKEYR, LL_FLASH_PDKEY1); + WRITE_REG(FLASHx->PDKEYR, LL_FLASH_PDKEY2); + } + + /** + * @brief Sets Read protection level + * @rmtoll OPTR RDP LL_FLASH_SetReaProtectionLevel + * @param FLASHx Flash instance + * @param FLASH_Latency This parameter can be one of the following values: + * @arg @ref LL_FLASH_OB_RDP_LEVEL_0 + * @arg @ref LL_FLASH_OB_RDP_LEVEL_1 + * @arg @ref LL_FLASH_OB_RDP_LEVEL_2 + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetReaProtectionLevel(FLASH_TypeDef *FLASHx, uint32_t Level) + { + MODIFY_REG(FLASHx->ACR, FLASH_OPTR_RDP, Level); + } + + /** + * @brief Sets Read protection level + * @rmtoll OPTR RDP LL_FLASH_GetReaProtectionLevel + * @param FLASHx Flash instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_OB_RDP_LEVEL_0 + * @arg @ref LL_FLASH_OB_RDP_LEVEL_1 + * @arg @ref LL_FLASH_OB_RDP_LEVEL_2 + */ + __STATIC_INLINE uint32_t LL_FLASH_GetReaProtectionLevel(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->OPTR, FLASH_OPTR_RDP) >> FLASH_OPTR_RDP_Pos); + } + + /** + * @brief Sets BOR level + * @rmtoll OPTR BOR_LEV LL_FLASH_SetBORLevel + * @param FLASHx Flash instance + * @param FLASH_Latency This parameter can be one of the following values: + * @arg @ref LL_FLASH_OB_BOR_LEVEL_0 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_1 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_2 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_3 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_4 + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetBORLevel(FLASH_TypeDef *FLASHx, uint32_t Level) + { + MODIFY_REG(FLASHx->OPTR, FLASH_OPTR_BOR_LEV, Level); + } + + /** + * @brief Sets BOR level + * @rmtoll OPTR BOR_LEV LL_FLASH_GetBORLevel + * @param FLASHx Flash instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_OB_BOR_LEVEL_0 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_1 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_2 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_3 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_4 + */ + __STATIC_INLINE uint32_t LL_FLASH_GetBORLevel(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->OPTR, FLASH_OPTR_BOR_LEV) >> FLASH_OPTR_BOR_LEV_Pos); + } + + /** + * @brief Enable Reset generated when entering the Stop mode + * @rmtoll OPTR nRST_STOP LL_FLASH_EnableResetStopMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableResetStopMode(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STOP); + } + + /** + * @brief Disable Reset generated when entering the Stop mode + * @rmtoll OPTR nRST_STOP LL_FLASH_DisableResetStopMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableResetStopMode(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STOP); + } + + /** + * @brief Indicates whether Reset generated when entering the Stop mode is enabled. + * @rmtoll OPTR nRST_STOP LL_FLASH_IsEnabledResetStopMode + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledResetStopMode(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STOP) == (FLASH_OPTR_nRST_STOP)) ? 1UL : 0UL); + } + + /** + * @brief Enable Reset generated when entering the Standby mode + * @rmtoll OPTR nRST_STOP LL_FLASH_EnableResetStandbyMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableResetStandbyMode(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STDBY); + } + + /** + * @brief Disable Reset generated when entering the Standby mode + * @rmtoll OPTR nRST_STOP LL_FLASH_DisableResetStandbyMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableResetStandbyMode(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STDBY); + } + + /** + * @brief Indicates whether Reset generated when entering the Standby mode is enabled. + * @rmtoll OPTR nRST_STOP LL_FLASH_IsEnabledResetStandbyMode + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledResetStandbyMode(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STDBY) == (FLASH_OPTR_nRST_STDBY)) ? 1UL : 0UL); + } + + /** + * @brief Enable Reset generated when entering the Shutdown mode + * @rmtoll OPTR nRST_STOP LL_FLASH_EnableResetShutdownMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableResetShutdownMode(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_SHDW); + } + + /** + * @brief Disable Reset generated when entering the Shutdown mode + * @rmtoll OPTR nRST_STOP LL_FLASH_DisableResetShutdownMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableResetShutdownMode(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_SHDW); + } + + /** + * @brief Indicates whether Reset generated when entering the Shutdown mode is enabled. + * @rmtoll OPTR nRST_STOP LL_FLASH_IsEnabledResetShutdownMode + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledResetShutdownMode(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_SHDW) == (FLASH_OPTR_nRST_SHDW)) ? 1UL : 0UL); + } + + /** + * @} + */ + + /** @defgroup FLASH_LL_EF_Programming Programming + * @{ + */ + /** + * @brief Unlocks the FLASH control register access + * @param FLASHx Flash instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_Unlock(FLASH_TypeDef *FLASHx) + { + WRITE_REG(FLASHx->KEYR, LL_FLASH_KEY1); + WRITE_REG(FLASHx->KEYR, LL_FLASH_KEY2); + } + + /** + * @brief Locks the FLASH control register access + * @rmtoll CR LOCK LL_FLASH_Lock + * @param FLASHx Flash instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_Lock(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_LOCK); + } + + /** + * @brief Unlocks the FLASH Option control register access + * @param FLASHx Flash instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_OB_Unlock(FLASH_TypeDef *FLASHx) + { + WRITE_REG(FLASHx->OPTKEYR, LL_FLASH_OPT_KEY1); + WRITE_REG(FLASHx->OPTKEYR, LL_FLASH_OPT_KEY2); + } + + /** + * @brief Locks the FLASH Option control register access + * @rmtoll CR OPTLOCK LL_FLASH_OB_Lock + * @param FLASHx Flash instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_OB_Lock(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_OPTLOCK); + } + + /** + * @brief Getthe option byte loading + * @rmtoll CR OBL_LAUNCH LL_FLASH_OB_GetLaunch + * @param FLASHx FLASH Instance + * @retval This parameter can be one of the following values: + * @arg @ref LL_FLASH_OB_LAUNCH_COMPLETE + * @arg @ref LL_FLASH_OB_LAUNCH_REQUESTED + */ + __STATIC_INLINE uint32_t LL_FLASH_OB_GetLaunch(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->CR, FLASH_CR_OBL_LAUNCH) >> FLASH_CR_OBL_LAUNCH_Pos); + } + + /** + * @brief Force the option byte loading + * @note When set to 1, this bit forces the option byte reloading. + * This bit is cleared only when the option byte loading is complete. + * @note It cannot be written if OPTLOCK is set. + * @rmtoll CR OBL_LAUNCH FLASH_OB_Launch + * @param FLASHx Flash instance + * @retval None + */ + __STATIC_INLINE void FLASH_OB_Launch(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_OBL_LAUNCH); + } + + /** + * @brief Enable FLASH Fast programming + * @rmtoll CR FSTPG LL_FLASH_EnableFastProgram + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableFastProgram(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_FSTPG); + } + + /** + * @brief Disable FLASH Fast programming + * @rmtoll CR FSTPG LL_FLASH_DisableFastProgram + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableFastProgram(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_FSTPG); + } + + /** + * @brief Indicates whether the FLASH Fast programming is enabled. + * @rmtoll CR FSTPG LL_FLASH_IsEnabledFastProgram + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledFastProgram(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_FSTPG) == (FLASH_CR_FSTPG)) ? 1UL : 0UL); + } + + /** + * @brief Enable FLASH Program + * @rmtoll CR PG LL_FLASH_EnableProgram + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableProgram(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_PG); + } + + /** + * @brief Disable FLASH Program + * @rmtoll CR PG LL_FLASH_DisableProgram + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableProgram(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_PG); + } + + /** + * @brief Indicates whether the FLASH Program is enabled. + * @rmtoll CR PRFTEN LL_FLASH_IsEnabledProgram + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledProgram(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_PG) == (FLASH_CR_PG)) ? 1UL : 0UL); + } + + /** + * @brief Set Page number MSB (bank selection) + * @rmtoll CR BKER LL_FLASH_SetErasePageBank + * @param FLASHx FLASH Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_FLASH_BANK1 + * @arg @ref LL_FLASH_BANK2 + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetErasePageBank(FLASH_TypeDef *FLASHx, uint32_t bank) + { + MODIFY_REG(FLASHx->CR, FLASH_CR_BKER, (bank << FLASH_CR_BKER_Pos)); + } + + /** + * @brief Get Page number MSB (bank selection) + * @rmtoll CR BKER LL_FLASH_GetErasePageBank + * @param FLASHx FLASH Instance + * @retval This parameter can be one of the following values: + * @arg @ref LL_FLASH_BANK1 + * @arg @ref LL_FLASH_BANK2 + */ + __STATIC_INLINE uint32_t LL_FLASH_GetErasePageBank(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->CR, FLASH_CR_BKER) >> FLASH_CR_BKER_Pos); + } + + /** + * @brief Set Page number selection + * @rmtoll CR PNB LL_FLASH_SetErasePageNo + * @param FLASHx FLASH Instance + * @param No This parameter can be one of the following values: + * @arg @ref 0 ~ 255 + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetErasePageNo(FLASH_TypeDef *FLASHx, uint32_t No) + { + MODIFY_REG(FLASHx->CR, FLASH_CR_PNB, ((No & 0xFFU) << FLASH_CR_PNB_Pos)); + } + + /** + * @brief Get Page number selection + * @rmtoll CR PNB LL_FLASH_SetErasePageNo + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE uint32_t LL_FLASH_GetErasePageNo(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->CR, FLASH_CR_PNB) >> FLASH_CR_PNB_Pos); + } + + /** + * @brief Clear Page number selection + * @rmtoll CR PNB LL_FLASH_ClearErasePageNo + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearErasePageNo(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_PNB); + } + + /** + * @brief Enable Page Erase + * @rmtoll CR PER LL_FLASH_EnablePageErase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnablePageErase(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_PER); + } + + /** + * @brief Disable Page Erase + * @rmtoll CR PER LL_FLASH_DisablePageErase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisablePageErase(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_PER); + } + + /** + * @brief Indicates whether the Page Erase is enabled. + * @rmtoll CR PER LL_FLASH_IsEnabledPageErase + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledPageErase(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_PER) == (FLASH_CR_PER)) ? 1UL : 0UL); + } + + /** + * @brief Enable Bank1 Erase + * @rmtoll CR MER1 LL_FLASH_EnableBank1Erase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableBank1Erase(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_MER1); + } + + /** + * @brief Disable FLASH Bank1Erase + * @rmtoll CR MER1 LL_FLASH_DisableBank1Erase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableBank1Erase(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_MER1); + } + + /** + * @brief Indicates whether the Bank1 Erase is enabled. + * @rmtoll CR MER1 LL_FLASH_IsEnabledBank1Erase + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledBank1Erase(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_MER1) == (FLASH_CR_MER1)) ? 1UL : 0UL); + } + + /** + * @brief Enable Bank2 Erase + * @rmtoll CR MER2 LL_FLASH_EnableBank2Erase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableBank2Erase(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_MER2); + } + + /** + * @brief Disable Bank2 Erase + * @rmtoll CR MER2 LL_FLASH_DisableBank2Erase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableBank2Erase(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_MER2); + } + + /** + * @brief Indicates whether the Bank2 Erase is enabled. + * @rmtoll CR MER2 LL_FLASH_IsEnabledBank2Erase + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledBank2Erase(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_MER2) == (FLASH_CR_MER2)) ? 1UL : 0UL); + } + + /** + * @brief Start an erase operation + * @note If MER1, MER2 and PER bits are reset and the STRT bit is set, + * an unpredictable behavior may occur without generating any error flag. + * This condition should be forbidden. + * @note This bit is set only by software, and is cleared when the BSY bit is cleared in FLASH_SR. + * @rmtoll CR STRT LL_FLASH_EraseStart + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EraseStart(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_STRT); + } + + /** + * @brief Start an options operation + * @note This bit is set only by software, and is cleared when the BSY bit is cleared in FLASH_SR. + * @rmtoll CR STRT LL_FLASH_OprationStart + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_OB_OprationStart(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_OPTSTRT); + } + + /** + * @brief Get ECC fail bank + * @note When ECCC or ECCD is set, ADDR_ECC and BK_ECC are not updated if a new ECC error + * occurs. FLASH_ECCR is updated only when ECC flags are cleared. + * @rmtoll ECCR BK_ECC LL_FLASH_ECC_GetFailBank + * @param FLASHx FLASH Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_BANK1 + * @arg @ref LL_FLASH_BANK2 + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_GetFailBank(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ECCR, FLASH_ECCR_BK_ECC) == (FLASH_ECCR_BK_ECC)) ? LL_FLASH_BANK2 : LL_FLASH_BANK1); + } + + /** + * @brief Get ECC fail addr + * @note When ECCC or ECCD is set, ADDR_ECC and BK_ECC are not updated if a new ECC error + * occurs. FLASH_ECCR is updated only when ECC flags are cleared. + * @rmtoll ECCR ADDR_ECC LL_FLASH_ECC_GetFailAddr + * @param FLASHx FLASH Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x7FFFF + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_GetFailAddr(FLASH_TypeDef *FLASHx) + { + return (uint32_t)((READ_BIT(FLASHx->ECCR, FLASH_ECCR_ADDR_ECC) == (FLASH_ECCR_ADDR_ECC)) >> FLASH_ECCR_ADDR_ECC_Pos); + } + + /** + * @} + */ + + /** @defgroup FLASH_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + /** + * @brief Get Busy flag + * @note This is set on the beginning of a Flash operation + * and reset when the operation finishes or when an error occurs. + * @rmtoll FLASH_SR BSY LL_FLASH_IsActiveFlag_BSY + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_BSY(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_BSY) == (FLASH_SR_BSY)) ? 1UL : 0UL); + } + + /** + * @brief Get Option validity error flag + * @note Set by hardware when the options read may not be the one configured by the user. + If option haven’t been properly loaded, OPTVERR is set again after each system reset. + * @rmtoll FLASH_SR OPTVERR LL_FLASH_IsActiveFlag_OPTVERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_OPTVERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_OPTVERR) == (FLASH_SR_OPTVERR)) ? 1UL : 0UL); + } + + /** + * @brief Get PCROP read error flag + * @note Set by hardware when an address to be read through the D-bus belongs to a + read protected area of the flash (PCROP protection). + @note An interrupt is generated if RDERRIE is set in FLASH_CR. + * @rmtoll FLASH_SR RDERR LL_FLASH_IsActiveFlag_RDERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_RDERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_RDERR) == (FLASH_SR_RDERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Fast programming error flag + * @note Set by hardware when a fast programming sequence (activated by FSTPG) is interrupted + * due to an error (alignment, size, write protection or data miss). + * @note The corresponding status bit (PGAERR, SIZERR, WRPERR or MISSERR) is set at the same time. + * @rmtoll FLASH_SR FASTERR LL_FLASH_IsActiveFlag_FASTERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_FASTERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_FASTERR) == (FLASH_SR_FASTERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Fast programming data miss error flag + * @note In Fast programming mode, 32 double words must be sent to flash successively, + and the new data must be sent to the flash logic control before the current data is fully programmed. + @note MISSERR is set by hardware when the new data is not present in time. + * @rmtoll FLASH_SR MISERR LL_FLASH_IsActiveFlag_MISERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_MISERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_MISERR) == (FLASH_SR_MISERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Programming sequence error flag + * @note Set by hardware when a write access to the Flash memory is performed by the code + * while PG or FSTPG have not been set previously. + * @note Set also by hardware when PROGERR, SIZERR, PGAERR, MISSERR or FASTERR is set + * due to a previous programming error. + * @rmtoll FLASH_SR PGSERR LL_FLASH_IsActiveFlag_PGSERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_PGSERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_PGSERR) == (FLASH_SR_PGSERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Size error flag + * @note Set by hardware when the size of the access is a byte or half-word + * during a program or a fast program sequence. + * @note Only double word programming is allowed (consequently: word access). + * @rmtoll FLASH_SR SIZERR LL_FLASH_IsActiveFlag_SIZERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_SIZERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_SIZERR) == (FLASH_SR_SIZERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Programming alignment error flag + * @note Set by hardware when the data to program cannot be contained + * in the same 64-bit Flash memory row in case of standard programming, + * or if there is a change of page during fast programming. + * @rmtoll FLASH_SR PGAERR LL_FLASH_IsActiveFlag_PGAERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_PGAERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_PGAERR) == (FLASH_SR_PGAERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Write protection error flag + * @note Set by hardware when an address to be erased/programmed + * belongs to a write-protected part (by WRP, PCROP or RDP level 1) of the Flash memory. + * @rmtoll FLASH_SR WRPERR LL_FLASH_IsActiveFlag_WRPERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_WRPERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_WRPERR) == (FLASH_SR_WRPERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Programming error flag + * @note Set by hardware when a double-word address to be programmed contains a value + * different from '0xFFFF FFFF' before programming, except if the data to write is '0x0000 0000'. + * @rmtoll FLASH_SR PROGERR LL_FLASH_IsActiveFlag_PROGERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_PROGERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_PROGERR) == (FLASH_SR_PROGERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Operation error flag + * @note Set by hardware when a Flash memory operation (program / erase) completes unsuccessfully. + * @note This bit is set only if error interrupts are enabled (ERRIE = 1). + * @rmtoll FLASH_SR OPERR LL_FLASH_IsActiveFlag_OPERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_OPERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_OPERR) == (FLASH_SR_OPERR)) ? 1UL : 0UL); + } + + /** + * @brief Get End of operation flag + * @note Set by hardware when one or more Flash memory operation (programming / erase) has been completed successfully. + * @note This bit is set only if the end of operation interrupts are enabled (EOPIE = 1). + * @rmtoll FLASH_SR EOP LL_FLASH_IsActiveFlag_EOP + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_EOP(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_EOP) == (FLASH_SR_EOP)) ? 1UL : 0UL); + } + + /** + * @brief Clear Internal OPTVERR flag + * @rmtoll ISR IOPTVERR LL_FLASH_ClearFlag_OPTVERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_OPTVERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_OPTVERR); + } + + /** + * @brief Clear Internal RDERR flag + * @rmtoll ISR IRDERR LL_FLASH_ClearFlag_RDERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_RDERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_RDERR); + } + + /** + * @brief Clear Internal FASTERR flag + * @rmtoll ISR IFASTERR LL_FLASH_ClearFlag_FASTERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_FASTERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_FASTERR); + } + + /** + * @brief Clear Internal MISERR flag + * @rmtoll ISR IMISERR LL_FLASH_ClearFlag_MISERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_MISERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_MISERR); + } + + /** + * @brief Clear Internal PGSERR flag + * @rmtoll ISR IPGSERR LL_FLASH_ClearFlag_PGSERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_PGSERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_PGSERR); + } + + /** + * @brief Clear Internal SIZERR flag + * @rmtoll ISR ISIZERR LL_FLASH_ClearFlag_SIZERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_SIZERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_SIZERR); + } + + /** + * @brief Clear Internal PGAERR flag + * @rmtoll ISR IPGAERR LL_FLASH_ClearFlag_PGAERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_PGAERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_PGAERR); + } + + /** + * @brief Clear Internal WRPERR flag + * @rmtoll ISR IWRPERR LL_FLASH_ClearFlag_WRPERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_WRPERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_WRPERR); + } + + /** + * @brief Clear Internal PROGERR flag + * @rmtoll ISR IPROGERR LL_FLASH_ClearFlag_PROGERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_PROGERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_PROGERR); + } + + /** + * @brief Clear Internal OPERR flag + * @rmtoll ISR IOPERR LL_FLASH_ClearFlag_OPERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_OPERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_OPERR); + } + + /** + * @brief Clear Internal EOP flag + * @rmtoll ISR IEOP LL_FLASH_ClearFlag_EOP + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_EOP(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_EOP); + } + + /** + * @brief Get Internal ECC ECCD flag + * @note Set by hardware when two ECC errors have been detected. When this bit is set, a NMI is generated + * @rmtoll ECCR ECCD LL_FLASH_ECC_IsActiveFlag_ECCD + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_IsActiveFlag_ECCD(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ECCR, FLASH_ECCR_ECCD) == (FLASH_ECCR_ECCD)) ? 1UL : 0UL); + } + + /** + * @brief Get Internal ECC ECCC flag + * @note Set by hardware when one ECC error has been detected and corrected. + * An interrupt is generated if ECCIE is set. + * @rmtoll ECCR ECCC LL_FLASH_ECC_IsActiveFlag_ECCC + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_IsActiveFlag_ECCC(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ECCR, FLASH_ECCR_ECCC) == (FLASH_ECCR_ECCC)) ? 1UL : 0UL); + } + + /** + * @brief Clear Internal ECCD flag + * @rmtoll ECCR ECCD LL_FLASH_ECC_ClearFlag_ECCD + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ECC_ClearFlag_ECCD(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ECCR, FLASH_ECCR_ECCD); + } + + /** + * @brief Clear Internal ECCC flag + * @rmtoll ECCR ECCC LL_FLASH_ECC_ClearFlag_ECCC + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ECC_ClearFlag_ECCC(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ECCR, FLASH_ECCR_ECCC); + } + + /** + * @brief Get Internal System Flash ECC fail flag + * @note This bit indicates that the ECC error correction or double ECC error detection + * is located in the System Flash. + * @rmtoll ECCR SYSF_ECC LL_FLASH_ECC_IsActiveFlag_SYSF_ECC + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_IsActiveFlag_SYSF_ECC(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ECCR, FLASH_ECCR_SYSF_ECC) == (FLASH_ECCR_SYSF_ECC)) ? 1UL : 0UL); + } + + /** + * @} + */ + + /** @defgroup FLASH_LL_EF_IT_Management IT-Management + * @{ + */ + /** + * @brief Enable PCROP read error interrupt (RDERRIE). + * @rmtoll CR RDERRIE LL_FLASH_EnableIT_RDERRIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableIT_RDERRIE(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_RDERRIE); + } + + /** + * @brief Disable PCROP read error interrupt (RDERRIE). + * @rmtoll CR RDERRIE LL_FLASH_DisableIT_RDERRIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableIT_RDERRIE(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_RDERRIE); + } + + /** + * @brief Enable Error interrupt (ERRIE). + * @rmtoll CR ERRIE LL_FLASH_EnableIT_ERRIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableIT_ERRIE(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_ERRIE); + } + + /** + * @brief Disable Error interrupt (ERRIE). + * @rmtoll CR ERRIE LL_FLASH_DisableIT_ERRIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableIT_ERRIE(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_ERRIE); + } + + /** + * @brief Enable End of operation interrupt (EOPIE). + * @rmtoll CR EOPIE LL_FLASH_EnableIT_EOPIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableIT_EOPIE(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_EOPIE); + } + + /** + * @brief Disable End of operation interrupt (EOPIE). + * @rmtoll CR EOPIE LL_FLASH_DisableIT_EOPIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableIT_EOPIE(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_EOPIE); + } + + /** + * @brief Indicates whether the PCROP read error interrupt (RDERRIE) is enabled. + * @rmtoll CR2 RDERRIE LL_FLASH_IsEnabledIT_RDERRIE + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledIT_RDERRIE(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_RDERRIE) == (FLASH_CR_RDERRIE)) ? 1UL : 0UL); + } + + /** + * @brief Indicates whether the Error interrupt (ERRIE) is enabled. + * @rmtoll CR2 ERRIE LL_FLASH_IsEnabledIT_ERRIE + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledIT_ERRIE(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_ERRIE) == (FLASH_CR_ERRIE)) ? 1UL : 0UL); + } + + /** + * @brief Indicates whether the End of operation interrupt (EOPIE) is enabled. + * @rmtoll CR2 EOPIE LL_FLASH_IsEnabledIT_EOPIE + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledIT_EOPIE(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_EOPIE) == (FLASH_CR_EOPIE)) ? 1UL : 0UL); + } + + /** + * @brief Enable ECC correction interrupt (ECCIE). + * @rmtoll ECCR ECCIE LL_FLASH_ECC_EnableIT_ECCIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ECC_EnableIT_ECCIE(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ECCR, FLASH_ECCR_ECCIE); + } + + /** + * @brief Disable ECC correction interrupt (ECCIE). + * @rmtoll ECCR ECCIE LL_FLASH_ECC_DisableIT_ECCIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ECC_DisableIT_ECCIE(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->ECCR, FLASH_ECCR_ECCIE); + } + + /** + * @brief Indicates whether the ECC correction interrupt (ECCIE) is enabled. + * @rmtoll ECCR RDERRIE LL_FLASH_ECC_IsEnabledIT_ECCIE + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_IsEnabledIT_ECCIE(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ECCR, FLASH_ECCR_ECCIE) == (FLASH_ECCR_ECCIE)) ? 1UL : 0UL); + } + + /** + * @} + */ + + /** @defgroup SPI_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + void LL_FLASH_ClearAllErrorFlag(void); + void LL_FLASH_FlushCaches(void); + ErrorStatus LL_FLASH_ErasePage(uint32_t pageno); + ErrorStatus LL_FLASH_EraseBank(uint32_t bank); + ErrorStatus LL_FLASH_EraseChip(void); + ErrorStatus LL_FLASH_ProgramDoubleWord(uint32_t address, uint64_t data); + ErrorStatus LL_FLASH_Program(uint32_t address, uint8_t data[], uint32_t num); + ErrorStatus LL_FLASH_Read(uint32_t address, uint8_t data[], uint32_t num); + void LL_FLASH_ProgramFast(uint32_t address, uint32_t DataAddress); + + /** + * @} + */ + + /** + * @} + */ + + /** + * @} + */ + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_LL_FLASH_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/User/system/bsp/i2cs.c b/User/system/bsp/i2cs.c index a5db652..5539277 100644 --- a/User/system/bsp/i2cs.c +++ b/User/system/bsp/i2cs.c @@ -287,7 +287,7 @@ static BOOL _read_mem_dma(i2c_t *handle, uint16_t mem_address, uint16_t mem_adds { i2c_reset(handle->i2c); // xsh:重置I2C,修复一段时间后无法读写的问题 } - uint16_t count = 10000; + uint16_t count = 5000; handle->txsize = 0; handle->tx_dma_ok = FALSE; handle->rx_dma_ok = FALSE; @@ -301,7 +301,7 @@ static BOOL _read_mem_dma(i2c_t *handle, uint16_t mem_address, uint16_t mem_adds LL_DMA_EnableChannel(handle->dma, handle->dma_tx_channel); LL_I2C_HandleTransfer(handle->i2c, handle->w_address, LL_I2C_ADDRSLAVE_7BIT, handle->txsize, LL_I2C_MODE_SOFTEND, LL_I2C_GENERATE_START_WRITE); - count = 10000; + count = 5000; while (!handle->tx_dma_ok) { if (count-- == 0) @@ -311,7 +311,7 @@ static BOOL _read_mem_dma(i2c_t *handle, uint16_t mem_address, uint16_t mem_adds } } - count = 10000; + count = 5000; while (LL_I2C_IsActiveFlag_TC(handle->i2c) != 1) { if (count-- == 0) diff --git a/User/system/bsp/i2cs.h b/User/system/bsp/i2cs.h index bb1da26..4bb6613 100644 --- a/User/system/bsp/i2cs.h +++ b/User/system/bsp/i2cs.h @@ -46,8 +46,8 @@ struct I2CS uint16_t txsize; uint8_t w_address; // 7位地址 uint8_t r_address; // 7位地址 - volatile BOOL rx_dma_ok; // 接收DMA完成标志 - volatile BOOL tx_dma_ok; // 发送DMA完成标志 + __IO BOOL rx_dma_ok; // 接收DMA完成标志 + __IO BOOL tx_dma_ok; // 发送DMA完成标志 i2cs_dma_callback *dma_rx_cb; // DMA接收完成回调函数 i2cs_dma_callback *dma_tx_cb; // DMA发送完成回调函数 diff --git a/User/system/bsp/iwdgs.c b/User/system/bsp/iwdgs.c index b282470..8b4228b 100644 --- a/User/system/bsp/iwdgs.c +++ b/User/system/bsp/iwdgs.c @@ -25,8 +25,7 @@ BOOL check_watchdog_reset(void) */ void debug_freeze_watchdog(void) { - // LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_DBGMCU); - SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_IWDG_STOP); + LL_DBGMCU_APB1_GRP1_FreezePeriph(LL_DBGMCU_APB1_GRP1_IWDG_STOP); } /** @@ -36,5 +35,5 @@ void debug_freeze_watchdog(void) */ void debug_unfreeze_watchdog(void) { - CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_IWDG_STOP); + LL_DBGMCU_APB1_GRP1_UnFreezePeriph(LL_DBGMCU_APB1_GRP1_IWDG_STOP); } diff --git a/User/system/bsp/iwdgs.h b/User/system/bsp/iwdgs.h index 3fc9550..19c43ba 100644 --- a/User/system/bsp/iwdgs.h +++ b/User/system/bsp/iwdgs.h @@ -1,3 +1,10 @@ +/** + * @file iwdgs.h + * @author xxx + * @date 2023-12-27 14:44:03 + * @brief 独立看门狗 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ #ifndef __IWDGS_H__ #define __IWDGS_H__ diff --git a/User/system/bsp/spis.h b/User/system/bsp/spis.h index 29dabfe..bc9eb8f 100644 --- a/User/system/bsp/spis.h +++ b/User/system/bsp/spis.h @@ -121,8 +121,8 @@ struct SPIS DMA_TypeDef *dma; // 外部设置 uint32_t dma_rx_channel; // 外部设置 uint32_t dma_tx_channel; // 外部设置 - volatile BOOL rx_dma_ok; - volatile BOOL tx_dma_ok; + __IO BOOL rx_dma_ok; + __IO BOOL tx_dma_ok; spis_dma_callback *dma_rx_cb; // DMA接收回调函数 spis_dma_callback *dma_tx_cb; // DMA发送回调函数 }; diff --git a/User/system/bsp/uarts.h b/User/system/bsp/uarts.h index c8110ca..7b4082a 100644 --- a/User/system/bsp/uarts.h +++ b/User/system/bsp/uarts.h @@ -9,6 +9,12 @@ typedef void (*rx_interupt_cb_t)(uint8_t uart_index, uint8_t *data, uint16_t len // typedef void (*tx_complete_cb_t)(void); +typedef enum +{ + UART_OK = 0x00u, /**< The action was successful. */ + UART_ERROR = 0xFFu /**< Generic error. */ +} uart_status_e; + // typedef struct { @@ -27,7 +33,7 @@ typedef struct BOOL tx_dma_en; uint8_t *txbuf; uint16_t txsize; - volatile BOOL tx_dma_ok; // 发送DMA完成标志 + __IO BOOL tx_dma_ok; // 发送DMA完成标志 // 接收中断回调 rx_interupt_cb_t rx_interupt_cb; diff --git a/User/system/src/sys.c b/User/system/src/sys.c index 45db287..ecf6635 100644 --- a/User/system/src/sys.c +++ b/User/system/src/sys.c @@ -9,10 +9,10 @@ */ #include "sys.h" -volatile uint32_t uwTick; -volatile uint32_t scheduler_start_time; // 调度器开始时间 -volatile uint32_t scheduler_end_time; // 调度器结束时间 -volatile uint32_t scheduler_occupancy_time = 0; // 调度器占用时间 +__IO uint32_t uwTick; +__IO uint32_t scheduler_start_time; // 调度器开始时间 +__IO uint32_t scheduler_end_time; // 调度器结束时间 +__IO uint32_t scheduler_occupancy_time = 0; // 调度器占用时间 /** * @brief 设置中断向量表偏移地址 * @param baseaddr : 基址 @@ -32,7 +32,7 @@ void sys_nvic_set_vector_table(uint32_t baseaddr, uint32_t offset) */ void sys_wfi_set(void) { - __ASM volatile("wfi"); + __ASM __IO("wfi"); } /** @@ -42,7 +42,7 @@ void sys_wfi_set(void) */ void sys_intx_disable(void) { - __ASM volatile("cpsid i"); + __ASM __IO("cpsid i"); } /** @@ -52,7 +52,7 @@ void sys_intx_disable(void) */ void sys_intx_enable(void) { - __ASM volatile("cpsie i"); + __ASM __IO("cpsie i"); } /** @@ -125,7 +125,7 @@ void sys_millis_reset(void) */ uint32_t sys_to_seconds(uint32_t start_time) { - return (uwTick - start_time) / 1000; + return (sys_millis() - start_time) / 1000; } /**